summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-05-23 17:12:27 -0700
committerSage Weil <sage@inktank.com>2013-06-24 21:21:47 -0700
commitc83283b26394ac032cef9c7f9feb6a146aeb3de7 (patch)
tree127d18e9fd1eaf9ad09aacd249bc6bdc282f0858
parent3cea945f540bce66906ef79c909c809b56858b03 (diff)
downloadceph-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.cc8
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);