On Tue 28-07-15 02:47:45, Jan Stancek wrote: > ----- Original Message ----- > > From: "Jan Kara" <j...@suse.com> > > To: ltp-list@lists.sourceforge.net > > Cc: "Jan Kara" <j...@suse.com> > > Sent: Monday, 27 July, 2015 6:58:27 PM > > Subject: [LTP] [PATCH] inotify: Add test for inotify mark destruction race > > > > Kernels prior to 4.2 have a race when inode is being deleted while > > Hi, > > Do you also have the commit id(s) that fix the problem? That might be valuable > information for people who find their kernel crashing.
Currently the fix is in mm tree for a couple of days and I expect Andrew to send it to Linus this week (and it will also propagate to -stable kernels after that). So after that I can provide the commit ID. Honza > > Regards, > Jan > > > inotify group watching that inode is being torn down. When the race is > > hit, the kernel crashes or loops. Test for that race. > > > > Signed-off-by: Jan Kara <j...@suse.com> > > --- > > runtest/syscalls | 1 + > > testcases/kernel/syscalls/inotify/inotify06.c | 121 > > ++++++++++++++++++++++++++ > > 2 files changed, 122 insertions(+) > > create mode 100644 testcases/kernel/syscalls/inotify/inotify06.c > > > > This tests for a kernel bug which causes a crash when triggered. I'm not > > sure > > how (whether) tests like this should be integrated with LTP. So here is my > > attempt at that. > > > > diff --git a/runtest/syscalls b/runtest/syscalls > > index 70d4945706ea..c532fe307df9 100644 > > --- a/runtest/syscalls > > +++ b/runtest/syscalls > > @@ -449,6 +449,7 @@ inotify02 inotify02 > > inotify03 inotify03 > > inotify04 inotify04 > > inotify05 inotify05 > > +inotify06 inotify06 > > > > fanotify01 fanotify01 > > fanotify02 fanotify02 > > diff --git a/testcases/kernel/syscalls/inotify/inotify06.c > > b/testcases/kernel/syscalls/inotify/inotify06.c > > new file mode 100644 > > index 000000000000..d5e14cb7e08d > > --- /dev/null > > +++ b/testcases/kernel/syscalls/inotify/inotify06.c > > @@ -0,0 +1,121 @@ > > +#include "config.h" > > + > > +#include <stdio.h> > > +#include <unistd.h> > > +#include <stdlib.h> > > +#include <fcntl.h> > > +#include <time.h> > > +#include <signal.h> > > +#include <sys/inotify.h> > > +#include <sys/time.h> > > +#include <sys/wait.h> > > +#include <sys/syscall.h> > > + > > +#include "test.h" > > +#include "linux_syscall_numbers.h" > > +#include "inotify.h" > > +#include "safe_macros.h" > > + > > +char *TCID = "inotify06"; > > +int TST_TOTAL = 1; > > + > > +#if defined(HAVE_SYS_INOTIFY_H) > > +#include <sys/inotify.h> > > + > > +/* Number of seconds to run the test for */ > > +#define DURATION 10 > > +/* Number of files to test (must be > 1) */ > > +#define FILES 5 > > + > > +char names[FILES][PATH_MAX]; > > + > > +static void cleanup(void) > > +{ > > + tst_rmdir(); > > +} > > + > > +static void setup(void) > > +{ > > + int i; > > + > > + tst_sig(FORK, DEF_HANDLER, cleanup); > > + > > + TEST_PAUSE; > > + > > + tst_tmpdir(); > > + > > + for (i = 0; i < FILES; i++) > > + sprintf(names[i], "fname_%d", i); > > +} > > + > > +int main(int ac, char **av) > > +{ > > + int inotify_fd, fd; > > + pid_t pid; > > + time_t start; > > + int i, lc; > > + > > + tst_parse_opts(ac, av, NULL, NULL); > > + > > + setup(); > > + > > + for (lc = 0; TEST_LOOPING(lc); lc++) { > > + pid = fork(); > > + if (pid == 0) { > > + while (1) { > > + for (i = 0; i < FILES; i++) { > > + fd = SAFE_OPEN(cleanup, names[i], > > + O_CREAT | O_RDWR, 0600); > > + SAFE_CLOSE(cleanup, fd); > > + } > > + for (i = 0; i < FILES; i++) > > + SAFE_UNLINK(cleanup, names[i]); > > + } > > + } else if (pid == -1) > > + tst_brkm(TBROK | TERRNO, cleanup, "fork() failed"); > > + > > + start = time(NULL); > > + while (time(NULL) - start < DURATION) { > > + inotify_fd = syscall(__NR_inotify_init1, O_NONBLOCK); > > + if (inotify_fd < 0) { > > + if (errno == ENOSYS) { > > + tst_brkm(TCONF, cleanup, > > + "inotify is not configured in > > this " > > + "kernel."); > > + } else { > > + tst_brkm(TBROK | TERRNO, cleanup, > > + "inotify_init failed"); > > + } > > + } > > + for (i = 0; i < FILES; i++) { > > + /* > > + * Both failure and success are fine since > > + * files are being deleted in parallel - this > > + * is what provokes the race we want to test > > + * for... > > + */ > > + myinotify_add_watch(inotify_fd, names[i], > > + IN_MODIFY); > > + } > > + SAFE_CLOSE(cleanup, inotify_fd); > > + } > > + /* We survived for given time - test succeeded */ > > + tst_resm(TPASS, "kernel survived inotify beating"); > > + > > + /* Kill the child creating / deleting files and wait for it */ > > + kill(pid, SIGKILL); > > + wait(NULL); > > + } > > + > > + cleanup(); > > + tst_exit(); > > +} > > + > > +#else > > + > > +int main(void) > > +{ > > + tst_brkm(TCONF, NULL, "system doesn't have required inotify support"); > > +} > > + > > +#endif > > -- > > 2.1.4 > > > > > > ------------------------------------------------------------------------------ > > _______________________________________________ > > Ltp-list mailing list > > Ltp-list@lists.sourceforge.net > > https://lists.sourceforge.net/lists/listinfo/ltp-list > > > -- Jan Kara <j...@suse.com> SUSE Labs, CR ------------------------------------------------------------------------------ _______________________________________________ Ltp-list mailing list Ltp-list@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/ltp-list