]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ovl: do not generate duplicate fsnotify events for "fake" path
authorAmir Goldstein <amir73il@gmail.com>
Wed, 24 Apr 2019 16:39:50 +0000 (19:39 +0300)
committerMiklos Szeredi <mszeredi@redhat.com>
Mon, 6 May 2019 11:54:51 +0000 (13:54 +0200)
Overlayfs "fake" path is used for stacked file operations on underlying
files.  Operations on files with "fake" path must not generate fsnotify
events with path data, because those events have already been generated at
overlayfs layer and because the reported event->fd for fanotify marks on
underlying inode/filesystem will have the wrong path (the overlayfs path).

Link: https://lore.kernel.org/linux-fsdevel/20190423065024.12695-1-jencce.kernel@gmail.com/
Reported-by: Murphy Zhou <jencce.kernel@gmail.com>
Fixes: d1d04ef8572b ("ovl: stack file ops")
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
fs/overlayfs/file.c

index ddfd93f13cc5f4a7e3948c137252f58bd1e9a370..7d2f01957e40790c60419a54e1f61b075b1ee012 100644 (file)
@@ -29,10 +29,11 @@ static struct file *ovl_open_realfile(const struct file *file,
        struct inode *inode = file_inode(file);
        struct file *realfile;
        const struct cred *old_cred;
+       int flags = file->f_flags | O_NOATIME | FMODE_NONOTIFY;
 
        old_cred = ovl_override_creds(inode->i_sb);
-       realfile = open_with_fake_path(&file->f_path, file->f_flags | O_NOATIME,
-                                      realinode, current_cred());
+       realfile = open_with_fake_path(&file->f_path, flags, realinode,
+                                      current_cred());
        revert_creds(old_cred);
 
        pr_debug("open(%p[%pD2/%c], 0%o) -> (%p, 0%o)\n",
@@ -50,7 +51,7 @@ static int ovl_change_flags(struct file *file, unsigned int flags)
        int err;
 
        /* No atime modificaton on underlying */
-       flags |= O_NOATIME;
+       flags |= O_NOATIME | FMODE_NONOTIFY;
 
        /* If some flag changed that cannot be changed then something's amiss */
        if (WARN_ON((file->f_flags ^ flags) & ~OVL_SETFL_MASK))