fanotify: FAN_MARK_FLUSH: avoid having to provide a fake/invalid fd and path
[firefly-linux-kernel-4.4.55.git] / fs / notify / fanotify / fanotify_user.c
index 732648b270dc1072f679b550fb386147e65b5db0..f6ac6a2fa91ed994f816f6644a5724be46d9cbb0 100644 (file)
@@ -813,6 +813,15 @@ SYSCALL_DEFINE5(fanotify_mark, int, fanotify_fd, unsigned int, flags,
            group->priority == FS_PRIO_0)
                goto fput_and_out;
 
+       if (flags & FAN_MARK_FLUSH) {
+               ret = 0;
+               if (flags & FAN_MARK_MOUNT)
+                       fsnotify_clear_vfsmount_marks_by_group(group);
+               else
+                       fsnotify_clear_inode_marks_by_group(group);
+               goto fput_and_out;
+       }
+
        ret = fanotify_find_path(dfd, pathname, &path, flags);
        if (ret)
                goto fput_and_out;
@@ -824,7 +833,7 @@ SYSCALL_DEFINE5(fanotify_mark, int, fanotify_fd, unsigned int, flags,
                mnt = path.mnt;
 
        /* create/update an inode mark */
-       switch (flags & (FAN_MARK_ADD | FAN_MARK_REMOVE | FAN_MARK_FLUSH)) {
+       switch (flags & (FAN_MARK_ADD | FAN_MARK_REMOVE)) {
        case FAN_MARK_ADD:
                if (flags & FAN_MARK_MOUNT)
                        ret = fanotify_add_vfsmount_mark(group, mnt, mask, flags);
@@ -837,12 +846,6 @@ SYSCALL_DEFINE5(fanotify_mark, int, fanotify_fd, unsigned int, flags,
                else
                        ret = fanotify_remove_inode_mark(group, inode, mask, flags);
                break;
-       case FAN_MARK_FLUSH:
-               if (flags & FAN_MARK_MOUNT)
-                       fsnotify_clear_vfsmount_marks_by_group(group);
-               else
-                       fsnotify_clear_inode_marks_by_group(group);
-               break;
        default:
                ret = -EINVAL;
        }