From: Yan, Zheng Date: Tue, 12 May 2015 09:06:46 +0000 (+0800) Subject: client: pin request->target when target dentry is not pinned X-Git-Tag: v9.0.2~152^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=61030e62cf2f4e5b9d1380b2743de3ec432e5f6c;p=ceph.git client: pin request->target when target dentry is not pinned In most cases, target dentry is pinned by request, so no one will free the target inode. But for LOOKUP and LOOKUPPARENT requests, target dentry is not pinned. So we should pin the target inode Signed-off-by: Yan, Zheng --- diff --git a/src/client/Client.cc b/src/client/Client.cc index e18c77c728ab..f3a731838b9b 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -1210,9 +1210,15 @@ Inode* Client::insert_trace(MetaRequest *request, MetaSession *session) } } - if (in && (reply->head.op == CEPH_MDS_OP_READDIR || - reply->head.op == CEPH_MDS_OP_LSSNAP)) { - insert_readdir_results(request, session, in); + if (in) { + if (reply->head.op == CEPH_MDS_OP_READDIR || + reply->head.op == CEPH_MDS_OP_LSSNAP) + insert_readdir_results(request, session, in); + + if (request->dentry() == NULL && in != request->inode()) { + // pin the target inode if its parent dentry is not pinned + request->set_other_inode(in); + } } request->target = in;