do_epoll_ctl(): clean the failure exits up a bit
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 22 Aug 2020 22:25:52 +0000 (18:25 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 22 Aug 2020 22:25:52 +0000 (18:25 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/eventpoll.c

index 196003d..e0decff 100644 (file)
@@ -2203,29 +2203,22 @@ int do_epoll_ctl(int epfd, int op, int fd, struct epoll_event *epds,
                        full_check = 1;
                        if (is_file_epoll(tf.file)) {
                                error = -ELOOP;
-                               if (ep_loop_check(ep, tf.file) != 0) {
-                                       clear_tfile_check_list();
+                               if (ep_loop_check(ep, tf.file) != 0)
                                        goto error_tgt_fput;
-                               }
                        } else {
                                get_file(tf.file);
                                list_add(&tf.file->f_tfile_llink,
                                                        &tfile_check_list);
                        }
                        error = epoll_mutex_lock(&ep->mtx, 0, nonblock);
-                       if (error) {
-out_del:
-                               list_del(&tf.file->f_tfile_llink);
-                               if (!is_file_epoll(tf.file))
-                                       fput(tf.file);
+                       if (error)
                                goto error_tgt_fput;
-                       }
                        if (is_file_epoll(tf.file)) {
                                tep = tf.file->private_data;
                                error = epoll_mutex_lock(&tep->mtx, 1, nonblock);
                                if (error) {
                                        mutex_unlock(&ep->mtx);
-                                       goto out_del;
+                                       goto error_tgt_fput;
                                }
                        }
                }
@@ -2246,8 +2239,6 @@ out_del:
                        error = ep_insert(ep, epds, tf.file, fd, full_check);
                } else
                        error = -EEXIST;
-               if (full_check)
-                       clear_tfile_check_list();
                break;
        case EPOLL_CTL_DEL:
                if (epi)
@@ -2270,8 +2261,10 @@ out_del:
        mutex_unlock(&ep->mtx);
 
 error_tgt_fput:
-       if (full_check)
+       if (full_check) {
+               clear_tfile_check_list();
                mutex_unlock(&epmutex);
+       }
 
        fdput(tf);
 error_fput: