From ff2a6f6b963d5c1d21e4e6dcdd881d71d0faabd3 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 3 Mar 2009 11:43:47 -0800 Subject: [PATCH] kclient: do not return new null dentry from lookup The VFS doesn't appear to like it when lookup returns a replacement dentry that is null... it BUGs on unmount with a ref count that is still 1. So, if we get ENOENT and no trace, return ERR_PTR(-ENOENT) instead. --- src/kernel/dir.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/kernel/dir.c b/src/kernel/dir.c index 918f933eec90..a8adf784f9b2 100644 --- a/src/kernel/dir.c +++ b/src/kernel/dir.c @@ -243,20 +243,18 @@ struct dentry *ceph_finish_lookup(struct ceph_mds_request *req, if (err == -ENOENT) { /* no trace? */ + err = 0; if (req->r_reply_info.trace_numd == 0) { dout(20, "ENOENT and no trace, dentry %p inode %p\n", dentry, dentry->d_inode); ceph_init_dentry(dentry); if (dentry->d_inode) { d_drop(dentry); - req->r_dentry = d_alloc(dentry->d_parent, - &dentry->d_name); - d_rehash(req->r_dentry); + err = -ENOENT; } else { d_add(dentry, NULL); } } - err = 0; } if (err) dentry = ERR_PTR(err); -- 2.47.3