From 61030e62cf2f4e5b9d1380b2743de3ec432e5f6c Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Tue, 12 May 2015 17:06:46 +0800 Subject: [PATCH] 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 --- src/client/Client.cc | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index e18c77c728a..f3a731838b9 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; -- 2.47.3