]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: handle traceless rename in insert_trace, not verify_reply_trace
authorSage Weil <sage@inktank.com>
Fri, 17 May 2013 17:27:27 +0000 (10:27 -0700)
committerYan, Zheng <zheng.z.yan@intel.com>
Wed, 7 May 2014 02:06:52 +0000 (10:06 +0800)
The insert_trace() logic is about managing local cache consistency; the
verify_reply_trace() is about retrying requests to get the results that
our callers need.

Set up stubs to handle rmdir and unlink while we are here.

Signed-off-by: Sage Weil <sage@inktank.com>
src/client/Client.cc

index deff09370fde6e0ac6e53e98c751fbada4659a11..dca27b9917ea7a51258048927f53ae7a803afb78 100644 (file)
@@ -998,6 +998,18 @@ Inode* Client::insert_trace(MetaRequest *request, MetaSession *session)
       d->dir->parent_inode->flags &= ~I_COMPLETE;
       d->dir->release_count++;
     }
+
+    if (d && reply->get_result() == 0) {
+      Dentry *od = request->old_dentry();
+      if (od) {
+       // rename
+       unlink(od, false, false);
+      } else if (request->head.op == CEPH_MDS_OP_RMDIR ||
+                request->head.op == CEPH_MDS_OP_UNLINK) {
+       // unlink, rmdir
+       // ...
+      }
+    }
     return NULL;
   }
 
@@ -1264,14 +1276,6 @@ int Client::verify_reply_trace(int r,
       Inode *target = 0;  // ptarget may be NULL
       Dentry *d = request->dentry();
       if (d) {
-       // rename is special: we handle old_dentry unlink explicitly
-       // in insert_dentry_inode(), so we need to compensate and do
-       // the same here.
-       Dentry *od = request->old_dentry();
-       if (od) {
-         unlink(od, false, false);
-       }
-
        if (d->dir) {
          ldout(cct, 10) << "make_request got traceless reply, looking up #"
                         << d->dir->parent_inode->ino << "/" << d->name