diff mbox series

[Bionic,SRU,1/1] fsnotify: fix ignore mask logic in fsnotify()

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

Commit Message

Po-Hsu Lin Nov. 22, 2018, 11:31 a.m. UTC
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(-)

Comments

Khalid Elmously Nov. 26, 2018, 2:30 a.m. UTC | #1
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>
Kleber Sacilotto de Souza Dec. 18, 2018, 3:22 p.m. UTC | #2
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);
>  	}
Kleber Sacilotto de Souza Jan. 9, 2019, 3:09 p.m. UTC | #3
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 mbox series

Patch

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);
 	}