diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2020-09-26 22:38:44 +0200 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2020-10-26 01:01:55 +0100 |
commit | 56c428cac5a2c361271370dde3a22cb640bc9934 (patch) | |
tree | 520f6138a41bbe3d98ec5cd4b9653414f07608e2 /fs/eventpoll.c | |
parent | clean reverse_path_check_proc() a bit (diff) | |
download | linux-56c428cac5a2c361271370dde3a22cb640bc9934.tar.xz linux-56c428cac5a2c361271370dde3a22cb640bc9934.zip |
ep_loop_check_proc(): lift pushing the cookie into callers
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/eventpoll.c')
-rw-r--r-- | fs/eventpoll.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/fs/eventpoll.c b/fs/eventpoll.c index 33af838046ea..9edea3933790 100644 --- a/fs/eventpoll.c +++ b/fs/eventpoll.c @@ -1877,9 +1877,6 @@ static int ep_loop_check_proc(void *priv, void *cookie, int depth) struct rb_node *rbp; struct epitem *epi; - if (!ep_push_nested(cookie)) /* limits recursion */ - return -1; - mutex_lock_nested(&ep->mtx, depth + 1); ep->gen = loop_check_gen; for (rbp = rb_first_cached(&ep->rbr); rbp; rbp = rb_next(rbp)) { @@ -1888,8 +1885,13 @@ static int ep_loop_check_proc(void *priv, void *cookie, int depth) ep_tovisit = epi->ffd.file->private_data; if (ep_tovisit->gen == loop_check_gen) continue; - error = ep_loop_check_proc(epi->ffd.file, ep_tovisit, + if (!ep_push_nested(ep_tovisit)) { + error = -1; + } else { + error = ep_loop_check_proc(epi->ffd.file, ep_tovisit, depth + 1); + nesting--; + } if (error != 0) break; } else { @@ -1909,7 +1911,6 @@ static int ep_loop_check_proc(void *priv, void *cookie, int depth) } } mutex_unlock(&ep->mtx); - nesting--; /* pop */ return error; } @@ -1927,7 +1928,12 @@ static int ep_loop_check_proc(void *priv, void *cookie, int depth) */ static int ep_loop_check(struct eventpoll *ep, struct file *file) { - return ep_loop_check_proc(file, ep, 0); + int err; + + ep_push_nested(ep); // can't fail + err = ep_loop_check_proc(file, ep, 0); + nesting--; + return err; } static void clear_tfile_check_list(void) |