Test whether overflow event is properly generated when we don't read fanotify descriptor and generate enough events.
Signed-off-by: Jan Kara <[email protected]> --- testcases/kernel/syscalls/fanotify/fanotify05.c | 185 ++++++++++++++++++++++++ 1 file changed, 185 insertions(+) create mode 100644 testcases/kernel/syscalls/fanotify/fanotify05.c diff --git a/testcases/kernel/syscalls/fanotify/fanotify05.c b/testcases/kernel/syscalls/fanotify/fanotify05.c new file mode 100644 index 000000000000..a714d9e27a6f --- /dev/null +++ b/testcases/kernel/syscalls/fanotify/fanotify05.c @@ -0,0 +1,185 @@ +/* + * Copyright (c) 2014 SUSE Linux. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * Further, this software is distributed without any warranty that it is + * free of the rightful claim of any third person regarding infringement + * or the like. Any license provided herein, whether implied or + * otherwise, applies only to this software file. Patent licenses, if + * any, provided herein do not apply to combinations of this program with + * other software, or any other product whatsoever. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Started by Jan Kara <[email protected]> + * + * DESCRIPTION + * Check that fanotify overflow event is properly generated + * + * ALGORITHM + * Generate enough events without reading them and check that overflow + * event is generated. + */ +#include "config.h" + +#include <stdio.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <sys/fcntl.h> +#include <errno.h> +#include <string.h> +#include <sys/syscall.h> +#include "test.h" +#include "usctest.h" +#include "linux_syscall_numbers.h" +#include "fanotify.h" +#include "safe_macros.h" + +char *TCID = "fanotify05"; +int TST_TOTAL = 1; + +#if defined(HAVE_SYS_FANOTIFY_H) +#include <sys/fanotify.h> + +/* Currently this is fixed in kernel... */ +#define MAX_EVENTS 16384 + +static void setup(void); +static void cleanup(void); + +#define BUF_SIZE 256 +static char fname[BUF_SIZE]; +static int fd, fd_notify; + +struct fanotify_event_metadata event; + +int main(int ac, char **av) +{ + int lc, i; + char *msg; + int len; + + if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL) + tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg); + + setup(); + + for (lc = 0; TEST_LOOPING(lc); lc++) { + /* + * generate events + */ + for (i = 0; i < MAX_EVENTS + 1; i++) { + sprintf(fname, "fname_%d", i); + fd = SAFE_OPEN(cleanup, fname, O_RDWR | O_CREAT, 0644); + SAFE_CLOSE(cleanup, fd); + } + + while (1) { + /* + * get list on events + */ + len = read(fd_notify, &event, sizeof(event)); + if (len < 0) { + if (errno == -EAGAIN) { + tst_resm(TFAIL, "Overflow event not " + "generated!\n"); + break; + } + tst_brkm(TBROK | TERRNO, cleanup, + "read of notification event failed"); + break; + } + if (event.fd != FAN_NOFD) + close(event.fd); + + /* + * check events + */ + if (event.mask != FAN_OPEN && + event.mask != FAN_Q_OVERFLOW) { + tst_resm(TFAIL, + "get event: mask=%llx (expected %llx)" + "pid=%u fd=%d", + (unsigned long long)event.mask, + (unsigned long long)FAN_OPEN, + (unsigned)event.pid, event.fd); + break; + } + if (event.mask == FAN_Q_OVERFLOW) { + if (event.fd != FAN_NOFD) { + tst_resm(TFAIL, + "invalid overflow event: " + "mask=%llx pid=%u fd=%d", + (unsigned long long)event.mask, + (unsigned)event.pid, + event.fd); + break; + } + tst_resm(TPASS, + "get event: mask=%llx pid=%u fd=%d", + (unsigned long long)event.mask, + (unsigned)event.pid, event.fd); + break; + } + } + } + + cleanup(); + tst_exit(); +} + +static void setup(void) +{ + tst_sig(NOFORK, DEF_HANDLER, cleanup); + + TEST_PAUSE; + + tst_tmpdir(); + + if ((fd_notify = myfanotify_init(FAN_CLASS_NOTIF | FAN_NONBLOCK, + O_RDONLY)) < 0) { + if (errno == ENOSYS) { + tst_brkm(TCONF, cleanup, + "fanotify is not configured in this kernel."); + } else { + tst_brkm(TBROK | TERRNO, cleanup, + "fanotify_init failed"); + } + } + + if (myfanotify_mark(fd_notify, FAN_MARK_MOUNT | FAN_MARK_ADD, FAN_OPEN, + AT_FDCWD, ".") < 0) { + tst_brkm(TBROK | TERRNO, cleanup, + "fanotify_mark (%d, FAN_MARK_MOUNT | FAN_MARK_ADD, " + "FAN_OPEN, AT_FDCWD, \".\") failed", + fd_notify); + } +} + +static void cleanup(void) +{ + if (close(fd_notify) == -1) { + tst_resm(TWARN, "close(%d) failed", fd_notify); + } + + TEST_CLEANUP; + tst_rmdir(); +} + +#else + +int main(void) +{ + tst_brkm(TCONF, NULL, "system doesn't have required fanotify support"); +} + +#endif -- 1.8.1.4 ------------------------------------------------------------------------------ Flow-based real-time traffic analytics software. Cisco certified tool. Monitor traffic, SLAs, QoS, Medianet, WAAS etc. with NetFlow Analyzer Customize your own dashboards, set traffic alerts and generate reports. Network behavioral analysis & security monitoring. All-in-one tool. http://pubads.g.doubleclick.net/gampad/clk?id=126839071&iu=/4140/ostg.clktrk _______________________________________________ Ltp-list mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ltp-list
