diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2019-10-31 06:21:58 +0100 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2019-11-15 19:49:04 +0100 |
commit | 6c2d4798a8d16cf4f3a28c3cd4af4f1dcbbb4d04 (patch) | |
tree | 2b14c83985da30129911f7ad455e4cc587690e58 /fs/cifs | |
parent | fs/namei.c: pull positivity check into follow_managed() (diff) | |
download | linux-6c2d4798a8d16cf4f3a28c3cd4af4f1dcbbb4d04.tar.xz linux-6c2d4798a8d16cf4f3a28c3cd4af4f1dcbbb4d04.zip |
new helper: lookup_positive_unlocked()
Most of the callers of lookup_one_len_unlocked() treat negatives are
ERR_PTR(-ENOENT). Provide a helper that would do just that. Note
that a pinned positive dentry remains positive - it's ->d_inode is
stable, etc.; a pinned _negative_ dentry can become positive at any
point as long as you are not holding its parent at least shared.
So using lookup_one_len_unlocked() needs to be careful;
lookup_positive_unlocked() is safer and that's what the callers
end up open-coding anyway.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/cifs')
-rw-r--r-- | fs/cifs/cifsfs.c | 7 |
1 files changed, 1 insertions, 6 deletions
diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index c049c7b3aa87..8c8600e53339 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c @@ -719,11 +719,6 @@ cifs_get_root(struct smb_vol *vol, struct super_block *sb) struct inode *dir = d_inode(dentry); struct dentry *child; - if (!dir) { - dput(dentry); - dentry = ERR_PTR(-ENOENT); - break; - } if (!S_ISDIR(dir->i_mode)) { dput(dentry); dentry = ERR_PTR(-ENOTDIR); @@ -740,7 +735,7 @@ cifs_get_root(struct smb_vol *vol, struct super_block *sb) while (*s && *s != sep) s++; - child = lookup_one_len_unlocked(p, dentry, s - p); + child = lookup_positive_unlocked(p, dentry, s - p); dput(dentry); dentry = child; } while (!IS_ERR(dentry)); |