// store up to two sets of dn vectors, inode pointers, for request path1 and path2.
vector<CDentry*> dn[2];
+ CDentry *straydn;
CInode *in[2];
snapid_t snapid;
MDRequest() :
ref(1),
session(0), item_session_request(this),
- client_request(0), snapid(CEPH_NOSNAP), tracei(0), tracedn(0),
+ client_request(0), straydn(NULL), snapid(CEPH_NOSNAP), tracei(0), tracedn(0),
alloc_ino(0), used_prealloc_ino(0), snap_caps(0), did_early_reply(false),
slave_request(0),
internal_op(-1),
Mutation(ri),
ref(1),
session(0), item_session_request(this),
- client_request(req), snapid(CEPH_NOSNAP), tracei(0), tracedn(0),
+ client_request(req), straydn(NULL), snapid(CEPH_NOSNAP), tracei(0), tracedn(0),
alloc_ino(0), used_prealloc_ino(0), snap_caps(0), did_early_reply(false),
slave_request(0),
internal_op(-1),
Mutation(ri, by),
ref(1),
session(0), item_session_request(this),
- client_request(0), snapid(CEPH_NOSNAP), tracei(0), tracedn(0),
+ client_request(0), straydn(NULL), snapid(CEPH_NOSNAP), tracei(0), tracedn(0),
alloc_ino(0), used_prealloc_ino(0), snap_caps(0), did_early_reply(false),
slave_request(0),
internal_op(-1),
}
}
- CDentry *straydn = 0;
- if (dnl->is_primary()) {
+ // -- create stray dentry? --
+ CDentry *straydn = mdr->straydn;
+ if (dnl->is_primary() && !straydn) {
straydn = mdcache->get_or_create_stray_dentry(dnl->get_inode());
- mdr->pin(straydn); // pin it.
- dout(10) << " straydn is " << *straydn << dendl;
+ mdr->pin(straydn);
+ mdr->straydn = straydn;
}
+ if (straydn)
+ dout(10) << " straydn is " << *straydn << dendl;
+
// lock
set<SimpleLock*> rdlocks, wrlocks, xlocks;
dout(10) << " this is a link merge" << dendl;
// -- create stray dentry? --
- CDentry *straydn = 0;
- if (destdnl->is_primary() && !linkmerge) {
+ CDentry *straydn = mdr->straydn;
+ if (destdnl->is_primary() && !linkmerge && !straydn) {
straydn = mdcache->get_or_create_stray_dentry(destdnl->get_inode());
mdr->pin(straydn);
- dout(10) << "straydn is " << *straydn << dendl;
+ mdr->straydn = straydn;
}
+ if (straydn)
+ dout(10) << " straydn is " << *straydn << dendl;
// -- prepare witness list --
/*