From: Sage Weil Date: Fri, 17 May 2013 17:27:27 +0000 (-0700) Subject: client: handle traceless rename in insert_trace, not verify_reply_trace X-Git-Tag: v0.81~19^2~9 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=8fa5408f1f91377db4164b20a3b4f789372c156c;p=ceph.git client: handle traceless rename in insert_trace, not verify_reply_trace 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 --- diff --git a/src/client/Client.cc b/src/client/Client.cc index deff09370fde..dca27b9917ea 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -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