Message ID | 20210629191035.681913-15-krisman@collabora.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | File system wide monitoring | expand |
Hi Gabriel, I love your patch! Yet something to improve: [auto build test ERROR on ext3/fsnotify] [also build test ERROR on ext4/dev linus/master v5.13 next-20210629] [cannot apply to tytso-fscrypt/master] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/0day-ci/linux/commits/Gabriel-Krisman-Bertazi/File-system-wide-monitoring/20210630-031347 base: https://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs.git fsnotify config: arm64-allyesconfig (attached as .config) compiler: aarch64-linux-gcc (GCC) 9.3.0 reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://github.com/0day-ci/linux/commit/746524d8db08a041fed90e41b15c8e8ca69cb22d git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Gabriel-Krisman-Bertazi/File-system-wide-monitoring/20210630-031347 git checkout 746524d8db08a041fed90e41b15c8e8ca69cb22d # save the attached .config to linux build tree mkdir build_dir COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross O=build_dir ARCH=arm64 SHELL=/bin/bash samples/ If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> All errors (new ones prefixed by >>): >> samples/fanotify/fs-monitor.c:7:10: fatal error: errno.h: No such file or directory 7 | #include <errno.h> | ^~~~~~~~~ compilation terminated. vim +7 samples/fanotify/fs-monitor.c > 7 #include <errno.h> 8 #include <err.h> 9 #include <stdlib.h> 10 #include <stdio.h> 11 #include <fcntl.h> 12 #include <sys/fanotify.h> 13 #include <sys/types.h> 14 #include <unistd.h> 15 #include <sys/stat.h> 16 #include <sys/types.h> 17 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Hi Gabriel, I love your patch! Yet something to improve: [auto build test ERROR on ext3/fsnotify] [also build test ERROR on ext4/dev linus/master v5.13 next-20210629] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/0day-ci/linux/commits/Gabriel-Krisman-Bertazi/File-system-wide-monitoring/20210630-031347 base: https://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs.git fsnotify config: x86_64-allyesconfig (attached as .config) compiler: gcc-9 (Debian 9.3.0-22) 9.3.0 reproduce (this is a W=1 build): # https://github.com/0day-ci/linux/commit/746524d8db08a041fed90e41b15c8e8ca69cb22d git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Gabriel-Krisman-Bertazi/File-system-wide-monitoring/20210630-031347 git checkout 746524d8db08a041fed90e41b15c8e8ca69cb22d # save the attached .config to linux build tree mkdir build_dir make W=1 O=build_dir ARCH=x86_64 SHELL=/bin/bash samples/ If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> All errors (new ones prefixed by >>): samples/fanotify/fs-monitor.c: In function 'handle_notifications': >> samples/fanotify/fs-monitor.c:84:32: error: 'mount_fd' undeclared (first use in this function) 84 | bad_file = open_by_handle_at(mount_fd, file_handle, O_PATH); | ^~~~~~~~ samples/fanotify/fs-monitor.c:84:32: note: each undeclared identifier is reported only once for each function it appears in samples/fanotify/fs-monitor.c: In function 'main': samples/fanotify/fs-monitor.c:111:2: error: 'mount_fd' undeclared (first use in this function) 111 | mount_fd = open(argv[1], O_RDONLY); | ^~~~~~~~ vim +/mount_fd +84 samples/fanotify/fs-monitor.c 30 31 static void handle_notifications(char *buffer, int len) 32 { 33 struct fanotify_event_metadata *metadata; 34 struct fanotify_event_info_error *error; 35 struct fanotify_event_info_fid *fid; 36 struct file_handle *file_handle; 37 int bad_file; 38 int ret; 39 struct stat stat; 40 char *next; 41 42 for (metadata = (struct fanotify_event_metadata *) buffer; 43 FAN_EVENT_OK(metadata, len); 44 metadata = FAN_EVENT_NEXT(metadata, len)) { 45 next = (char *)metadata + metadata->event_len; 46 if (metadata->mask != FAN_FS_ERROR) { 47 printf("unexpected FAN MARK: %llx\n", metadata->mask); 48 goto next_event; 49 } else if (metadata->fd != FAN_NOFD) { 50 printf("Unexpected fd (!= FAN_NOFD)\n"); 51 goto next_event; 52 } 53 54 printf("FAN_FS_ERROR found len=%d\n", metadata->event_len); 55 56 error = (struct fanotify_event_info_error *) (metadata+1); 57 if (error->hdr.info_type != FAN_EVENT_INFO_TYPE_ERROR) { 58 printf("unknown record: %d (Expecting TYPE_ERROR)\n", 59 error->hdr.info_type); 60 goto next_event; 61 } 62 63 printf("\tGeneric Error Record: len=%d\n", error->hdr.len); 64 printf("\terror: %d\n", error->error); 65 printf("\terror_count: %d\n", error->error_count); 66 67 fid = (struct fanotify_event_info_fid *) (error + 1); 68 69 if ((char *) fid >= next) { 70 printf("Event doesn't have FID\n"); 71 goto next_event; 72 } 73 printf("FID record found\n"); 74 75 if (fid->hdr.info_type != FAN_EVENT_INFO_TYPE_FID) { 76 printf("unknown record: %d (Expecting TYPE_FID)\n", 77 fid->hdr.info_type); 78 goto next_event; 79 } 80 printf("\tfsid: %x%x\n", fid->fsid.val[0], fid->fsid.val[1]); 81 82 83 file_handle = (struct file_handle *) &fid->handle; > 84 bad_file = open_by_handle_at(mount_fd, file_handle, O_PATH); 85 if (bad_file < 0) { 86 printf("open_by_handle_at %d\n", errno); 87 goto next_event; 88 } 89 90 ret = fstat(bad_file, &stat); 91 if (ret < 0) 92 printf("fstat %d\n", errno); 93 94 printf("\tinode=%ld\n", stat.st_ino); 95 96 next_event: 97 printf("---\n\n"); 98 } 99 } 100 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
On Tue, Jun 29, 2021 at 10:13 PM Gabriel Krisman Bertazi <krisman@collabora.com> wrote: > > Introduce an example of a FAN_FS_ERROR fanotify user to track filesystem > errors. > > Signed-off-by: Gabriel Krisman Bertazi <krisman@collabora.com> > > --- > Changes since v1: > - minor fixes > --- > samples/Kconfig | 9 +++ > samples/Makefile | 1 + > samples/fanotify/Makefile | 3 + > samples/fanotify/fs-monitor.c | 134 ++++++++++++++++++++++++++++++++++ > 4 files changed, 147 insertions(+) > create mode 100644 samples/fanotify/Makefile > create mode 100644 samples/fanotify/fs-monitor.c > > diff --git a/samples/Kconfig b/samples/Kconfig > index b5a1a7aa7e23..f2f9c939035f 100644 > --- a/samples/Kconfig > +++ b/samples/Kconfig > @@ -120,6 +120,15 @@ config SAMPLE_CONNECTOR > with it. > See also Documentation/driver-api/connector.rst > > +config SAMPLE_FANOTIFY_ERROR > + bool "Build fanotify error monitoring sample" > + depends on FANOTIFY > + help > + When enabled, this builds an example code that uses the > + FAN_FS_ERROR fanotify mechanism to monitor filesystem > + errors. > + See also Documentation/admin-guide/filesystem-monitoring.rst. > + > config SAMPLE_HIDRAW > bool "hidraw sample" > depends on CC_CAN_LINK && HEADERS_INSTALL > diff --git a/samples/Makefile b/samples/Makefile > index 087e0988ccc5..931a81847c48 100644 > --- a/samples/Makefile > +++ b/samples/Makefile > @@ -5,6 +5,7 @@ subdir-$(CONFIG_SAMPLE_AUXDISPLAY) += auxdisplay > subdir-$(CONFIG_SAMPLE_ANDROID_BINDERFS) += binderfs > obj-$(CONFIG_SAMPLE_CONFIGFS) += configfs/ > obj-$(CONFIG_SAMPLE_CONNECTOR) += connector/ > +obj-$(CONFIG_SAMPLE_FANOTIFY_ERROR) += fanotify/ > subdir-$(CONFIG_SAMPLE_HIDRAW) += hidraw > obj-$(CONFIG_SAMPLE_HW_BREAKPOINT) += hw_breakpoint/ > obj-$(CONFIG_SAMPLE_KDB) += kdb/ > diff --git a/samples/fanotify/Makefile b/samples/fanotify/Makefile > new file mode 100644 > index 000000000000..b3d5cc826e6f > --- /dev/null > +++ b/samples/fanotify/Makefile > @@ -0,0 +1,3 @@ > +userprogs-always-y += fs-monitor > + > +userccflags += -I usr/include > diff --git a/samples/fanotify/fs-monitor.c b/samples/fanotify/fs-monitor.c > new file mode 100644 > index 000000000000..f949ea00271d > --- /dev/null > +++ b/samples/fanotify/fs-monitor.c > @@ -0,0 +1,134 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Copyright 2021, Collabora Ltd. > + */ > + > +#define _GNU_SOURCE > +#include <errno.h> Kernel test robot reported some problem with this include > +#include <err.h> > +#include <stdlib.h> > +#include <stdio.h> > +#include <fcntl.h> > +#include <sys/fanotify.h> > +#include <sys/types.h> > +#include <unistd.h> > +#include <sys/stat.h> > +#include <sys/types.h> > + > +#ifndef FAN_FS_ERROR > +#define FAN_FS_ERROR 0x00008000 > +#define FAN_EVENT_INFO_TYPE_ERROR 4 > + > +int mount_fd; > + > +struct fanotify_event_info_error { > + struct fanotify_event_info_header hdr; > + __s32 error; > + __u32 error_count; > +}; > +#endif > + > +static void handle_notifications(char *buffer, int len) > +{ > + struct fanotify_event_metadata *metadata; > + struct fanotify_event_info_error *error; > + struct fanotify_event_info_fid *fid; > + struct file_handle *file_handle; > + int bad_file; > + int ret; > + struct stat stat; > + char *next; > + > + for (metadata = (struct fanotify_event_metadata *) buffer; > + FAN_EVENT_OK(metadata, len); > + metadata = FAN_EVENT_NEXT(metadata, len)) { > + next = (char *)metadata + metadata->event_len; > + if (metadata->mask != FAN_FS_ERROR) { > + printf("unexpected FAN MARK: %llx\n", metadata->mask); > + goto next_event; > + } else if (metadata->fd != FAN_NOFD) { > + printf("Unexpected fd (!= FAN_NOFD)\n"); > + goto next_event; > + } > + > + printf("FAN_FS_ERROR found len=%d\n", metadata->event_len); > + > + error = (struct fanotify_event_info_error *) (metadata+1); > + if (error->hdr.info_type != FAN_EVENT_INFO_TYPE_ERROR) { > + printf("unknown record: %d (Expecting TYPE_ERROR)\n", > + error->hdr.info_type); > + goto next_event; > + } > + > + printf("\tGeneric Error Record: len=%d\n", error->hdr.len); > + printf("\terror: %d\n", error->error); > + printf("\terror_count: %d\n", error->error_count); > + > + fid = (struct fanotify_event_info_fid *) (error + 1); > + > + if ((char *) fid >= next) { > + printf("Event doesn't have FID\n"); > + goto next_event; > + } > + printf("FID record found\n"); > + > + if (fid->hdr.info_type != FAN_EVENT_INFO_TYPE_FID) { > + printf("unknown record: %d (Expecting TYPE_FID)\n", > + fid->hdr.info_type); > + goto next_event; > + } > + printf("\tfsid: %x%x\n", fid->fsid.val[0], fid->fsid.val[1]); > + > + > + file_handle = (struct file_handle *) &fid->handle; > + bad_file = open_by_handle_at(mount_fd, file_handle, O_PATH); I would not recommend in this practice at all and in a sample program in particular. While FID is mean to to be used as input for open_by_handle_at() with "regular" events, with error events FID may belong to a corrupt inode that cannot be opened, a filesystem that is already shutdown due to error or point to irrelevant root inode. I suggest that you stick to printing the FID value. A filesystem monitoring tool will typically know which filesystem it is watching and it will be easy for it to parse the inode and generation out of the FID. In fact, if the handle_type is the generic type FILEID_INO32_GEN and handle_bytes is 8, it is safe for this sample fs-monitor to parse the FID as <32bit ino; 32bit gen> and print those parsed values worst case the values will be wrong. Thanks, Amir. > + if (bad_file < 0) { > + printf("open_by_handle_at %d\n", errno); > + goto next_event; > + } > + > + ret = fstat(bad_file, &stat); > + if (ret < 0) > + printf("fstat %d\n", errno); > + > + printf("\tinode=%ld\n", stat.st_ino); > + > +next_event: > + printf("---\n\n"); > + } > +} > + > +int main(int argc, char **argv) > +{ > + int fd; > + char buffer[BUFSIZ]; > + > + if (argc < 2) { > + printf("Missing path argument\n"); > + return 1; > + } > + > + mount_fd = open(argv[1], O_RDONLY); > + if (mount_fd < 0) > + errx(1, "mount_fd"); > + > + fd = fanotify_init(FAN_CLASS_NOTIF|FAN_REPORT_FID, O_RDONLY); > + if (fd < 0) > + errx(1, "fanotify_init"); > + > + if (fanotify_mark(fd, FAN_MARK_ADD|FAN_MARK_FILESYSTEM, > + FAN_FS_ERROR, AT_FDCWD, argv[1])) { > + errx(1, "fanotify_mark"); > + } > + > + while (1) { > + int n = read(fd, buffer, BUFSIZ); > + > + if (n < 0) > + errx(1, "read"); > + > + handle_notifications(buffer, n); > + } > + > + return 0; > +} > -- > 2.32.0 >
kernel test robot <lkp@intel.com> writes: > Hi Gabriel, > > I love your patch! Yet something to improve: > > [auto build test ERROR on ext3/fsnotify] > [also build test ERROR on ext4/dev linus/master v5.13 next-20210629] > [cannot apply to tytso-fscrypt/master] > [If your patch is applied to the wrong git tree, kindly drop us a note. > And when submitting patch, we suggest to use '--base' as documented in > https://git-scm.com/docs/git-format-patch] > > url: https://github.com/0day-ci/linux/commits/Gabriel-Krisman-Bertazi/File-system-wide-monitoring/20210630-031347 > base: https://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs.git fsnotify > config: arm64-allyesconfig (attached as .config) > compiler: aarch64-linux-gcc (GCC) 9.3.0 > reproduce (this is a W=1 build): > wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross > chmod +x ~/bin/make.cross > # https://github.com/0day-ci/linux/commit/746524d8db08a041fed90e41b15c8e8ca69cb22d > git remote add linux-review https://github.com/0day-ci/linux > git fetch --no-tags linux-review Gabriel-Krisman-Bertazi/File-system-wide-monitoring/20210630-031347 > git checkout 746524d8db08a041fed90e41b15c8e8ca69cb22d > # save the attached .config to linux build tree > mkdir build_dir > COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross O=build_dir ARCH=arm64 SHELL=/bin/bash samples/ > > If you fix the issue, kindly add following tag as appropriate > Reported-by: kernel test robot <lkp@intel.com> > > All errors (new ones prefixed by >>): > >>> samples/fanotify/fs-monitor.c:7:10: fatal error: errno.h: No such file or directory > 7 | #include <errno.h> > | ^~~~~~~~~ > compilation terminated. Hi Dan, I'm not sure what's the proper fix here. Looks like 0day is not using cross system libraries when building this user space code. Should I do something special to silent it?
On Mon, Jul 19, 2021 at 10:36:54AM -0400, Gabriel Krisman Bertazi wrote: > kernel test robot <lkp@intel.com> writes: > > > Hi Gabriel, > > > > I love your patch! Yet something to improve: > > > > [auto build test ERROR on ext3/fsnotify] > > [also build test ERROR on ext4/dev linus/master v5.13 next-20210629] > > [cannot apply to tytso-fscrypt/master] > > [If your patch is applied to the wrong git tree, kindly drop us a note. > > And when submitting patch, we suggest to use '--base' as documented in > > https://git-scm.com/docs/git-format-patch ] > > > > url: https://github.com/0day-ci/linux/commits/Gabriel-Krisman-Bertazi/File-system-wide-monitoring/20210630-031347 > > base: https://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs.git fsnotify > > config: arm64-allyesconfig (attached as .config) > > compiler: aarch64-linux-gcc (GCC) 9.3.0 > > reproduce (this is a W=1 build): > > wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross > > chmod +x ~/bin/make.cross > > # https://github.com/0day-ci/linux/commit/746524d8db08a041fed90e41b15c8e8ca69cb22d > > git remote add linux-review https://github.com/0day-ci/linux > > git fetch --no-tags linux-review Gabriel-Krisman-Bertazi/File-system-wide-monitoring/20210630-031347 > > git checkout 746524d8db08a041fed90e41b15c8e8ca69cb22d > > # save the attached .config to linux build tree > > mkdir build_dir > > COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross O=build_dir ARCH=arm64 SHELL=/bin/bash samples/ > > > > If you fix the issue, kindly add following tag as appropriate > > Reported-by: kernel test robot <lkp@intel.com> > > > > All errors (new ones prefixed by >>): > > > >>> samples/fanotify/fs-monitor.c:7:10: fatal error: errno.h: No such file or directory > > 7 | #include <errno.h> > > | ^~~~~~~~~ > > compilation terminated. > > Hi Dan, > > I'm not sure what's the proper fix here. Looks like 0day is not using > cross system libraries when building this user space code. Should I do > something special to silent it? I'm not the person to ask, I just look at Smatch warnings. Rong Chen might know the answer. regards, dan carpenter
Hi Gabriel, On 7/21/2021 3:49 AM, Dan Carpenter wrote: > > On Mon, Jul 19, 2021 at 10:36:54AM -0400, Gabriel Krisman Bertazi wrote: >> kernel test robot <lkp@intel.com> writes: >> >>> Hi Gabriel, >>> >>> I love your patch! Yet something to improve: >>> >>> [auto build test ERROR on ext3/fsnotify] >>> [also build test ERROR on ext4/dev linus/master v5.13 next-20210629] >>> [cannot apply to tytso-fscrypt/master] >>> [If your patch is applied to the wrong git tree, kindly drop us a note. >>> And when submitting patch, we suggest to use '--base' as documented in >>> https://git-scm.com/docs/git-format-patch ] >>> >>> url: https://github.com/0day-ci/linux/commits/Gabriel-Krisman-Bertazi/File-system-wide-monitoring/20210630-031347 >>> base: https://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs.git fsnotify >>> config: arm64-allyesconfig (attached as .config) >>> compiler: aarch64-linux-gcc (GCC) 9.3.0 >>> reproduce (this is a W=1 build): >>> wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross >>> chmod +x ~/bin/make.cross >>> # https://github.com/0day-ci/linux/commit/746524d8db08a041fed90e41b15c8e8ca69cb22d >>> git remote add linux-review https://github.com/0day-ci/linux >>> git fetch --no-tags linux-review Gabriel-Krisman-Bertazi/File-system-wide-monitoring/20210630-031347 >>> git checkout 746524d8db08a041fed90e41b15c8e8ca69cb22d >>> # save the attached .config to linux build tree >>> mkdir build_dir >>> COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross O=build_dir ARCH=arm64 SHELL=/bin/bash samples/ >>> >>> If you fix the issue, kindly add following tag as appropriate >>> Reported-by: kernel test robot <lkp@intel.com> >>> >>> All errors (new ones prefixed by >>): >>> >>>>> samples/fanotify/fs-monitor.c:7:10: fatal error: errno.h: No such file or directory >>> 7 | #include <errno.h> >>> | ^~~~~~~~~ >>> compilation terminated. >> >> Hi Dan, >> >> I'm not sure what's the proper fix here. Looks like 0day is not using >> cross system libraries when building this user space code. Should I do >> something special to silent it? It seems need extra libraries for arm64, we'll disable CONFIG_SAMPLES to avoid reporting this error. Best Regards, Rong Chen > > I'm not the person to ask, I just look at Smatch warnings. Rong Chen > might know the answer. > > regards, > dan carpenter >
"Chen, Rong A" <rong.a.chen@intel.com> writes: > Hi Gabriel, > > On 7/21/2021 3:49 AM, Dan Carpenter wrote: >> On Mon, Jul 19, 2021 at 10:36:54AM -0400, Gabriel Krisman Bertazi >> wrote: >>> kernel test robot <lkp@intel.com> writes: >>> >>>> Hi Gabriel, >>>> >>>> I love your patch! Yet something to improve: >>>> >>>> [auto build test ERROR on ext3/fsnotify] >>>> [also build test ERROR on ext4/dev linus/master v5.13 next-20210629] >>>> [cannot apply to tytso-fscrypt/master] >>>> [If your patch is applied to the wrong git tree, kindly drop us a note. >>>> And when submitting patch, we suggest to use '--base' as documented in >>>> https://git-scm.com/docs/git-format-patch ] >>>> >>>> url: https://github.com/0day-ci/linux/commits/Gabriel-Krisman-Bertazi/File-system-wide-monitoring/20210630-031347 >>>> base: https://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs.git fsnotify >>>> config: arm64-allyesconfig (attached as .config) >>>> compiler: aarch64-linux-gcc (GCC) 9.3.0 >>>> reproduce (this is a W=1 build): >>>> wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross >>>> chmod +x ~/bin/make.cross >>>> # https://github.com/0day-ci/linux/commit/746524d8db08a041fed90e41b15c8e8ca69cb22d >>>> git remote add linux-review https://github.com/0day-ci/linux >>>> git fetch --no-tags linux-review Gabriel-Krisman-Bertazi/File-system-wide-monitoring/20210630-031347 >>>> git checkout 746524d8db08a041fed90e41b15c8e8ca69cb22d >>>> # save the attached .config to linux build tree >>>> mkdir build_dir >>>> COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross O=build_dir ARCH=arm64 SHELL=/bin/bash samples/ >>>> >>>> If you fix the issue, kindly add following tag as appropriate >>>> Reported-by: kernel test robot <lkp@intel.com> >>>> >>>> All errors (new ones prefixed by >>): >>>> >>>>>> samples/fanotify/fs-monitor.c:7:10: fatal error: errno.h: No such file or directory >>>> 7 | #include <errno.h> >>>> | ^~~~~~~~~ >>>> compilation terminated. >>> >>> Hi Dan, >>> >>> I'm not sure what's the proper fix here. Looks like 0day is not using >>> cross system libraries when building this user space code. Should I do >>> something special to silent it? > > It seems need extra libraries for arm64, we'll disable CONFIG_SAMPLES to > avoid reporting this error. There are kernel space code in samples/ that still benefit from the test robot. See ftrace/ftrace-direct-too.c for one instance. Perhaps it can be disabled just for userprogs-* Makefile entries in samples/ ?
On 7/23/2021 12:15 AM, Gabriel Krisman Bertazi wrote: > "Chen, Rong A" <rong.a.chen@intel.com> writes: > >> Hi Gabriel, >> >> On 7/21/2021 3:49 AM, Dan Carpenter wrote: >>> On Mon, Jul 19, 2021 at 10:36:54AM -0400, Gabriel Krisman Bertazi >>> wrote: >>>> kernel test robot <lkp@intel.com> writes: >>>> >>>>> Hi Gabriel, >>>>> >>>>> I love your patch! Yet something to improve: >>>>> >>>>> [auto build test ERROR on ext3/fsnotify] >>>>> [also build test ERROR on ext4/dev linus/master v5.13 next-20210629] >>>>> [cannot apply to tytso-fscrypt/master] >>>>> [If your patch is applied to the wrong git tree, kindly drop us a note. >>>>> And when submitting patch, we suggest to use '--base' as documented in >>>>> https://git-scm.com/docs/git-format-patch ] >>>>> >>>>> url: https://github.com/0day-ci/linux/commits/Gabriel-Krisman-Bertazi/File-system-wide-monitoring/20210630-031347 >>>>> base: https://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs.git fsnotify >>>>> config: arm64-allyesconfig (attached as .config) >>>>> compiler: aarch64-linux-gcc (GCC) 9.3.0 >>>>> reproduce (this is a W=1 build): >>>>> wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross >>>>> chmod +x ~/bin/make.cross >>>>> # https://github.com/0day-ci/linux/commit/746524d8db08a041fed90e41b15c8e8ca69cb22d >>>>> git remote add linux-review https://github.com/0day-ci/linux >>>>> git fetch --no-tags linux-review Gabriel-Krisman-Bertazi/File-system-wide-monitoring/20210630-031347 >>>>> git checkout 746524d8db08a041fed90e41b15c8e8ca69cb22d >>>>> # save the attached .config to linux build tree >>>>> mkdir build_dir >>>>> COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross O=build_dir ARCH=arm64 SHELL=/bin/bash samples/ >>>>> >>>>> If you fix the issue, kindly add following tag as appropriate >>>>> Reported-by: kernel test robot <lkp@intel.com> >>>>> >>>>> All errors (new ones prefixed by >>): >>>>> >>>>>>> samples/fanotify/fs-monitor.c:7:10: fatal error: errno.h: No such file or directory >>>>> 7 | #include <errno.h> >>>>> | ^~~~~~~~~ >>>>> compilation terminated. >>>> >>>> Hi Dan, >>>> >>>> I'm not sure what's the proper fix here. Looks like 0day is not using >>>> cross system libraries when building this user space code. Should I do >>>> something special to silent it? >> >> It seems need extra libraries for arm64, we'll disable CONFIG_SAMPLES to >> avoid reporting this error. > > There are kernel space code in samples/ that still benefit from the test > robot. See ftrace/ftrace-direct-too.c for one instance. > > Perhaps it can be disabled just for userprogs-* Makefile entries in > samples/ ? > we'll still test samples on arch x86_64, is there a simple way to disable userprogs-* cases? we don't want to edit kernel code. Best Regards, Rong Chen
diff --git a/samples/Kconfig b/samples/Kconfig index b5a1a7aa7e23..f2f9c939035f 100644 --- a/samples/Kconfig +++ b/samples/Kconfig @@ -120,6 +120,15 @@ config SAMPLE_CONNECTOR with it. See also Documentation/driver-api/connector.rst +config SAMPLE_FANOTIFY_ERROR + bool "Build fanotify error monitoring sample" + depends on FANOTIFY + help + When enabled, this builds an example code that uses the + FAN_FS_ERROR fanotify mechanism to monitor filesystem + errors. + See also Documentation/admin-guide/filesystem-monitoring.rst. + config SAMPLE_HIDRAW bool "hidraw sample" depends on CC_CAN_LINK && HEADERS_INSTALL diff --git a/samples/Makefile b/samples/Makefile index 087e0988ccc5..931a81847c48 100644 --- a/samples/Makefile +++ b/samples/Makefile @@ -5,6 +5,7 @@ subdir-$(CONFIG_SAMPLE_AUXDISPLAY) += auxdisplay subdir-$(CONFIG_SAMPLE_ANDROID_BINDERFS) += binderfs obj-$(CONFIG_SAMPLE_CONFIGFS) += configfs/ obj-$(CONFIG_SAMPLE_CONNECTOR) += connector/ +obj-$(CONFIG_SAMPLE_FANOTIFY_ERROR) += fanotify/ subdir-$(CONFIG_SAMPLE_HIDRAW) += hidraw obj-$(CONFIG_SAMPLE_HW_BREAKPOINT) += hw_breakpoint/ obj-$(CONFIG_SAMPLE_KDB) += kdb/ diff --git a/samples/fanotify/Makefile b/samples/fanotify/Makefile new file mode 100644 index 000000000000..b3d5cc826e6f --- /dev/null +++ b/samples/fanotify/Makefile @@ -0,0 +1,3 @@ +userprogs-always-y += fs-monitor + +userccflags += -I usr/include diff --git a/samples/fanotify/fs-monitor.c b/samples/fanotify/fs-monitor.c new file mode 100644 index 000000000000..f949ea00271d --- /dev/null +++ b/samples/fanotify/fs-monitor.c @@ -0,0 +1,134 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright 2021, Collabora Ltd. + */ + +#define _GNU_SOURCE +#include <errno.h> +#include <err.h> +#include <stdlib.h> +#include <stdio.h> +#include <fcntl.h> +#include <sys/fanotify.h> +#include <sys/types.h> +#include <unistd.h> +#include <sys/stat.h> +#include <sys/types.h> + +#ifndef FAN_FS_ERROR +#define FAN_FS_ERROR 0x00008000 +#define FAN_EVENT_INFO_TYPE_ERROR 4 + +int mount_fd; + +struct fanotify_event_info_error { + struct fanotify_event_info_header hdr; + __s32 error; + __u32 error_count; +}; +#endif + +static void handle_notifications(char *buffer, int len) +{ + struct fanotify_event_metadata *metadata; + struct fanotify_event_info_error *error; + struct fanotify_event_info_fid *fid; + struct file_handle *file_handle; + int bad_file; + int ret; + struct stat stat; + char *next; + + for (metadata = (struct fanotify_event_metadata *) buffer; + FAN_EVENT_OK(metadata, len); + metadata = FAN_EVENT_NEXT(metadata, len)) { + next = (char *)metadata + metadata->event_len; + if (metadata->mask != FAN_FS_ERROR) { + printf("unexpected FAN MARK: %llx\n", metadata->mask); + goto next_event; + } else if (metadata->fd != FAN_NOFD) { + printf("Unexpected fd (!= FAN_NOFD)\n"); + goto next_event; + } + + printf("FAN_FS_ERROR found len=%d\n", metadata->event_len); + + error = (struct fanotify_event_info_error *) (metadata+1); + if (error->hdr.info_type != FAN_EVENT_INFO_TYPE_ERROR) { + printf("unknown record: %d (Expecting TYPE_ERROR)\n", + error->hdr.info_type); + goto next_event; + } + + printf("\tGeneric Error Record: len=%d\n", error->hdr.len); + printf("\terror: %d\n", error->error); + printf("\terror_count: %d\n", error->error_count); + + fid = (struct fanotify_event_info_fid *) (error + 1); + + if ((char *) fid >= next) { + printf("Event doesn't have FID\n"); + goto next_event; + } + printf("FID record found\n"); + + if (fid->hdr.info_type != FAN_EVENT_INFO_TYPE_FID) { + printf("unknown record: %d (Expecting TYPE_FID)\n", + fid->hdr.info_type); + goto next_event; + } + printf("\tfsid: %x%x\n", fid->fsid.val[0], fid->fsid.val[1]); + + + file_handle = (struct file_handle *) &fid->handle; + bad_file = open_by_handle_at(mount_fd, file_handle, O_PATH); + if (bad_file < 0) { + printf("open_by_handle_at %d\n", errno); + goto next_event; + } + + ret = fstat(bad_file, &stat); + if (ret < 0) + printf("fstat %d\n", errno); + + printf("\tinode=%ld\n", stat.st_ino); + +next_event: + printf("---\n\n"); + } +} + +int main(int argc, char **argv) +{ + int fd; + char buffer[BUFSIZ]; + + if (argc < 2) { + printf("Missing path argument\n"); + return 1; + } + + mount_fd = open(argv[1], O_RDONLY); + if (mount_fd < 0) + errx(1, "mount_fd"); + + fd = fanotify_init(FAN_CLASS_NOTIF|FAN_REPORT_FID, O_RDONLY); + if (fd < 0) + errx(1, "fanotify_init"); + + if (fanotify_mark(fd, FAN_MARK_ADD|FAN_MARK_FILESYSTEM, + FAN_FS_ERROR, AT_FDCWD, argv[1])) { + errx(1, "fanotify_mark"); + } + + while (1) { + int n = read(fd, buffer, BUFSIZ); + + if (n < 0) + errx(1, "read"); + + handle_notifications(buffer, n); + } + + return 0; +}
Introduce an example of a FAN_FS_ERROR fanotify user to track filesystem errors. Signed-off-by: Gabriel Krisman Bertazi <krisman@collabora.com> --- Changes since v1: - minor fixes --- samples/Kconfig | 9 +++ samples/Makefile | 1 + samples/fanotify/Makefile | 3 + samples/fanotify/fs-monitor.c | 134 ++++++++++++++++++++++++++++++++++ 4 files changed, 147 insertions(+) create mode 100644 samples/fanotify/Makefile create mode 100644 samples/fanotify/fs-monitor.c