Message ID | 20181122113133.30368-2-po-hsu.lin@canonical.com |
---|---|
State | New |
Headers | show |
Series | [Bionic,SRU,1/1] fsnotify: fix ignore mask logic in fsnotify() | expand |
On 2018-11-22 19:31:33 , Po-Hsu Lin wrote: > From: Amir Goldstein <amir73il@gmail.com> > > BugLink: https://bugs.launchpad.net/bugs/1802454 > > Commit 92183a42898d ("fsnotify: fix ignore mask logic in > send_to_group()") acknoledges the use case of ignoring an event on > an inode mark, because of an ignore mask on a mount mark of the same > group (i.e. I want to get all events on this file, except for the events > that came from that mount). > > This change depends on correctly merging the inode marks and mount marks > group lists, so that the mount mark ignore mask would be tested in > send_to_group(). Alas, the merging of the lists did not take into > account the case where event in question is not in the mask of any of > the mount marks. > > To fix this, completely remove the tests for inode and mount event masks > from the lists merging code. > > Fixes: 92183a42898d ("fsnotify: fix ignore mask logic in send_to_group") > Signed-off-by: Amir Goldstein <amir73il@gmail.com> > Signed-off-by: Jan Kara <jack@suse.cz> > (backported from commit 9bdda4e9cf2dcecb60a0683b10ffb8cd7e5f2f45) > Signed-off-by: Po-Hsu Lin <po-hsu.lin@canonical.com> > --- > fs/notify/fsnotify.c | 13 +++---------- > 1 file changed, 3 insertions(+), 10 deletions(-) > > diff --git a/fs/notify/fsnotify.c b/fs/notify/fsnotify.c > index 613ec7e..6a862aa 100644 > --- a/fs/notify/fsnotify.c > +++ b/fs/notify/fsnotify.c > @@ -305,16 +305,9 @@ int fsnotify(struct inode *to_tell, __u32 mask, const void *data, int data_is, > > iter_info.srcu_idx = srcu_read_lock(&fsnotify_mark_srcu); > > - if ((mask & FS_MODIFY) || > - (test_mask & to_tell->i_fsnotify_mask)) { > - iter_info.inode_mark = > - fsnotify_first_mark(&to_tell->i_fsnotify_marks); > - } > - > - if (mnt && ((mask & FS_MODIFY) || > - (test_mask & mnt->mnt_fsnotify_mask))) { > - iter_info.inode_mark = > - fsnotify_first_mark(&to_tell->i_fsnotify_marks); > + iter_info.inode_mark = > + fsnotify_first_mark(&to_tell->i_fsnotify_marks); > + if (mnt) { > iter_info.vfsmount_mark = > fsnotify_first_mark(&mnt->mnt_fsnotify_marks); > } Acked-by: Khalid Elmously <khalid.elmously@canonical.com>
On 11/22/18 12:31 PM, Po-Hsu Lin wrote: > From: Amir Goldstein <amir73il@gmail.com> > > BugLink: https://bugs.launchpad.net/bugs/1802454 > > Commit 92183a42898d ("fsnotify: fix ignore mask logic in > send_to_group()") acknoledges the use case of ignoring an event on > an inode mark, because of an ignore mask on a mount mark of the same > group (i.e. I want to get all events on this file, except for the events > that came from that mount). > > This change depends on correctly merging the inode marks and mount marks > group lists, so that the mount mark ignore mask would be tested in > send_to_group(). Alas, the merging of the lists did not take into > account the case where event in question is not in the mask of any of > the mount marks. > > To fix this, completely remove the tests for inode and mount event masks > from the lists merging code. > > Fixes: 92183a42898d ("fsnotify: fix ignore mask logic in send_to_group") > Signed-off-by: Amir Goldstein <amir73il@gmail.com> > Signed-off-by: Jan Kara <jack@suse.cz> > (backported from commit 9bdda4e9cf2dcecb60a0683b10ffb8cd7e5f2f45) > Signed-off-by: Po-Hsu Lin <po-hsu.lin@canonical.com> The backport looks correct, good regression test results. Acked-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com> > --- > fs/notify/fsnotify.c | 13 +++---------- > 1 file changed, 3 insertions(+), 10 deletions(-) > > diff --git a/fs/notify/fsnotify.c b/fs/notify/fsnotify.c > index 613ec7e..6a862aa 100644 > --- a/fs/notify/fsnotify.c > +++ b/fs/notify/fsnotify.c > @@ -305,16 +305,9 @@ int fsnotify(struct inode *to_tell, __u32 mask, const void *data, int data_is, > > iter_info.srcu_idx = srcu_read_lock(&fsnotify_mark_srcu); > > - if ((mask & FS_MODIFY) || > - (test_mask & to_tell->i_fsnotify_mask)) { > - iter_info.inode_mark = > - fsnotify_first_mark(&to_tell->i_fsnotify_marks); > - } > - > - if (mnt && ((mask & FS_MODIFY) || > - (test_mask & mnt->mnt_fsnotify_mask))) { > - iter_info.inode_mark = > - fsnotify_first_mark(&to_tell->i_fsnotify_marks); > + iter_info.inode_mark = > + fsnotify_first_mark(&to_tell->i_fsnotify_marks); > + if (mnt) { > iter_info.vfsmount_mark = > fsnotify_first_mark(&mnt->mnt_fsnotify_marks); > }
On 11/22/18 12:31 PM, Po-Hsu Lin wrote: > From: Amir Goldstein <amir73il@gmail.com> > > BugLink: https://bugs.launchpad.net/bugs/1802454 > > Commit 92183a42898d ("fsnotify: fix ignore mask logic in > send_to_group()") acknoledges the use case of ignoring an event on > an inode mark, because of an ignore mask on a mount mark of the same > group (i.e. I want to get all events on this file, except for the events > that came from that mount). > > This change depends on correctly merging the inode marks and mount marks > group lists, so that the mount mark ignore mask would be tested in > send_to_group(). Alas, the merging of the lists did not take into > account the case where event in question is not in the mask of any of > the mount marks. > > To fix this, completely remove the tests for inode and mount event masks > from the lists merging code. > > Fixes: 92183a42898d ("fsnotify: fix ignore mask logic in send_to_group") > Signed-off-by: Amir Goldstein <amir73il@gmail.com> > Signed-off-by: Jan Kara <jack@suse.cz> > (backported from commit 9bdda4e9cf2dcecb60a0683b10ffb8cd7e5f2f45) > Signed-off-by: Po-Hsu Lin <po-hsu.lin@canonical.com> > --- > fs/notify/fsnotify.c | 13 +++---------- > 1 file changed, 3 insertions(+), 10 deletions(-) > > diff --git a/fs/notify/fsnotify.c b/fs/notify/fsnotify.c > index 613ec7e..6a862aa 100644 > --- a/fs/notify/fsnotify.c > +++ b/fs/notify/fsnotify.c > @@ -305,16 +305,9 @@ int fsnotify(struct inode *to_tell, __u32 mask, const void *data, int data_is, > > iter_info.srcu_idx = srcu_read_lock(&fsnotify_mark_srcu); > > - if ((mask & FS_MODIFY) || > - (test_mask & to_tell->i_fsnotify_mask)) { > - iter_info.inode_mark = > - fsnotify_first_mark(&to_tell->i_fsnotify_marks); > - } > - > - if (mnt && ((mask & FS_MODIFY) || > - (test_mask & mnt->mnt_fsnotify_mask))) { > - iter_info.inode_mark = > - fsnotify_first_mark(&to_tell->i_fsnotify_marks); > + iter_info.inode_mark = > + fsnotify_first_mark(&to_tell->i_fsnotify_marks); > + if (mnt) { > iter_info.vfsmount_mark = > fsnotify_first_mark(&mnt->mnt_fsnotify_marks); > } Applied to bionic/master-next branch. Thanks, Kleber
diff --git a/fs/notify/fsnotify.c b/fs/notify/fsnotify.c index 613ec7e..6a862aa 100644 --- a/fs/notify/fsnotify.c +++ b/fs/notify/fsnotify.c @@ -305,16 +305,9 @@ int fsnotify(struct inode *to_tell, __u32 mask, const void *data, int data_is, iter_info.srcu_idx = srcu_read_lock(&fsnotify_mark_srcu); - if ((mask & FS_MODIFY) || - (test_mask & to_tell->i_fsnotify_mask)) { - iter_info.inode_mark = - fsnotify_first_mark(&to_tell->i_fsnotify_marks); - } - - if (mnt && ((mask & FS_MODIFY) || - (test_mask & mnt->mnt_fsnotify_mask))) { - iter_info.inode_mark = - fsnotify_first_mark(&to_tell->i_fsnotify_marks); + iter_info.inode_mark = + fsnotify_first_mark(&to_tell->i_fsnotify_marks); + if (mnt) { iter_info.vfsmount_mark = fsnotify_first_mark(&mnt->mnt_fsnotify_marks); }