[LTP] [PATCH v2 2/3] Add fanotify_get_supported_init_flags() helper function
Amir Goldstein
amir73il@gmail.com
Thu Oct 20 17:36:51 CEST 2022
On Thu, Oct 20, 2022 at 4:08 PM Martin Doucha <mdoucha@suse.cz> wrote:
>
> Since FAN_ALL_INIT_FLAGS constant is deprecated, the kernel has added
> new fanotify feature flags and there is no other way to check
> for their support, we need to manually check which init flags needed
> by our tests are available.
>
> Signed-off-by: Martin Doucha <mdoucha@suse.cz>
> ---
>
> Changes since v1:
> - Fixed check for FAN_REPORT_NAME
> - Added longer patch description
>
> Thanks for pointing out the flag dependency between FAN_REPORT_NAME and
> FAN_REPORT_DIR_FID. I must have misread the documentation on that one.
> Since this appears to be the only flag with a dependency for now, let's
> keep the special handling simple. If the kernel adds more flags that are
> invalid on their own, we should handle that using a table.
>
> These flag support checks will be needed in multiple tests so it's better
> to have one common function that'll do them in one call than to copy-paste
> multiple setup steps from one test to another.
>
> Though it'd be great if kernel itself would provide a syscall that returns
> all supported fanotify init, mark or mask flags in one call.
>
> testcases/kernel/syscalls/fanotify/fanotify.h | 26 +++++++++++++++++++
> 1 file changed, 26 insertions(+)
>
> diff --git a/testcases/kernel/syscalls/fanotify/fanotify.h b/testcases/kernel/syscalls/fanotify/fanotify.h
> index 51078103e..f3ac1630f 100644
> --- a/testcases/kernel/syscalls/fanotify/fanotify.h
> +++ b/testcases/kernel/syscalls/fanotify/fanotify.h
> @@ -213,6 +213,32 @@ static inline int fanotify_init_flags_supported_by_kernel(unsigned int flags)
> return fanotify_init_flags_supported_on_fs(flags, NULL);
> }
>
> +/*
> + * Check support of given init flags one by one and return those which are
> + * supported.
> + */
> +static inline unsigned int fanotify_get_supported_init_flags(unsigned int flags,
> + const char *fname)
> +{
> + unsigned int flg, arg, ret = 0;
> +
> + for (flg = 1; flg; flg <<= 1) {
> + if (!(flags & flg))
> + continue;
> +
> + arg = flg;
> +
> + // FAN_REPORT_NAME is invalid without FAN_REPORT_DIR_FID
> + if (flg == FAN_REPORT_NAME)
> + arg |= FAN_REPORT_DIR_FID;
> +
NACK
this is not the only dependency
this is not a valid generic function.
I only gave a recipe in v1 review how I think the checks should be done.
Thanks,
Amir.
More information about the ltp
mailing list