Skip to content

Commit

Permalink
cachefiles: vfs_mkdir() might succeed leaving dentry negative unhashed
Browse files Browse the repository at this point in the history
That can (and does, on some filesystems) happen - ->mkdir() (and thus
vfs_mkdir()) can legitimately leave its argument negative and just
unhash it, counting upon the lookup to pick the object we'd created
next time we try to look at that name.

Some vfs_mkdir() callers forget about that possibility...

Signed-off-by: Al Viro <[email protected]>
  • Loading branch information
Al Viro committed May 21, 2018
1 parent 7b745a4 commit 9c3e902
Showing 1 changed file with 10 additions and 0 deletions.
10 changes: 10 additions & 0 deletions fs/cachefiles/namei.c
Original file line number Diff line number Diff line change
Expand Up @@ -572,6 +572,11 @@ int cachefiles_walk_to_object(struct cachefiles_object *parent,
if (ret < 0)
goto create_error;

if (unlikely(d_unhashed(next))) {
dput(next);
inode_unlock(d_inode(dir));
goto lookup_again;
}
ASSERT(d_backing_inode(next));

_debug("mkdir -> %p{%p{ino=%lu}}",
Expand Down Expand Up @@ -764,6 +769,7 @@ struct dentry *cachefiles_get_directory(struct cachefiles_cache *cache,
/* search the current directory for the element name */
inode_lock(d_inode(dir));

retry:
start = jiffies;
subdir = lookup_one_len(dirname, dir, strlen(dirname));
cachefiles_hist(cachefiles_lookup_histogram, start);
Expand Down Expand Up @@ -793,6 +799,10 @@ struct dentry *cachefiles_get_directory(struct cachefiles_cache *cache,
if (ret < 0)
goto mkdir_error;

if (unlikely(d_unhashed(subdir))) {
dput(subdir);
goto retry;
}
ASSERT(d_backing_inode(subdir));

_debug("mkdir -> %p{%p{ino=%lu}}",
Expand Down

0 comments on commit 9c3e902

Please sign in to comment.