ovl: do not fail because of O_NOATIME 49/261549/1 accepted/tizen/unified/20210723.122825 submit/tizen/20210722.021258
authorMiklos Szeredi <mszeredi@redhat.com>
Mon, 14 Dec 2020 14:26:14 +0000 (15:26 +0100)
committerSeung-Woo Kim <sw0312.kim@samsung.com>
Wed, 21 Jul 2021 05:46:01 +0000 (14:46 +0900)
In case the file cannot be opened with O_NOATIME because of lack of
capabilities, then clear O_NOATIME instead of failing.

Remove WARN_ON(), since it would now trigger if O_NOATIME was cleared.
Noticed by Amir Goldstein.

Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
[sw0312.kim: backport v5.11 mainline commit b6650dab404c to resolve overlayfs file open EPERM fail issue in v5.10]
Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Change-Id: I9c0c74747bb4a208fc68ca561f740281b2b553fe

fs/overlayfs/file.c

index 5c5c397..1cb844b 100644 (file)
@@ -53,9 +53,10 @@ static struct file *ovl_open_realfile(const struct file *file,
        err = inode_permission(realinode, MAY_OPEN | acc_mode);
        if (err) {
                realfile = ERR_PTR(err);
-       } else if (!inode_owner_or_capable(realinode)) {
-               realfile = ERR_PTR(-EPERM);
        } else {
+               if (!inode_owner_or_capable(realinode))
+                       flags &= ~O_NOATIME;
+
                realfile = open_with_fake_path(&file->f_path, flags, realinode,
                                               current_cred());
        }
@@ -75,12 +76,6 @@ static int ovl_change_flags(struct file *file, unsigned int flags)
        struct inode *inode = file_inode(file);
        int err;
 
-       flags |= OVL_OPEN_FLAGS;
-
-       /* If some flag changed that cannot be changed then something's amiss */
-       if (WARN_ON((file->f_flags ^ flags) & ~OVL_SETFL_MASK))
-               return -EIO;
-
        flags &= OVL_SETFL_MASK;
 
        if (((flags ^ file->f_flags) & O_APPEND) && IS_APPEND(inode))