From: Sage Weil Date: Tue, 3 Mar 2009 19:43:47 +0000 (-0800) Subject: kclient: do not return new null dentry from lookup X-Git-Tag: v0.7~55^2~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=ff2a6f6b963d5c1d21e4e6dcdd881d71d0faabd3;p=ceph.git 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. --- diff --git a/src/kernel/dir.c b/src/kernel/dir.c index 918f933eec9..a8adf784f9b 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);