[RHEL8,COMMIT] ms/ovl: do not generate duplicate fsnotify events for "fake" path

Submitted by Konstantin Khorenko on April 20, 2020, 3:59 p.m.

Details

Message ID 202004201559.03KFxr4f017918@finist_co8.work.ct
State New
Series "ovl: do not generate duplicate fsnotify events for "fake" path"
Headers show

Commit Message

Konstantin Khorenko April 20, 2020, 3:59 p.m.
The commit is pushed to "branch-rh8-4.18.0-80.1.2.vz8.3.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh8-4.18.0-80.1.2.vz8.3.7
------>
commit 7c8d0c566a719e95235cc12027948f2ed83a1087
Author: Amir Goldstein <amir73il@gmail.com>
Date:   Mon Apr 20 18:59:51 2020 +0300

    ms/ovl: do not generate duplicate fsnotify events for "fake" path
    
    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>
    
    (cherry-picked from d989903058a83e8536cc7aadf9256a47d5c173fe)
    https://jira.sw.ru/browse/PSBM-102737
    
    Signed-off-by: Valeriy Vdovin <valeriy.vdovin@virtuozzo.com>
---
 fs/overlayfs/file.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

Patch hide | download patch | download mbox

diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c
index 84dd957efa24..6f6eb638a320 100644
--- a/fs/overlayfs/file.c
+++ b/fs/overlayfs/file.c
@@ -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))