public inbox for ltp@lists.linux.it
 help / color / mirror / Atom feed
From: Jan Kara <jack@suse.cz>
To: Jan Stancek <jstancek@redhat.com>
Cc: ltp-list@lists.sourceforge.net, Jan Kara <jack@suse.com>
Subject: Re: [LTP] [PATCH] inotify: Add test for inotify mark destruction race
Date: Tue, 28 Jul 2015 10:49:00 +0200	[thread overview]
Message-ID: <20150728084900.GC24030@quack.suse.cz> (raw)
In-Reply-To: <2134014586.1093682.1438066065045.JavaMail.zimbra@redhat.com>

On Tue 28-07-15 02:47:45, Jan Stancek wrote:
> ----- Original Message -----
> > From: "Jan Kara" <jack@suse.com>
> > To: ltp-list@lists.sourceforge.net
> > Cc: "Jan Kara" <jack@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 <jack@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 <jack@suse.com>
SUSE Labs, CR

------------------------------------------------------------------------------
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

  reply	other threads:[~2015-07-28  8:49 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <1438016307-28805-1-git-send-email-jack@suse.com>
2015-07-28  6:47 ` [LTP] [PATCH] inotify: Add test for inotify mark destruction race Jan Stancek
2015-07-28  8:49   ` Jan Kara [this message]
2015-07-30 12:57 ` Cyril Hrubis

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150728084900.GC24030@quack.suse.cz \
    --to=jack@suse.cz \
    --cc=jack@suse.com \
    --cc=jstancek@redhat.com \
    --cc=ltp-list@lists.sourceforge.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox