From: Sage Weil Date: Fri, 1 Mar 2013 06:32:30 +0000 (-0800) Subject: client: clear I_COMPLETE on traceless reply for dentry request X-Git-Tag: v0.60~121^2~11 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=613c8f1edf6c33b757be81092c4b4a6ced4f2d0d;p=ceph.git client: clear I_COMPLETE on traceless reply for dentry request If a request is against a dentry, and we get a traceless reply, clear the directory I_COMPLETE flag on the parent directory because we can no longer trust that our cache is complete. It is possible we could do something a bit more intelligent here, but it is not trivial because of racing requests, and traceless replies are rare, so it's not worth the effort. Signed-off-by: Sage Weil --- diff --git a/src/client/Client.cc b/src/client/Client.cc index b3bea7adcbcd..6497558008dd 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -903,6 +903,14 @@ Inode* Client::insert_trace(MetaRequest *request, int mds) bufferlist::iterator p = reply->get_trace_bl().begin(); if (p.end()) { ldout(cct, 10) << "insert_trace -- no trace" << dendl; + + if (request->dentry && + request->dentry->dir && + (request->dentry->dir->parent_inode->flags & I_COMPLETE)) { + ldout(cct, 10) << " clearing I_COMPLETE on " << *request->dentry->dir->parent_inode << dendl; + request->dentry->dir->parent_inode->flags &= ~I_COMPLETE; + request->dentry->dir->release_count++; + } return NULL; }