diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2019-05-07 20:03:32 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2019-05-07 20:03:32 -0700 |
commit | d27fb65bc2389621040e5107baedb94b4cccf641 (patch) | |
tree | 4123a7b82dd048dc8b0602994a5db6f4b9885998 /fs/nsfs.c | |
parent | d3511f53bb2475f2a4e8460bee5a1ae6dea2a433 (diff) | |
parent | 795d673af1afae8146ac3070a2d77cfae5287c43 (diff) | |
download | linux-d27fb65bc2389621040e5107baedb94b4cccf641.tar.bz2 |
Merge branch 'work.dcache' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull misc dcache updates from Al Viro:
"Most of this pile is putting name length into struct name_snapshot and
making use of it.
The beginning of this series ("ovl_lookup_real_one(): don't bother
with strlen()") ought to have been split in two (separate switch of
name_snapshot to struct qstr from overlayfs reaping the trivial
benefits of that), but I wanted to avoid a rebase - by the time I'd
spotted that it was (a) in -next and (b) close to 5.1-final ;-/"
* 'work.dcache' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
audit_compare_dname_path(): switch to const struct qstr *
audit_update_watch(): switch to const struct qstr *
inotify_handle_event(): don't bother with strlen()
fsnotify: switch send_to_group() and ->handle_event to const struct qstr *
fsnotify(): switch to passing const struct qstr * for file_name
switch fsnotify_move() to passing const struct qstr * for old_name
ovl_lookup_real_one(): don't bother with strlen()
sysv: bury the broken "quietly truncate the long filenames" logics
nsfs: unobfuscate
unexport d_alloc_pseudo()
Diffstat (limited to 'fs/nsfs.c')
-rw-r--r-- | fs/nsfs.c | 23 |
1 files changed, 10 insertions, 13 deletions
diff --git a/fs/nsfs.c b/fs/nsfs.c index 30d150a4f0c6..e3bf08c5af41 100644 --- a/fs/nsfs.c +++ b/fs/nsfs.c @@ -105,17 +105,16 @@ slow: void *ns_get_path_cb(struct path *path, ns_get_path_helper_t *ns_get_cb, void *private_data) { - struct ns_common *ns; void *ret; -again: - ns = ns_get_cb(private_data); - if (!ns) - return ERR_PTR(-ENOENT); + do { + struct ns_common *ns = ns_get_cb(private_data); + if (!ns) + return ERR_PTR(-ENOENT); + + ret = __ns_get_path(path, ns); + } while (ret == ERR_PTR(-EAGAIN)); - ret = __ns_get_path(path, ns); - if (IS_ERR(ret) && PTR_ERR(ret) == -EAGAIN) - goto again; return ret; } @@ -154,7 +153,7 @@ int open_related_ns(struct ns_common *ns, if (fd < 0) return fd; - while (1) { + do { struct ns_common *relative; relative = get_ns(ns); @@ -164,10 +163,8 @@ int open_related_ns(struct ns_common *ns, } err = __ns_get_path(&path, relative); - if (IS_ERR(err) && PTR_ERR(err) == -EAGAIN) - continue; - break; - } + } while (err == ERR_PTR(-EAGAIN)); + if (IS_ERR(err)) { put_unused_fd(fd); return PTR_ERR(err); |