return;
}
- // mark xlocks "done", indicating that we are exposing uncommitted changes
- mds->locker->set_xlocks_done(mdr);
-
MClientRequest *req = mdr->client_request;
entity_inst_t client_inst = req->get_orig_source_inst();
if (client_inst.name.is_mds())
if (tracei || tracedn)
set_trace_dist(mdr->session, reply, tracei, tracedn, snapid, snapdiri, true, mdr);
- mdr->did_early_reply = true;
-
messenger->send_message(reply, client_inst);
+
+ // mark xlocks "done", indicating that we are exposing uncommitted changes
+ mds->locker->set_xlocks_done(mdr);
+
+ mdr->did_early_reply = true;
}
/*
// start with dentry or inode?
if (!in) {
assert(dn);
- in = dn->get_linkage(client)->get_inode();
+ in = dn->get_linkage(client, mdr)->get_inode();
goto dentry;
}
if (!dn) {
dn = in->get_projected_parent_dn();
- if (dn && !dn->use_projected(client))
+ if (dn && !dn->use_projected(client, mdr))
dn = NULL;
if (!dn)
dn = in->get_parent_dn();
return 0;
}
*/
- if (!dn->get_linkage(client)->is_null()) {
+ if (!dn->get_linkage(client, mdr)->is_null()) {
// name already exists
dout(10) << "dentry " << dname << " exists in " << *dir << dendl;
if (!okexist) {
ref = mdcache->get_inode(refpath.get_ino());
else {
CDentry *dn = trace[trace.size()-1];
- bool dnp = dn->use_projected(client);
+ bool dnp = dn->use_projected(client, mdr);
CDentry::linkage_t *dnl = dnp ? dn->get_projected_linkage() : dn->get_linkage();
// if no inode (null or unattached remote), fw to dentry auth?
}
// exists?
- if (!dn || dn->get_linkage(client)->is_null()) {
+ if (!dn || dn->get_linkage(client, mdr)->is_null()) {
dout(7) << "dentry " << dname << " dne in " << *dir << dendl;
reply_request(mdr, -ENOENT);
return 0;
for (int i=0; i<(int)trace.size(); i++)
rdlocks.insert(&trace[i]->lock);
- if (dn->get_linkage(client)->is_null())
+ if (dn->get_linkage(client, mdr)->is_null())
xlocks.insert(&dn->lock); // new dn, xlock
else
rdlocks.insert(&dn->lock); // existing dn, rdlock
CDentry *dn = it->second;
it++;
- bool dnp = dn->use_projected(client);
+ bool dnp = dn->use_projected(client, mdr);
CDentry::linkage_t *dnl = dnp ? dn->get_projected_linkage() : dn->get_linkage();
if (dnl->is_null())
return;
}
- CDentry::linkage_t *dnl = dn->get_linkage(client);
+ CDentry::linkage_t *dnl = dn->get_linkage(client, mdr);
if (dnl->is_null()) {
reply_request(mdr, -ENOENT);
return;
mdcache->request_forward(mdr, dn->authority().first);
return;
}
- CDentry::linkage_t *dnl = dn->get_linkage(client);
+ CDentry::linkage_t *dnl = dn->get_linkage(client, mdr);
// dir only
CInode *diri = dnl->get_inode();
[LOCK_SYNC_LOCK] = { LOCK_LOCK, false, LOCK_LOCK, ANY, 0, 0, 0, 0, 0, 0,0,0 },
[LOCK_EXCL_LOCK] = { LOCK_LOCK, false, LOCK_LOCK, 0, 0, 0, 0, 0, 0, 0,0,0 },
- [LOCK_XLOCK] = { 0, false, LOCK_LOCK, 0, 0, 0, 0, 0, 0, 0,0,0 },
- [LOCK_LOCK_XLOCK]= { LOCK_XLOCK,false, LOCK_LOCK, 0, 0, 0, 0, 0, 0, 0,0,0 },
+ [LOCK_XLOCK] = { 0, false, LOCK_LOCK, 0, XCL, 0, 0, 0, 0, 0,0,0 },
[LOCK_XLOCKDONE] = { LOCK_SYNC, false, LOCK_LOCK, XCL, XCL, XCL, 0, XCL, XCL, 0,0,0 },
+ [LOCK_LOCK_XLOCK]= { LOCK_XLOCK,false, LOCK_LOCK, 0, 0, 0, 0, 0, 0, 0,0,0 },
[LOCK_EXCL] = { 0, true, LOCK_LOCK, 0, 0, 0, 0, 0, 0, 0,CEPH_CAP_GEXCL|CEPH_CAP_GRDCACHE,0 },
[LOCK_SYNC_EXCL] = { LOCK_EXCL, true, LOCK_LOCK, ANY, 0, 0, 0, 0, 0, 0,CEPH_CAP_GRDCACHE,0 },
[LOCK_EXCL_LOCK] = { LOCK_LOCK, false, LOCK_LOCK, 0, 0, 0, 0, 0, 0, CEPH_CAP_GRDCACHE|CEPH_CAP_GWRBUFFER,0,CEPH_CAP_GRDCACHE },
[LOCK_MIX_LOCK] = { LOCK_LOCK, false, LOCK_LOCK, AUTH, 0, 0, 0, 0, 0, 0,0,0 },
- [LOCK_XLOCK] = { 0, false, LOCK_LOCK, 0, 0, 0, 0, 0, 0, 0,0,0 },
+ [LOCK_XLOCK] = { 0, false, LOCK_LOCK, 0, XCL, 0, 0, 0, 0, 0,0,0 },
[LOCK_XLOCKDONE] = { LOCK_SYNC, false, LOCK_LOCK, XCL, XCL, XCL, 0, XCL, XCL, 0,0,0 },
[LOCK_MIX] = { 0, false, LOCK_MIX, 0, 0, FW, ANY, 0, 0, CEPH_CAP_GRD|CEPH_CAP_GWR,0,CEPH_CAP_GRD },