[LTP] [PATCH] fanotify01: Test setting two marks on different filesystems

Petr Vorel pvorel@suse.cz
Thu Jan 25 13:23:37 CET 2024


> When tested fs has zero fsid (e.g. fuse) and events are reported
> with fsid+fid, watching different filesystems with the same group is
> not supported.

> Try to setup a bogus mark on test tmp dir, in addition to the mark
> on the tested filesystem, to check if marks on different filesystems
> are supported.

> Run on all filesystem to test both fs with zero fsid (e.g. fuse) and
> fs with valid fsid.

> Signed-off-by: Amir Goldstein <amir73il@gmail.com>
> ---

Hi Amir,

> Petr,

> The fanotify tests changes that you already picked from my github [1]
> have to do with fixing new test failures in v6.7 and v6.8-rc1, dues to
> the fact that each of those kernel versions added new filesystems that
> support fanotify events with fid+fsid.

> This is the only change to test new functionality in v6.8-rc1, namely,
> that for fs with zero fsid (e.g. fuse), an fanotify group can watch a
> single fs instance.

This patch would have to be rebased, to be applicable of the previous one (which
touches more tests) in your branch.

I also wonder what I did wrong, the branch works after reboot, tested on:
1) mainline kernel 6.8.0-rc1 in rapido-linux
2) openSUSE kernel 6.8.0-rc1-2.gf4ba5db-default
3) 6.7.0-9.gaedda80-default

> To fix the problem that you reported with this test on exfat [2],
> I needed to make a distiction between the fs that do not support mount
> mark with fid due to having zero fsid (e.g. fuse) and those fs that
> do not support decoding fid (e.g. exfat).

> It is not urgent to merge this change to the upcoming code freeze -
> it's up to you, but since I already tested it I am posting it now.

I'll probably merge it after LTP release.

Kind regards,
Petr

> Thanks,
> Amir.

> [1] https://github.com/amir73il/ltp/commits/fanotify_fsid/
> [2] https://lore.kernel.org/ltp/CAOQ4uxh1VwoMK_ssjdcxo_sk4cw0pD_FcXZ6Lb2=XHLf21kGAw@mail.gmail.com/T/#mf15d751e8f77a497ee4387b0791219e800cde7ea

>  testcases/kernel/syscalls/fanotify/fanotify.h |  6 +++++-
>  .../kernel/syscalls/fanotify/fanotify01.c     | 19 +++++++++++++++++++
>  2 files changed, 24 insertions(+), 1 deletion(-)

> diff --git a/testcases/kernel/syscalls/fanotify/fanotify.h b/testcases/kernel/syscalls/fanotify/fanotify.h
> index e0d178bcc..554940a7e 100644
> --- a/testcases/kernel/syscalls/fanotify/fanotify.h
> +++ b/testcases/kernel/syscalls/fanotify/fanotify.h
> @@ -166,20 +166,23 @@ static inline int fanotify_flags_supported_on_fs(unsigned int init_flags,
>  {
>  	int fd;
>  	int rval = 0;
> +	int err = 0;

>  	fd = fanotify_init(init_flags, O_RDONLY);
> -
>  	if (fd < 0) {
> +		err = errno;
>  		if (errno == ENOSYS)
>  			tst_brk(TCONF, "fanotify not configured in kernel");
>  		if (errno != EINVAL)
>  			tst_brk(TBROK | TERRNO,
>  				"fanotify_init(%x, O_RDONLY) failed",
>  				init_flags);
> +		errno = err;
>  		return -1;
>  	}

>  	if (fname && fanotify_mark(fd, FAN_MARK_ADD | mark_flags, event_flags, AT_FDCWD, fname) < 0) {
> +		err = errno;
>  		if (errno == ENODEV || errno == EOPNOTSUPP || errno == EXDEV) {
>  			rval = strcmp(fname, OVL_MNT) ? -2 : -3;
>  		} else if (errno != EINVAL) {
> @@ -194,6 +197,7 @@ static inline int fanotify_flags_supported_on_fs(unsigned int init_flags,

>  	SAFE_CLOSE(fd);

> +	errno = err;
>  	return rval;
>  }

> diff --git a/testcases/kernel/syscalls/fanotify/fanotify01.c b/testcases/kernel/syscalls/fanotify/fanotify01.c
> index e4398f236..ba09f309d 100644
> --- a/testcases/kernel/syscalls/fanotify/fanotify01.c
> +++ b/testcases/kernel/syscalls/fanotify/fanotify01.c
> @@ -77,6 +77,7 @@ static char buf[BUF_SIZE];
>  static int fd_notify;
>  static int fan_report_fid_unsupported;
>  static int mount_mark_fid_unsupported;
> +static int inode_mark_fid_xdev;
>  static int filesystem_mark_unsupported;

>  static unsigned long long event_set[EVENT_MAX];
> @@ -328,6 +329,17 @@ pass:

>  	}

> +
> +	/*
> +	 * Try to setup a bogus mark on test tmp dir, to check if marks on
> +	 * different filesystems are supported.
> +	 * When tested fs has zero fsid (e.g. fuse) and events are reported
> +	 * with fsid+fid, watching different filesystems is not supported.
> +	 */
> +	ret = report_fid ? inode_mark_fid_xdev : 0;
> +	TST_EXP_FD_OR_FAIL(fanotify_mark(fd_notify, FAN_MARK_ADD, FAN_CLOSE_WRITE,
> +					 AT_FDCWD, "."), ret);
> +
>  	/* Remove mark to clear FAN_MARK_IGNORED_SURV_MODIFY */
>  	SAFE_FANOTIFY_MARK(fd_notify, FAN_MARK_REMOVE | mark->flag,
>  			  FAN_ACCESS | FAN_MODIFY | FAN_CLOSE | FAN_OPEN,
> @@ -352,6 +364,12 @@ static void setup(void)
>  	mount_mark_fid_unsupported = fanotify_flags_supported_on_fs(FAN_REPORT_FID,
>  								    FAN_MARK_MOUNT,
>  								    FAN_OPEN, fname);
> +	/* When mount mark is not supported due to zero fsid, multi fs inode marks are not supported */
> +	if (mount_mark_fid_unsupported && errno == ENODEV) {
> +		tst_res(TINFO, "filesystem %s does not support reporting events with fid from multi fs",
> +				tst_device->fs_type);
> +		inode_mark_fid_xdev = EXDEV;
> +	}
>  }

>  static void cleanup(void)
> @@ -368,6 +386,7 @@ static struct tst_test test = {
>  	.needs_root = 1,
>  	.mount_device = 1,
>  	.mntpoint = MOUNT_PATH,
> +	.all_filesystems = 1,
>  };

>  #else


More information about the ltp mailing list