| From 1a2cbd966a1f48a20e43cf54195aabaa9375732c Mon Sep 17 00:00:00 2001 |
| From: Amir Goldstein <amir73il@gmail.com> |
| Date: Thu, 18 Jun 2020 18:43:53 +0300 |
| Subject: [PATCH] ovl: fix unneeded call to ovl_change_flags() |
| |
| commit 81a33c1ee941c3bb9ffc6bac8f676be13351344e upstream. |
| |
| The check if user has changed the overlay file was wrong, causing unneeded |
| call to ovl_change_flags() including taking f_lock on every file access. |
| |
| Fixes: d989903058a8 ("ovl: do not generate duplicate fsnotify events for "fake" path") |
| Cc: <stable@vger.kernel.org> # v4.19+ |
| Signed-off-by: Amir Goldstein <amir73il@gmail.com> |
| Signed-off-by: Miklos Szeredi <mszeredi@redhat.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c |
| index 15e4fa288475..7a08a576f7b2 100644 |
| --- a/fs/overlayfs/file.c |
| +++ b/fs/overlayfs/file.c |
| @@ -21,13 +21,16 @@ static char ovl_whatisit(struct inode *inode, struct inode *realinode) |
| return 'm'; |
| } |
| |
| +/* No atime modificaton nor notify on underlying */ |
| +#define OVL_OPEN_FLAGS (O_NOATIME | FMODE_NONOTIFY) |
| + |
| static struct file *ovl_open_realfile(const struct file *file, |
| struct inode *realinode) |
| { |
| struct inode *inode = file_inode(file); |
| struct file *realfile; |
| const struct cred *old_cred; |
| - int flags = file->f_flags | O_NOATIME | FMODE_NONOTIFY; |
| + int flags = file->f_flags | OVL_OPEN_FLAGS; |
| |
| old_cred = ovl_override_creds(inode->i_sb); |
| realfile = open_with_fake_path(&file->f_path, flags, realinode, |
| @@ -48,8 +51,7 @@ static int ovl_change_flags(struct file *file, unsigned int flags) |
| struct inode *inode = file_inode(file); |
| int err; |
| |
| - /* No atime modificaton on underlying */ |
| - flags |= O_NOATIME | FMODE_NONOTIFY; |
| + 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)) |
| @@ -102,7 +104,7 @@ static int ovl_real_fdget_meta(const struct file *file, struct fd *real, |
| } |
| |
| /* Did the flags change since open? */ |
| - if (unlikely((file->f_flags ^ real->file->f_flags) & ~O_NOATIME)) |
| + if (unlikely((file->f_flags ^ real->file->f_flags) & ~OVL_OPEN_FLAGS)) |
| return ovl_change_flags(real->file, file->f_flags); |
| |
| return 0; |
| -- |
| 2.27.0 |
| |