fanotify: merge two checks regarding add of ignore mark
authorAmir Goldstein <amir73il@gmail.com>
Sun, 17 Mar 2024 18:41:48 +0000 (20:41 +0200)
committerJan Kara <jack@suse.cz>
Thu, 4 Apr 2024 14:24:16 +0000 (16:24 +0200)
There are two similar checks for adding an ignore mark without
FAN_MARK_IGNORED_SURV_MODIFY, one for the old FAN_MARK_IGNORED flag
and one for the new FAN_MARK_IGNORE flag.

Merge the two checks into a single location.

Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Jan Kara <jack@suse.cz>
Message-Id: <20240317184154.1200192-5-amir73il@gmail.com>

fs/notify/fanotify/fanotify_user.c

index 4201723357cfb70afc1380659925648fdea4e3c9..04a0b31f325df9fb7e5957fcc384c6588c8a0ad0 100644 (file)
@@ -1412,18 +1412,6 @@ static int fanotify_add_inode_mark(struct fsnotify_group *group,
                                   struct inode *inode, __u32 mask,
                                   unsigned int flags, struct fan_fsid *fsid)
 {
-       pr_debug("%s: group=%p inode=%p\n", __func__, group, inode);
-
-       /*
-        * If some other task has this inode open for write we should not add
-        * an ignore mask, unless that ignore mask is supposed to survive
-        * modification changes anyway.
-        */
-       if ((flags & FANOTIFY_MARK_IGNORE_BITS) &&
-           !(flags & FAN_MARK_IGNORED_SURV_MODIFY) &&
-           inode_is_open_for_write(inode))
-               return 0;
-
        return fanotify_add_mark(group, &inode->i_fsnotify_marks,
                                 FSNOTIFY_OBJ_TYPE_INODE, mask, flags, fsid);
 }
@@ -1913,12 +1901,23 @@ static int do_fanotify_mark(int fanotify_fd, unsigned int flags, __u64 mask,
        else
                mnt = path.mnt;
 
-       ret = mnt ? -EINVAL : -EISDIR;
-       /* FAN_MARK_IGNORE requires SURV_MODIFY for sb/mount/dir marks */
-       if (mark_cmd == FAN_MARK_ADD && ignore == FAN_MARK_IGNORE &&
-           (mnt || S_ISDIR(inode->i_mode)) &&
-           !(flags & FAN_MARK_IGNORED_SURV_MODIFY))
-               goto path_put_and_out;
+       /*
+        * If some other task has this inode open for write we should not add
+        * an ignore mask, unless that ignore mask is supposed to survive
+        * modification changes anyway.
+        */
+       if (mark_cmd == FAN_MARK_ADD && (flags & FANOTIFY_MARK_IGNORE_BITS) &&
+           !(flags & FAN_MARK_IGNORED_SURV_MODIFY)) {
+               ret = mnt ? -EINVAL : -EISDIR;
+               /* FAN_MARK_IGNORE requires SURV_MODIFY for sb/mount/dir marks */
+               if (ignore == FAN_MARK_IGNORE &&
+                   (mnt || S_ISDIR(inode->i_mode)))
+                       goto path_put_and_out;
+
+               ret = 0;
+               if (inode && inode_is_open_for_write(inode))
+                       goto path_put_and_out;
+       }
 
        /* Mask out FAN_EVENT_ON_CHILD flag for sb/mount/non-dir marks */
        if (mnt || !S_ISDIR(inode->i_mode)) {