inotify02.c revision fed9641096e27f79a0f2d9adfe9839dd8d11dc0f
173e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak/*
273e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * Copyright (c) 2007 SWSoft.  All Rights Reserved.
373e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak *
473e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * This program is free software; you can redistribute it and/or modify it
573e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * under the terms of version 2 of the GNU General Public License as
673e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * published by the Free Software Foundation.
773e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak *
873e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * This program is distributed in the hope that it would be useful, but
973e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * WITHOUT ANY WARRANTY; without even the implied warranty of
1073e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
1173e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak *
1273e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * Further, this software is distributed without any warranty that it is
1373e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * free of the rightful claim of any third person regarding infringement
1473e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * or the like.  Any license provided herein, whether implied or
1573e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * otherwise, applies only to this software file.  Patent licenses, if
1673e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * any, provided herein do not apply to combinations of this program with
1773e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * other software, or any other product whatsoever.
1873e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak *
1973e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * You should have received a copy of the GNU General Public License along
20fed9641096e27f79a0f2d9adfe9839dd8d11dc0fWanlong Gao * with this program; if not, write the Free Software Foundation, Inc.,
21fed9641096e27f79a0f2d9adfe9839dd8d11dc0fWanlong Gao * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
2273e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak *
2373e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * Started by Andrew Vagin <avagin@sw.ru>
2473e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak *
2573e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak */
2673e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak/****************************************************************************
2773e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * NAME
2873e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak *     inotify02
2973e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak *
3073e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * DESCRIPTION
3173e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak *     Check that inotify work for a directory
3273e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak *
3373e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * ALGORITHM
3473e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak *     Execute sequence file's operation and check return events
3573e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak *
36c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak * HISTORY
374bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *     01/06/2007 - Fix to compile inotify test case with kernel that does
38c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak *     not support it. Ricardo Salveti de Araujo <rsalveti@linux.vnet.ibm.com>
39c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak *
409a4c40943ff3e55687845cd4bab3a865f7163352subrata_modak *     03/27/2008 - Fix the test failure due to event coalescence. Also add
419a4c40943ff3e55687845cd4bab3a865f7163352subrata_modak *     test for this event coalescence. Li Zefan <lizf@cn.fujitsu.com>
429a4c40943ff3e55687845cd4bab3a865f7163352subrata_modak *
4373e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * ***************************************************************************/
44c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak
4586faed4f828f8d46dff2d18b8be0570553716374subrata_modak#include "config.h"
4686faed4f828f8d46dff2d18b8be0570553716374subrata_modak
4773e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#include <stdio.h>
4873e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#include <sys/stat.h>
4973e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#include <sys/types.h>
5073e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#include <sys/fcntl.h>
5173e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#include <errno.h>
5273e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#include <string.h>
53c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak#include <sys/syscall.h>
5473e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#include "test.h"
5573e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#include "usctest.h"
5653740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper#include "linux_syscall_numbers.h"
573bf3cb1cd688d60a3f4da0313d563fb10f6ed0edGarrett Cooper#include "inotify.h"
5873e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak
5953740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper#if defined(HAVE_SYS_INOTIFY_H)
603e9f0947adf0937e8ef3d68fefeb2da698c460casubrata_modak#include <sys/inotify.h>
61c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak
623d72679126ade72e37b82c130faa38a0b5431cd5subrata_modak#ifndef IN_MOVE_SELF
633d72679126ade72e37b82c130faa38a0b5431cd5subrata_modak#define IN_MOVE_SELF            0x00000800
643d72679126ade72e37b82c130faa38a0b5431cd5subrata_modak#endif
653d72679126ade72e37b82c130faa38a0b5431cd5subrata_modak
6673e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#define EVENT_MAX 1024
6773e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak/* size of the event structure, not counting name */
6873e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#define EVENT_SIZE  (sizeof (struct inotify_event))
6973e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak/* reasonable guess as to size of 1024 events */
7073e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#define EVENT_BUF_LEN        (EVENT_MAX * (EVENT_SIZE + 16))
7173e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak
7273e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modakvoid setup();
7373e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modakvoid cleanup();
7473e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak
7556207cec7732e09c216c751c0b5f88a242bacae6subrata_modakchar *TCID = "inotify02";	/* Test program identifier. */
7656207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint TST_TOTAL = 9;		/* Total number of test cases.*/
7773e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak
7873e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#define BUF_SIZE 256
799a4c40943ff3e55687845cd4bab3a865f7163352subrata_modakchar fname1[BUF_SIZE], fname2[BUF_SIZE], fname3[BUF_SIZE];
8073e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modakchar buf[BUF_SIZE];
8173e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modakint fd, fd_notify;
82c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modakint wd;
8373e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak
8473e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modakstruct event_t {
8556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	char name[BUF_SIZE];
8656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	int mask;
8756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	int len;
8873e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak};
8973e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#define FILE_NAME1 "test_file1"
9073e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#define FILE_NAME2 "test_file2"
9173e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak
9256207cec7732e09c216c751c0b5f88a242bacae6subrata_modakstruct event_t event_set[EVENT_MAX];
9373e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak
9403b05a0307a3020c5b86297bc863765b253fa1a0vapierchar event_buf[EVENT_BUF_LEN];
9503b05a0307a3020c5b86297bc863765b253fa1a0vapier
9656207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint main(int ac, char **av)
9756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak{
9856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	int lc;			/* loop counter */
9956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	char *msg;		/* message returned from parse_opts */
10056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
10156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	/*
10256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	 * parse standard options
10356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	 */
10445e285d46ab47b0ff76c88acb5ba97b0bd5f753dGarrett Cooper	if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL)
10560fa8014af7534eaefa901200c8df4b74ce422e6Garrett Cooper		tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg);
10656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
10756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	/*
10856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	 * perform global setup for test
10956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	 */
11056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	setup();
11156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
11256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	/*
11356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	 * check looping state if -c option given
11456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	 */
11556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	for (lc = 0; TEST_LOOPING(lc); lc++) {
11656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
11756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		Tst_count = 0;
11856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
11956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		/*
12056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		 * generate sequence of events
12156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		 */
12256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		if (chmod(".", 0755) < 0) {
12353740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper			tst_brkm(TBROK|TERRNO, cleanup,
124766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper				 "chmod(\".\", 0755) failed");
12556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		}
12656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		event_set[Tst_count].mask = IN_ISDIR | IN_ATTRIB;
12756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		strcpy(event_set[Tst_count].name, "");
12856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		Tst_count++;
12956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
13056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		if ((fd = creat(FILE_NAME1, 0755)) == -1) {
13153740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper			tst_brkm(TBROK|TERRNO, cleanup,
132766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper				 "creat(\"%s\", 755) failed",
133766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper				 FILE_NAME1);
13456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		}
13556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
13656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		event_set[Tst_count].mask = IN_CREATE;
13756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		strcpy(event_set[Tst_count].name, FILE_NAME1);
13856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		Tst_count++;
13956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		event_set[Tst_count].mask = IN_OPEN;
14056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		strcpy(event_set[Tst_count].name, FILE_NAME1);
14156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		Tst_count++;
14256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
14356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		if (close(fd) == -1) {
14453740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper			tst_brkm(TBROK|TERRNO, cleanup,
145766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper				 "close(%s) failed", FILE_NAME1);
14656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		}
14756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		event_set[Tst_count].mask = IN_CLOSE_WRITE;
14856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		strcpy(event_set[Tst_count].name, FILE_NAME1);
14956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		Tst_count++;
15056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
15156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		if (rename(FILE_NAME1, FILE_NAME2) == -1) {
15253740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper			tst_brkm(TBROK|TERRNO, cleanup,
153766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper				 "rename(%s, %s) failed",
154766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper				 FILE_NAME1, FILE_NAME2);
15556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		}
15656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		event_set[Tst_count].mask = IN_MOVED_FROM;
15756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		strcpy(event_set[Tst_count].name, FILE_NAME1);
15856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		Tst_count++;
15956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		event_set[Tst_count].mask = IN_MOVED_TO;
16056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		strcpy(event_set[Tst_count].name, FILE_NAME2);
16156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		Tst_count++;
16256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
16356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		if (getcwd(fname1, BUF_SIZE) == NULL) {
16453740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper			tst_brkm(TBROK|TERRNO, cleanup,
165766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper				 "getcwd(%p, %d) failed", fname1,
166923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak				 BUF_SIZE);
16756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		}
16856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
16956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		snprintf(fname2, BUF_SIZE, "%s.rename1", fname1);
17056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		if (rename(fname1, fname2) == -1) {
17153740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper			tst_brkm(TBROK|TERRNO, cleanup,
172766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper				 "rename(%s, %s) failed", fname1, fname2);
17356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		}
17456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		event_set[Tst_count].mask = IN_MOVE_SELF;
17556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		strcpy(event_set[Tst_count].name, "");
17656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		Tst_count++;
17756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
17856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		if (unlink(FILE_NAME2) == -1) {
17953740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper			tst_brkm(TBROK|TERRNO, cleanup,
180766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper				 "unlink(%s) failed", FILE_NAME2);
18156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		}
18256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		event_set[Tst_count].mask = IN_DELETE;
18356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		strcpy(event_set[Tst_count].name, FILE_NAME2);
18456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		Tst_count++;
18556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
18656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		/*
18756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		 * test that duplicate events will be coalesced into
18856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		 * a single event. This test case should be last, that
18956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		 * we can correct determine kernel bug which exist before
19056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		 * 2.6.25. See comment below.
19156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		 */
19256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		snprintf(fname3, BUF_SIZE, "%s.rename2", fname1);
19356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		if (rename(fname2, fname3) == -1) {
19453740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper			tst_brkm(TBROK|TERRNO, cleanup,
195766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper				 "rename(%s, %s) failed", fname2, fname3);
19656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		}
19756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
19856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		if (rename(fname3, fname1) == -1) {
19953740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper			tst_brkm(TBROK|TERRNO, cleanup,
200766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper				 "rename(%s, %s) failed", fname3, fname1);
20156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		}
20256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		event_set[Tst_count].mask = IN_MOVE_SELF;
20356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		strcpy(event_set[Tst_count].name, "");
20456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		Tst_count++;
20556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
20656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		if (Tst_count != TST_TOTAL) {
20756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak			tst_brkm(TBROK, cleanup,
20856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak				 "Tst_count and TST_TOTAL are not equal");
20956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		}
21056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
21156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		Tst_count = 0;
21256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
21356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		int len, i = 0, test_num = 0;
21453740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper		if ((len = read(fd_notify, event_buf, EVENT_BUF_LEN)) == -1) {
21553740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper			tst_brkm(TBROK|TERRNO, cleanup,
216f4539c6840b09c0428fd9b30c02ac0e747a4f9efMarkos Chandras				 "read(%d, buf, %zu) failed",
217766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper				 fd_notify, EVENT_BUF_LEN);
21856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
21956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		}
22056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
22156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		while (i < len) {
22256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak			struct inotify_event *event;
22356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak			event = (struct inotify_event *)&event_buf[i];
22456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak			if (test_num >= TST_TOTAL) {
22556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak				if (tst_kvercmp(2, 6, 25) < 0
22656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak				    && event_set[TST_TOTAL - 1].mask ==
22756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak				    event->mask)
22856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak					tst_resm(TWARN,
22956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak						 "This may be kernel bug. "
23056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak						 "Before kernel 2.6.25, a kernel bug "
23156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak						 "meant that the kernel code that was "
23256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak						 "intended to coalesce successive identical "
23356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak						 "events (i.e., the two most recent "
23456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak						 "events could potentially be coalesced "
23556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak						 "if the older had not yet been read) "
23656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak						 "instead checked if the most recent event "
23756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak						 "could be coalesced with the oldest "
23856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak						 "unread event. This has been fixed by commit"
23956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak						 "1c17d18e3775485bf1e0ce79575eb637a94494a2.");
24056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak				tst_resm(TFAIL,
24156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak					 "get unnecessary event: "
24256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak					 "wd=%d mask=%x cookie=%u len=%u"
24356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak					 "name=\"%s\"", event->wd, event->mask,
24456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak					 event->cookie, event->len,
24556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak					 event->name);
24656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
24756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak			} else if ((event_set[test_num].mask == event->mask)
24856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak				   &&
24956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak				   (!strncmp
25056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak				    (event_set[test_num].name, event->name,
25156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak				     event->len))) {
25256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak				tst_resm(TPASS,
25356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak					 "get event: wd=%d mask=%x"
25456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak					 " cookie=%u len=%u name=\"%s\"",
25556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak					 event->wd, event->mask, event->cookie,
25656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak					 event->len, event->name);
25756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
25856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak			} else {
25956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak				tst_resm(TFAIL, "get event: wd=%d mask=%x "
26056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak					 "(expected %x) cookie=%u len=%u "
26156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak					 "name=\"%s\" (expected \"%s\") %d",
26256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak					 event->wd, event->mask,
26356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak					 event_set[test_num].mask,
26456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak					 event->cookie, event->len, event->name,
26556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak					 event_set[test_num].name,
26656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak					 strcmp(event_set[test_num].name,
26756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak						event->name));
26856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak			}
26956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak			test_num++;
27056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak			i += EVENT_SIZE + event->len;
27156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		}
27256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
27356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		for (; test_num < TST_TOTAL; test_num++) {
274766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper			tst_resm(TFAIL, "didn't get event: mask=%x ",
275766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper				 event_set[test_num].mask);
27656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		}
2772c28215423293e443469a07ae7011135d058b671Garrett Cooper	}
27856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
27956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	/* cleanup and exit */
28056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	cleanup();
281766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper	tst_exit();
2822c28215423293e443469a07ae7011135d058b671Garrett Cooper}
28373e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak
28473e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak/*
28573e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * setup() - performs all ONE TIME setup for this test.
28673e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak */
28756207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid setup()
28856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak{
2892c28215423293e443469a07ae7011135d058b671Garrett Cooper
29056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	tst_sig(NOFORK, DEF_HANDLER, cleanup);
29156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
29256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	TEST_PAUSE;
29356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
29456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	tst_tmpdir();
29556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
29656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	if ((fd_notify = myinotify_init()) < 0) {
29756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		if (errno == ENOSYS) {
298766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper			tst_brkm(TCONF, cleanup,
29956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak				 "inotify is not configured in this kernel.");
30056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		} else {
301766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper			tst_brkm(TBROK|TERRNO, cleanup,
302766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper				 "inotify_init () failed");
30356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		}
30456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	}
30556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
30656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	if ((wd = myinotify_add_watch(fd_notify, ".", IN_ALL_EVENTS)) < 0) {
307766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper		tst_brkm(TBROK|TERRNO, cleanup,
308766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper			 "inotify_add_watch (%d, \".\", IN_ALL_EVENTS) failed",
309766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper			 fd_notify);
31056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	};
31156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
3122c28215423293e443469a07ae7011135d058b671Garrett Cooper}
31373e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak
31473e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak/*
31573e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * cleanup() - performs all ONE TIME cleanup for this test at
31673e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak *        completion or premature exit.
31773e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak */
31856207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid cleanup()
31956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak{
32056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	if (myinotify_rm_watch(fd_notify, wd) < 0) {
32156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		tst_resm(TWARN,
322766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper			 "inotify_rm_watch (%d, %d) failed,", fd_notify, wd);
32373e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak
32456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	}
32573e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak
32656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	if (close(fd_notify) == -1) {
327766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper		tst_resm(TWARN, "close(%d) failed", fd_notify);
32856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	}
32973e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak
33056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	/*
33156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	 * print timing stats if that option was specified.
33256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	 * print errno log if that option was specified.
33356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	 */
33456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	TEST_CLEANUP;
33573e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak
33656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	tst_rmdir();
3372c28215423293e443469a07ae7011135d058b671Garrett Cooper}
338c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak
339c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak#else
340c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak
34156207cec7732e09c216c751c0b5f88a242bacae6subrata_modakchar *TCID = "inotify02";	/* Test program identifier.    */
34256207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint TST_TOTAL = 0;		/* Total number of test cases. */
343c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak
344ddc4c0d66d3947d5e5382e17d68598a85f8cb77cGarrett Cooperint main(void)
345c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak{
34653740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper	tst_brkm(TCONF, NULL, "system doesn't have required inotify support");
347c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak}
348c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak
349f4539c6840b09c0428fd9b30c02ac0e747a4f9efMarkos Chandras#endif
350