diff options
author | Sage Weil <sage@inktank.com> | 2013-05-23 17:12:27 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-06-24 21:21:47 -0700 |
commit | c83283b26394ac032cef9c7f9feb6a146aeb3de7 (patch) | |
tree | 127d18e9fd1eaf9ad09aacd249bc6bdc282f0858 | |
parent | 3cea945f540bce66906ef79c909c809b56858b03 (diff) | |
download | ceph-c83283b26394ac032cef9c7f9feb6a146aeb3de7.tar.gz |
client: invalidate dentry leases when unlinking
In many case when we are unlinking inodes we also need to invalidate the
dentry lease, as we are not promised that the dentry is NULL. Be a bit
over-conservative here for good measure.
Signed-off-by: Sage Weil <sage@inktank.com>
-rw-r--r-- | src/client/Client.cc | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/src/client/Client.cc b/src/client/Client.cc index 58d332765de..4176fb1718d 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -665,6 +665,7 @@ Inode * Client::add_update_inode(InodeStat *st, utime_t from, MetaSession *sessi p != in->dir->dentry_map.end(); ++p) { unlink(p->second, true, true); // keep dir, keep dentry + p->second->lease_mds = -1; } if (in->dir->dentry_map.empty()) close_dir(in->dir); @@ -835,6 +836,7 @@ void Client::insert_readdir_results(MetaRequest *request, MetaSession *session, Dentry *dn = pd->second; ++pd; unlink(dn, true, true); // keep dir, dentry + dn->lease_mds = -1; } else { ++pd; } @@ -886,6 +888,7 @@ void Client::insert_readdir_results(MetaRequest *request, MetaSession *session, Dentry *dn = pd->second; ++pd; unlink(dn, true, true); // keep dir, dentry + dn->lease_mds = -1; } else ++pd; } @@ -934,12 +937,14 @@ Inode* Client::insert_trace(MetaRequest *request, MetaSession *session) Dentry *od = request->old_dentry(); ldout(cct, 10) << " unlinking rename src dn " << od << " for traceless reply" << dendl; assert(od); - unlink(od, true, true); // keep dir, dentry + unlink(od, true, true); // keep dir, dentr + od->lease_mds = -1; } else if (request->head.op == CEPH_MDS_OP_RMDIR || request->head.op == CEPH_MDS_OP_UNLINK) { // unlink, rmdir ldout(cct, 10) << " unlinking unlink/rmdir dn " << d << " for traceless reply" << dendl; unlink(d, true, true); // keep dir, dentry + d->lease_mds = -1; } } return NULL; @@ -2159,6 +2164,7 @@ Dentry* Client::link(Dir *dir, const string& name, Inode *in, Dentry *dn) Dentry *olddn = in->get_first_parent(); assert(olddn->dir != dir || olddn->name != name); unlink(olddn, true, true); // keep dir, dentry + olddn->lease_mds = -1; } in->dn_set.insert(dn); |