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