[LTP] [PATCH v3 3/5] fanotify: Introduce SAFE_FANOTIFY_MARK() macro

Cyril Hrubis chrubis@suse.cz
Thu Nov 19 11:27:40 CET 2020


Hi!
>  	return rval;
>  }
> +
>  #define SAFE_FANOTIFY_INIT(fan, mode)  \
>  	safe_fanotify_init(__FILE__, __LINE__, (fan), (mode))
>  
> @@ -189,6 +190,41 @@ struct fanotify_event_info_fid {
>  #define MAX_HANDLE_SZ		128
>  #endif
>  
> +static inline int safe_fanotify_mark(const char *file, const int lineno,
> +			int fd, unsigned int flags, uint64_t mask,
> +			int dfd, const char *pathname)
> +{
> +	int rval;
> +
> +	rval = fanotify_mark(fd, flags, mask, dfd, pathname);
> +
> +	if (rval == -1) {
> +		if (errno == ENODEV || errno == EOPNOTSUPP || errno == EXDEV)
> +			tst_brk(TCONF,
> +				"%s:%d: FAN_REPORT_FID not supported on %s filesystem",
> +				file, lineno, tst_device->fs_type);

I guess that we should use tst_brk_() and pass the file and lineno here
and in the rest of the tst_ calls in this function.

> +		if (errno == EINVAL && (flags & FAN_MARK_FILESYSTEM) == FAN_MARK_FILESYSTEM) {

The comparsion in (flags & FAN_MARK_FILESYSTEM) == FAN_MARK_FILESYSTEM
seems to be useless. How is this different from a simple
(flags & MARK_FILESYSTEM) when converted into a boolean value?

> +				tst_brk(TCONF,
> +					"%s:%d: FAN_MARK_FILESYSTEM not supported by kernel?",
> +					file, lineno);
> +		}
> +
> +		tst_brk(TBROK | TERRNO, "%s:%d: fanotify_mark() failed",
> +			file, lineno);
> +	}
> +
> +	if (rval < -1) {
> +		tst_brk(TBROK | TERRNO, "%s:%d: invalid fanotify_mark() return %d",
> +			file, lineno, rval);
> +	}
> +
> +	return rval;
> +}
> +
> +#define SAFE_FANOTIFY_MARK(fd, flags, mask, dfd, pathname)  \
> +	safe_fanotify_mark(__FILE__, __LINE__, (fd), (flags), (mask), (dfd), (pathname))
> +
>  /*
>   * Helper function used to obtain fsid and file_handle for a given path.
>   * Used by test files correlated to FAN_REPORT_FID functionality.
> @@ -242,7 +278,6 @@ static inline void fanotify_save_fid(const char *path,
>  #define INIT_FANOTIFY_MARK_TYPE(t) \
>  	{ FAN_MARK_ ## t, "FAN_MARK_" #t }
>  
> -
>  static inline void fanotify_access_permissions_supported_by_kernel(void)
>  {
>  	int fd;
> diff --git a/testcases/kernel/syscalls/fanotify/fanotify01.c b/testcases/kernel/syscalls/fanotify/fanotify01.c
> index 03e453f41..7690f6b88 100644
> --- a/testcases/kernel/syscalls/fanotify/fanotify01.c
> +++ b/testcases/kernel/syscalls/fanotify/fanotify01.c
> @@ -101,19 +101,8 @@ static void test_fanotify(unsigned int n)
>  			"failed", tc->init_flags);
>  	}
>  
> -	if (fanotify_mark(fd_notify, FAN_MARK_ADD | mark->flag,
> -			  FAN_ACCESS | FAN_MODIFY | FAN_CLOSE | FAN_OPEN,
> -			  AT_FDCWD, fname) < 0) {
> -		if (errno == EINVAL && mark->flag == FAN_MARK_FILESYSTEM) {
> -			tst_res(TCONF,
> -				"FAN_MARK_FILESYSTEM not supported in kernel?");
> -			return;
> -		}

Here we had tst_res(TCONF, ...) followed by a return but we will can
tst_brk() after the change. I guess that we may skip part of the test on
older kernels with that change.

> -		tst_brk(TBROK | TERRNO,
> -			"fanotify_mark (%d, FAN_MARK_ADD, FAN_ACCESS | %s | "
> -			"FAN_MODIFY | FAN_CLOSE | FAN_OPEN, AT_FDCWD, %s) "
> -			"failed", fd_notify, mark->name, fname);
> -	}
> +	SAFE_FANOTIFY_MARK(fd_notify, FAN_MARK_ADD | mark->flag,
> +			  FAN_ACCESS | FAN_MODIFY | FAN_CLOSE | FAN_OPEN, AT_FDCWD, fname);
>  
>  	/*
>  	 * generate sequence of events
> @@ -161,14 +150,9 @@ static void test_fanotify(unsigned int n)
>  	 */
>  
>  	/* Ignore access events */
> -	if (fanotify_mark(fd_notify,
> +	SAFE_FANOTIFY_MARK(fd_notify,
>  			  FAN_MARK_ADD | mark->flag | FAN_MARK_IGNORED_MASK,
> -			  FAN_ACCESS, AT_FDCWD, fname) < 0) {
> -		tst_brk(TBROK | TERRNO,
> -			"fanotify_mark (%d, FAN_MARK_ADD | %s | "
> -			"FAN_MARK_IGNORED_MASK, FAN_ACCESS, AT_FDCWD, %s) "
> -			"failed", fd_notify, mark->name, fname);
> -	}
> +			  FAN_ACCESS, AT_FDCWD, fname);
>  
>  	fd = SAFE_OPEN(fname, O_RDWR);
>  	event_set[tst_count] = FAN_OPEN;
> @@ -211,15 +195,9 @@ static void test_fanotify(unsigned int n)
>  	 * Now ignore open & close events regardless of file
>  	 * modifications
>  	 */
> -	if (fanotify_mark(fd_notify, FAN_MARK_ADD | mark->flag |
> +	SAFE_FANOTIFY_MARK(fd_notify, FAN_MARK_ADD | mark->flag |
>  			  FAN_MARK_IGNORED_MASK | FAN_MARK_IGNORED_SURV_MODIFY,
> -			  FAN_OPEN | FAN_CLOSE, AT_FDCWD, fname) < 0) {
> -		tst_brk(TBROK | TERRNO,
> -			"fanotify_mark (%d, FAN_MARK_ADD | %s | "
> -			"FAN_MARK_IGNORED_MASK | FAN_MARK_IGNORED_SURV_MODIFY, "
> -			"FAN_OPEN | FAN_CLOSE, AT_FDCWD, %s) failed",
> -			fd_notify, mark->name, fname);
> -	}
> +			  FAN_OPEN | FAN_CLOSE, AT_FDCWD, fname);
>  
>  	/* This event should be ignored */
>  	fd = SAFE_OPEN(fname, O_RDWR);
> @@ -240,15 +218,9 @@ static void test_fanotify(unsigned int n)
>  	len += ret;
>  
>  	/* Now remove open and close from ignored mask */
> -	if (fanotify_mark(fd_notify,
> +	SAFE_FANOTIFY_MARK(fd_notify,
>  			  FAN_MARK_REMOVE | mark->flag | FAN_MARK_IGNORED_MASK,
> -			  FAN_OPEN | FAN_CLOSE, AT_FDCWD, fname) < 0) {
> -		tst_brk(TBROK | TERRNO,
> -			"fanotify_mark (%d, FAN_MARK_REMOVE | %s | "
> -			"FAN_MARK_IGNORED_MASK, FAN_OPEN | FAN_CLOSE, "
> -			"AT_FDCWD, %s) failed", fd_notify,
> -			mark->name, fname);
> -	}
> +			  FAN_OPEN | FAN_CLOSE, AT_FDCWD, fname);
>  
>  	SAFE_CLOSE(fd);
>  	event_set[tst_count] = FAN_CLOSE_WRITE;
> @@ -344,14 +316,9 @@ pass:
>  
>  	}
>  	/* Remove mark to clear FAN_MARK_IGNORED_SURV_MODIFY */
> -	if (fanotify_mark(fd_notify, FAN_MARK_REMOVE | mark->flag,
> +	SAFE_FANOTIFY_MARK(fd_notify, FAN_MARK_REMOVE | mark->flag,
>  			  FAN_ACCESS | FAN_MODIFY | FAN_CLOSE | FAN_OPEN,
> -			  AT_FDCWD, fname) < 0) {
> -		tst_brk(TBROK | TERRNO,
> -			"fanotify_mark (%d, FAN_MARK_REMOVE | %s, FAN_ACCESS | "
> -			"FAN_MODIFY | FAN_CLOSE | FAN_OPEN, AT_FDCWD, %s) "
> -			"failed", fd_notify, mark->name, fname);
> -	}
> +			  AT_FDCWD, fname);
>  
>  	SAFE_CLOSE(fd_notify);
>  }
> diff --git a/testcases/kernel/syscalls/fanotify/fanotify02.c b/testcases/kernel/syscalls/fanotify/fanotify02.c
> index c578e0ae8..36c87648e 100644
> --- a/testcases/kernel/syscalls/fanotify/fanotify02.c
> +++ b/testcases/kernel/syscalls/fanotify/fanotify02.c
> @@ -46,16 +46,9 @@ void test01(void)
>  
>  	int tst_count = 0;
>  
> -	if (fanotify_mark(fd_notify, FAN_MARK_ADD, FAN_ACCESS |
> -			  FAN_MODIFY | FAN_CLOSE | FAN_OPEN |
> -			  FAN_EVENT_ON_CHILD | FAN_ONDIR, AT_FDCWD,
> -			  ".") < 0) {
> -		tst_brk(TBROK | TERRNO,
> -			"fanotify_mark (%d, FAN_MARK_ADD, FAN_ACCESS | "
> -			"FAN_MODIFY | FAN_CLOSE | FAN_OPEN | "
> -			"FAN_EVENT_ON_CHILD | FAN_ONDIR, AT_FDCWD, '.') "
> -			"failed", fd_notify);
> -	}
> +	SAFE_FANOTIFY_MARK(fd_notify, FAN_MARK_ADD, FAN_ACCESS |
> +			  FAN_MODIFY | FAN_CLOSE | FAN_OPEN | FAN_EVENT_ON_CHILD |
> +			  FAN_ONDIR, AT_FDCWD, ".");
>  
>  	/*
>  	 * generate sequence of events
> @@ -102,13 +95,8 @@ void test01(void)
>  	/*
>  	 * now remove child mark
>  	 */
> -	if (fanotify_mark(fd_notify, FAN_MARK_REMOVE,
> -			  FAN_EVENT_ON_CHILD, AT_FDCWD, ".") < 0) {
> -		tst_brk(TBROK | TERRNO,
> -			"fanotify_mark (%d, FAN_MARK REMOVE, "
> -			"FAN_EVENT_ON_CHILD, AT_FDCWD, '.') failed",
> -			fd_notify);
> -	}
> +	SAFE_FANOTIFY_MARK(fd_notify, FAN_MARK_REMOVE,
> +			  FAN_EVENT_ON_CHILD, AT_FDCWD, ".");
>  
>  	/*
>  	 * Do something to verify events didn't get generated
> diff --git a/testcases/kernel/syscalls/fanotify/fanotify03.c b/testcases/kernel/syscalls/fanotify/fanotify03.c
> index fbec652f6..e98694a66 100644
> --- a/testcases/kernel/syscalls/fanotify/fanotify03.c
> +++ b/testcases/kernel/syscalls/fanotify/fanotify03.c
> @@ -221,22 +221,8 @@ static int setup_mark(unsigned int n)
>  	fd_notify = SAFE_FANOTIFY_INIT(FAN_CLASS_CONTENT, O_RDONLY);
>  
>  	for (; i < ARRAY_SIZE(files); i++) {
> -		if (fanotify_mark(fd_notify, FAN_MARK_ADD | mark->flag,
> -				  tc->mask, AT_FDCWD, files[i]) < 0) {
> -			if (errno == EINVAL &&
> -					mark->flag == FAN_MARK_FILESYSTEM) {
> -				tst_res(TCONF,
> -					"FAN_MARK_FILESYSTEM not supported in "
> -					"kernel?");
> -				return -1;


Here as well.


> -			} else {
> -				tst_brk(TBROK | TERRNO,
> -					"fanotify_mark(%d, FAN_MARK_ADD | %s, "
> -					"FAN_ACCESS_PERM | FAN_OPEN_PERM, "
> -					"AT_FDCWD, %s) failed.",
> -					fd_notify, mark->name, fname);
> -			}
> -		}
> +		SAFE_FANOTIFY_MARK(fd_notify, FAN_MARK_ADD | mark->flag,
> +				  tc->mask, AT_FDCWD, files[i]);
>  	}
>  
>  	return 0;
> diff --git a/testcases/kernel/syscalls/fanotify/fanotify04.c b/testcases/kernel/syscalls/fanotify/fanotify04.c
> index 722ad5d41..a24e7f7c3 100644
> --- a/testcases/kernel/syscalls/fanotify/fanotify04.c
> +++ b/testcases/kernel/syscalls/fanotify/fanotify04.c
> @@ -77,13 +77,8 @@ static void check_mark(char *file, unsigned long long flag, char *flagstr,
>  		if (test_event)
>  			test_event(file);
>  
> -		if (fanotify_mark(fd_notify, FAN_MARK_REMOVE | flag,
> -				  FAN_OPEN, AT_FDCWD, file) < 0) {
> -			tst_brk(TBROK | TERRNO,
> -				"fanotify_mark (%d, FAN_MARK_REMOVE | %s, "
> -				"FAN_OPEN, AT_FDCWD, '%s') failed",
> -				fd_notify, flagstr, file);
> -		}
> +		SAFE_FANOTIFY_MARK(fd_notify, FAN_MARK_REMOVE | flag,
> +				  FAN_OPEN, AT_FDCWD, file);
>  	}
>  }
>  
> @@ -191,29 +186,14 @@ void test01(void)
>  	CHECK_MARK(sname, 0, 0, test_open_file);
>  
>  	/* Verify FAN_MARK_FLUSH destroys all inode marks */
> -	if (fanotify_mark(fd_notify, FAN_MARK_ADD,
> -			  FAN_OPEN, AT_FDCWD, fname) < 0) {
> -		tst_brk(TBROK | TERRNO,
> -			"fanotify_mark (%d, FAN_MARK_ADD, FAN_OPEN, "
> -			"AT_FDCWD, '%s') failed", fd_notify, fname);
> -	}
> -	if (fanotify_mark(fd_notify, FAN_MARK_ADD,
> -			  FAN_OPEN | FAN_ONDIR, AT_FDCWD, dir) < 0) {
> -		tst_brk(TBROK | TERRNO,
> -			"fanotify_mark (%d, FAN_MARK_ADD, FAN_OPEN | "
> -			"FAN_ONDIR, AT_FDCWD, '%s') failed", fd_notify,
> -			dir);
> -	}
> +	SAFE_FANOTIFY_MARK(fd_notify, FAN_MARK_ADD, FAN_OPEN, AT_FDCWD, fname);
> +	SAFE_FANOTIFY_MARK(fd_notify, FAN_MARK_ADD, FAN_OPEN | FAN_ONDIR,
> +			   AT_FDCWD, dir);
>  	open_file(fname);
>  	verify_event(S_IFREG);
>  	open_dir(dir);
>  	verify_event(S_IFDIR);
> -	if (fanotify_mark(fd_notify, FAN_MARK_FLUSH,
> -			  0, AT_FDCWD, ".") < 0) {
> -		tst_brk(TBROK | TERRNO,
> -			"fanotify_mark (%d, FAN_MARK_FLUSH, 0, "
> -			"AT_FDCWD, '.') failed", fd_notify);
> -	}
> +	SAFE_FANOTIFY_MARK(fd_notify, FAN_MARK_FLUSH, 0, AT_FDCWD, ".");
>  
>  	open_dir(dir);
>  	verify_no_event();
> diff --git a/testcases/kernel/syscalls/fanotify/fanotify05.c b/testcases/kernel/syscalls/fanotify/fanotify05.c
> index e53cc333a..c13b9ad7b 100644
> --- a/testcases/kernel/syscalls/fanotify/fanotify05.c
> +++ b/testcases/kernel/syscalls/fanotify/fanotify05.c
> @@ -107,13 +107,8 @@ static void setup(void)
>  	fd_notify = SAFE_FANOTIFY_INIT(FAN_CLASS_NOTIF | FAN_NONBLOCK,
>  			O_RDONLY);
>  
> -	if (fanotify_mark(fd_notify, FAN_MARK_MOUNT | FAN_MARK_ADD, FAN_OPEN,
> -			  AT_FDCWD, MOUNT_PATH) < 0) {
> -		tst_brk(TBROK | TERRNO,
> -			"fanotify_mark (%d, FAN_MARK_MOUNT | FAN_MARK_ADD, "
> -			"FAN_OPEN, AT_FDCWD, \".\") failed",
> -			fd_notify);
> -	}
> +	SAFE_FANOTIFY_MARK(fd_notify, FAN_MARK_MOUNT | FAN_MARK_ADD, FAN_OPEN,
> +			  AT_FDCWD, MOUNT_PATH);
>  }
>  
>  static void cleanup(void)
> diff --git a/testcases/kernel/syscalls/fanotify/fanotify06.c b/testcases/kernel/syscalls/fanotify/fanotify06.c
> index 99e312a4f..ac4901f6f 100644
> --- a/testcases/kernel/syscalls/fanotify/fanotify06.c
> +++ b/testcases/kernel/syscalls/fanotify/fanotify06.c
> @@ -78,7 +78,6 @@ static struct tcase {
>  static void create_fanotify_groups(void)
>  {
>  	unsigned int p, i;
> -	int ret;
>  
>  	for (p = 0; p < FANOTIFY_PRIORITIES; p++) {
>  		for (i = 0; i < GROUPS_PER_PRIO; i++) {
> @@ -87,32 +86,20 @@ static void create_fanotify_groups(void)
>  							     O_RDONLY);
>  
>  			/* Add mount mark for each group */
> -			ret = fanotify_mark(fd_notify[p][i],
> +			SAFE_FANOTIFY_MARK(fd_notify[p][i],
>  					    FAN_MARK_ADD | FAN_MARK_MOUNT,
>  					    FAN_MODIFY,
>  					    AT_FDCWD, fname);
> -			if (ret < 0) {
> -				tst_brk(TBROK | TERRNO,
> -					"fanotify_mark(%d, FAN_MARK_ADD | "
> -					"FAN_MARK_MOUNT, FAN_MODIFY, AT_FDCWD,"
> -					" %s) failed", fd_notify[p][i], fname);
> -			}
> +
>  			/* Add ignore mark for groups with higher priority */
>  			if (p == 0)
>  				continue;
> -			ret = fanotify_mark(fd_notify[p][i],
> +
> +			SAFE_FANOTIFY_MARK(fd_notify[p][i],
>  					    FAN_MARK_ADD |
>  					    FAN_MARK_IGNORED_MASK |
>  					    FAN_MARK_IGNORED_SURV_MODIFY,
>  					    FAN_MODIFY, AT_FDCWD, fname);
> -			if (ret < 0) {
> -				tst_brk(TBROK | TERRNO,
> -					"fanotify_mark(%d, FAN_MARK_ADD | "
> -					"FAN_MARK_IGNORED_MASK | "
> -					"FAN_MARK_IGNORED_SURV_MODIFY, "
> -					"FAN_MODIFY, AT_FDCWD, %s) failed",
> -					fd_notify[p][i], fname);
> -			}
>  		}
>  	}
>  }
> diff --git a/testcases/kernel/syscalls/fanotify/fanotify07.c b/testcases/kernel/syscalls/fanotify/fanotify07.c
> index f4e8ac9e6..8b2c1c4c9 100644
> --- a/testcases/kernel/syscalls/fanotify/fanotify07.c
> +++ b/testcases/kernel/syscalls/fanotify/fanotify07.c
> @@ -102,20 +102,7 @@ static int setup_instance(void)
>  	int fd;
>  
>  	fd = SAFE_FANOTIFY_INIT(FAN_CLASS_CONTENT, O_RDONLY);
> -
> -	if (fanotify_mark(fd, FAN_MARK_ADD, FAN_ACCESS_PERM, AT_FDCWD,
> -			  fname) < 0) {
> -		close(fd);
> -		if (errno == EINVAL) {
> -			tst_brk(TCONF | TERRNO,
> -				"CONFIG_FANOTIFY_ACCESS_PERMISSIONS not "
> -				"configured in kernel?");
> -		} else {
> -			tst_brk(TBROK | TERRNO,
> -				"fanotify_mark (%d, FAN_MARK_ADD, FAN_ACCESS_PERM, "
> -				"AT_FDCWD, %s) failed.", fd, fname);
> -		}
> -	}
> +	SAFE_FANOTIFY_MARK(fd, FAN_MARK_ADD, FAN_ACCESS_PERM, AT_FDCWD, fname);
>  
>  	return fd;
>  }
> diff --git a/testcases/kernel/syscalls/fanotify/fanotify09.c b/testcases/kernel/syscalls/fanotify/fanotify09.c
> index 83210bc1c..9c9938619 100644
> --- a/testcases/kernel/syscalls/fanotify/fanotify09.c
> +++ b/testcases/kernel/syscalls/fanotify/fanotify09.c
> @@ -99,7 +99,6 @@ static void create_fanotify_groups(struct tcase *tc)
>  {
>  	struct fanotify_mark_type *mark = &tc->mark;
>  	unsigned int i, onchild, ondir = tc->ondir;
> -	int ret;
>  
>  	for (i = 0; i < NUM_GROUPS; i++) {
>  		fd_notify[i] = SAFE_FANOTIFY_INIT(FAN_CLASS_NOTIF |
> @@ -111,17 +110,11 @@ static void create_fanotify_groups(struct tcase *tc)
>  		 * but only the first group requests events on dir.
>  		 */
>  		onchild = (i == 0) ? FAN_EVENT_ON_CHILD | ondir : 0;
> -		ret = fanotify_mark(fd_notify[i],
> +		SAFE_FANOTIFY_MARK(fd_notify[i],
>  				    FAN_MARK_ADD | mark->flag,
>  				    FAN_CLOSE_NOWRITE | onchild,
>  				    AT_FDCWD, tc->testdir);
> -		if (ret < 0) {
> -			tst_brk(TBROK | TERRNO,
> -				"fanotify_mark(%d, FAN_MARK_ADD | %s, "
> -				"%x, AT_FDCWD, '%s') failed",
> -				fd_notify[i], mark->name,
> -				FAN_CLOSE_NOWRITE | ondir, tc->testdir);
> -		}
> +
>  		/*
>  		 * Add inode mark on parent for each group with MODIFY event,
>  		 * but only the first group requests events on child.
> @@ -129,15 +122,9 @@ static void create_fanotify_groups(struct tcase *tc)
>  		 * setting the DCACHE_FSNOTIFY_PARENT_WATCHED dentry
>  		 * flag.
>  		 */
> -		ret = fanotify_mark(fd_notify[i], FAN_MARK_ADD,
> +		SAFE_FANOTIFY_MARK(fd_notify[i], FAN_MARK_ADD,
>  				    FAN_MODIFY | ondir | onchild,
>  				    AT_FDCWD, ".");
> -		if (ret < 0) {
> -			tst_brk(TBROK | TERRNO,
> -				"fanotify_mark(%d, FAN_MARK_ADD, "
> -				"%x, AT_FDCWD, '.') failed",
> -				fd_notify[i], FAN_MODIFY | ondir | onchild);
> -		}
>  	}
>  }
>  
> diff --git a/testcases/kernel/syscalls/fanotify/fanotify10.c b/testcases/kernel/syscalls/fanotify/fanotify10.c
> index b95efb998..ab906f3fb 100644
> --- a/testcases/kernel/syscalls/fanotify/fanotify10.c
> +++ b/testcases/kernel/syscalls/fanotify/fanotify10.c
> @@ -288,7 +288,6 @@ static int create_fanotify_groups(unsigned int n)
>  	struct fanotify_mark_type *mark, *ignore_mark;
>  	unsigned int mark_ignored, mask;
>  	unsigned int p, i;
> -	int ret;
>  
>  	mark = &fanotify_mark_types[tc->mark_type];
>  	ignore_mark = &fanotify_mark_types[tc->ignore_mark_type];
> @@ -317,32 +316,12 @@ static int create_fanotify_groups(unsigned int n)
>  			 * FAN_EVENT_ON_CHILD has no effect on filesystem/mount
>  			 * or inode mark on non-directory.
>  			 */
> -			ret = fanotify_mark(fd_notify[p][i],
> +			SAFE_FANOTIFY_MARK(fd_notify[p][i],
>  					    FAN_MARK_ADD | mark->flag,
>  					    tc->expected_mask_without_ignore |
>  					    FAN_EVENT_ON_CHILD,
>  					    AT_FDCWD, tc->mark_path);
> -			if (ret < 0) {
> -				if (errno == EINVAL &&
> -				    tc->expected_mask_without_ignore &
> -				    FAN_OPEN_EXEC) {
> -					tst_res(TCONF,
> -						"FAN_OPEN_EXEC not supported "
> -						"by kernel?");
> -					return -1;
> -				} else if (errno == EINVAL &&
> -					tc->mark_type == FANOTIFY_FILESYSTEM) {
> -					tst_res(TCONF,
> -						"FAN_MARK_FILESYSTEM not "
> -						"supported in kernel?");
> -					return -1;
> -				}
> -				tst_brk(TBROK | TERRNO,
> -					"fanotify_mark(%d, FAN_MARK_ADD | %s,"
> -					"FAN_OPEN, AT_FDCWD, %s) failed",
> -					fd_notify[p][i], mark->name,
> -					tc->mark_path);
> -			}
> +
>  			/* Add ignore mark for groups with higher priority */
>  			if (p == 0)
>  				continue;
> @@ -351,18 +330,9 @@ static int create_fanotify_groups(unsigned int n)
>  			mark_ignored = FAN_MARK_IGNORED_MASK |
>  					FAN_MARK_IGNORED_SURV_MODIFY;
>  add_mark:
> -			ret = fanotify_mark(fd_notify[p][i],
> +			SAFE_FANOTIFY_MARK(fd_notify[p][i],
>  					    FAN_MARK_ADD | ignore_mark->flag | mark_ignored,
>  					    mask, AT_FDCWD, tc->ignore_path);
> -			if (ret < 0) {
> -				tst_brk(TBROK | TERRNO,
> -					"fanotify_mark(%d, FAN_MARK_ADD | %s | %s, "
> -					"%x, AT_FDCWD, %s) failed",
> -					fd_notify[p][i], ignore_mark->name,
> -					mark_ignored ? "FAN_MARK_IGNORED_MASK | "
> -					"FAN_MARK_IGNORED_SURV_MODIFY" : "",
> -					mask, tc->ignore_path);
> -			}
>  
>  			/*
>  			 * If ignored mask is on a parent watching children,
> diff --git a/testcases/kernel/syscalls/fanotify/fanotify11.c b/testcases/kernel/syscalls/fanotify/fanotify11.c
> index 9e8606c72..56b7153f8 100644
> --- a/testcases/kernel/syscalls/fanotify/fanotify11.c
> +++ b/testcases/kernel/syscalls/fanotify/fanotify11.c
> @@ -55,7 +55,6 @@ static unsigned int tcases[] = {
>  
>  void test01(unsigned int i)
>  {
> -	int ret;
>  	pthread_t p_id;
>  	struct fanotify_event_metadata event;
>  	int fd_notify;
> @@ -76,10 +75,8 @@ void test01(unsigned int i)
>  				tcases[i]);
>  	}
>  
> -	ret = fanotify_mark(fd_notify, FAN_MARK_ADD,
> +	SAFE_FANOTIFY_MARK(fd_notify, FAN_MARK_ADD,
>  			FAN_ALL_EVENTS | FAN_EVENT_ON_CHILD, AT_FDCWD, ".");
> -	if (ret != 0)
> -		tst_brk(TBROK, "fanotify_mark FAN_MARK_ADD fail ret=%d", ret);
>  
>  	SAFE_PTHREAD_CREATE(&p_id, NULL, thread_create_file, NULL);
>  
> diff --git a/testcases/kernel/syscalls/fanotify/fanotify12.c b/testcases/kernel/syscalls/fanotify/fanotify12.c
> index bddbdc37c..9adf8bc8a 100644
> --- a/testcases/kernel/syscalls/fanotify/fanotify12.c
> +++ b/testcases/kernel/syscalls/fanotify/fanotify12.c
> @@ -146,31 +146,15 @@ static int setup_mark(unsigned int n)
>  
>  	for (; i < ARRAY_SIZE(files); i++) {
>  		/* Setup normal mark on object */
> -		if (fanotify_mark(fd_notify, FAN_MARK_ADD | mark->flag,
> -					tc->mask, AT_FDCWD, files[i]) < 0) {
> -			tst_brk(TBROK | TERRNO,
> -				"fanotify_mark(%d, FAN_MARK_ADD | %s, "
> -				"%llx, AT_FDCWD, %s) failed",
> -				fd_notify,
> -				mark->name,
> -				tc->mask,
> -				files[i]);
> -		}
> +		SAFE_FANOTIFY_MARK(fd_notify, FAN_MARK_ADD | mark->flag,
> +					tc->mask, AT_FDCWD, files[i]);
>  
>  		/* Setup ignore mark on object */
>  		if (tc->ignore_mask) {
> -			if (fanotify_mark(fd_notify, FAN_MARK_ADD | mark->flag
> +			SAFE_FANOTIFY_MARK(fd_notify, FAN_MARK_ADD | mark->flag
>  						| FAN_MARK_IGNORED_MASK,
>  						tc->ignore_mask, AT_FDCWD,
> -						files[i]) < 0) {
> -				tst_brk(TBROK | TERRNO,
> -					"fanotify_mark (%d, "
> -					"FAN_MARK_ADD | %s "
> -					"| FAN_MARK_IGNORED_MASK, "
> -					"%llx, AT_FDCWD, %s) failed",
> -					fd_notify, mark->name,
> -					tc->ignore_mask, files[i]);
> -			}
> +						files[i]);
>  		}
>  	}
>  
> diff --git a/testcases/kernel/syscalls/fanotify/fanotify13.c b/testcases/kernel/syscalls/fanotify/fanotify13.c
> index c2a21bb66..997efaf08 100644
> --- a/testcases/kernel/syscalls/fanotify/fanotify13.c
> +++ b/testcases/kernel/syscalls/fanotify/fanotify13.c
> @@ -116,28 +116,8 @@ static int setup_marks(unsigned int fd, struct test_case_t *tc)
>  	struct fanotify_mark_type *mark = &tc->mark;
>  
>  	for (i = 0; i < ARRAY_SIZE(objects); i++) {
> -		if (fanotify_mark(fd, FAN_MARK_ADD | mark->flag, tc->mask,
> -					AT_FDCWD, objects[i].path) == -1) {
> -			if (errno == EINVAL &&
> -				mark->flag & FAN_MARK_FILESYSTEM) {
> -				tst_res(TCONF,
> -					"FAN_MARK_FILESYSTEM not supported by "
> -					"kernel");
> -				return 1;
> -			} else if (errno == ENODEV &&
> -				   !objects[i].fid.fsid.val[0] &&
> -				   !objects[i].fid.fsid.val[1]) {
> -				tst_res(TCONF,
> -					"FAN_REPORT_FID not supported on "
> -					"filesystem type %s",
> -					tst_device->fs_type);
> -				return 1;

And here as well.

> -			}
> -			tst_brk(TBROK | TERRNO,
> -				"fanotify_mark(%d, FAN_MARK_ADD, FAN_OPEN, "
> -				"AT_FDCWD, %s) failed",
> -				fanotify_fd, objects[i].path);
> -		}
> +		SAFE_FANOTIFY_MARK(fd, FAN_MARK_ADD | mark->flag, tc->mask,
> +					AT_FDCWD, objects[i].path);
>  
>  		/* Setup the expected mask for each generated event */
>  		event_set[i].expected_mask = tc->mask;

Otherwise it looks like a nice cleanup.

-- 
Cyril Hrubis
chrubis@suse.cz


More information about the ltp mailing list