From: Subrata <sub...@us...> - 2008-05-26 06:09:29
|
Update of /cvsroot/ltp/ltp/testcases/kernel/fs/proc In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv15804/ltp/testcases/kernel/fs/proc Modified Files: proc01.c Log Message: This patch adds a list for all known issues which are probably subtle to be fixed in kernel to the test, so the test could continue. Also, it will print out those expected failures as INFO or WARN to the test result. Signed-off-by: Cai Qian <qc...@re...>. Index: proc01.c =================================================================== RCS file: /cvsroot/ltp/ltp/testcases/kernel/fs/proc/proc01.c,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** proc01.c 13 Nov 2007 09:25:05 -0000 1.5 --- proc01.c 26 May 2008 06:09:19 -0000 1.6 *************** *** 41,44 **** --- 41,45 ---- #define MAX_BUFF_SIZE 65536 + #define MAX_FUNC_NAME 256 char *TCID = "proc01"; *************** *** 60,63 **** --- 61,122 ---- unsigned int total_obj = 0; + struct mapping + { + char func[MAX_FUNC_NAME]; + char file[PATH_MAX]; + int err; + }; + typedef struct mapping Mapping; + + /* Those are known failures for 2.6.18 baremetal kernel and Xen dom0 + kernel on i686, x86_64, ia64, ppc64 and s390x. In addition, It looks + like if SELinux is disabled, the test may still fail on some other + entries. */ + const Mapping known_issues[] = + { + {"open", "/proc/acpi/event", EBUSY}, + {"open", "/proc/sal/cpe/data", EBUSY}, + {"open", "/proc/sal/cmc/data", EBUSY}, + {"open", "/proc/sal/init/data", EBUSY}, + {"open", "/proc/sal/mca/data", EBUSY}, + {"read", "/proc/kmsg", EAGAIN}, + {"read", "/proc/sal/cpe/event", EAGAIN}, + {"read", "/proc/sal/cmc/event", EAGAIN}, + {"read", "/proc/sal/init/event", EAGAIN}, + {"read", "/proc/sal/mca/event", EAGAIN}, + {"read", "/proc/xen/privcmd", EINVAL}, + {"read", "/proc/self/mem", EIO}, + {"read", "/proc/self/task/[0-9]*/mem", EIO}, + {"", "", 0} + }; + + /* Known files that does not honor O_NONBLOCK, so they will hang + the test while being read.*/ + const char error_nonblock[][PATH_MAX] = + { + "/proc/ppc64/rtas/error_log", + "/proc/xen/xenbus", + "" + }; + + /* Verify expected failures, and then let the test to continue. */ + int found_errno(const char *syscall, const char *obj, int tmperr) + { + int i; + + for (i = 0; known_issues[i].err != 0; i++) + if (tmperr == known_issues[i].err + && (!strcmp(obj, known_issues[i].file) + || !fnmatch(known_issues[i].file, obj, FNM_PATHNAME)) + && !strcmp(syscall, known_issues[i].func)) + { + tst_resm(TINFO, "%s: %s: known issue: %s", obj, syscall, + strerror(tmperr)); + return 1; + } + + return 0; + } + void cleanup() { *************** *** 131,135 **** char dirobj[PATH_MAX]; /* object inside directory to modify */ struct stat statbuf; /* used to hold stat information */ ! int fd; ssize_t nread; static char buf[MAX_BUFF_SIZE]; /* static kills reentrancy, but we don't care about the contents */ --- 190,194 ---- char dirobj[PATH_MAX]; /* object inside directory to modify */ struct stat statbuf; /* used to hold stat information */ ! int fd, tmperr, i; ssize_t nread; static char buf[MAX_BUFF_SIZE]; /* static kills reentrancy, but we don't care about the contents */ *************** *** 197,201 **** fd = open(obj, O_RDONLY | O_NONBLOCK); if (fd < 0) { ! if (errno != EACCES) { tst_resm(TINFO, "%s: open: %s", obj, strerror(errno)); --- 256,263 ---- fd = open(obj, O_RDONLY | O_NONBLOCK); if (fd < 0) { ! tmperr = errno; ! ! if (!found_errno("open", obj, tmperr)) ! if (tmperr != EACCES) { tst_resm(TINFO, "%s: open: %s", obj, strerror(errno)); *************** *** 205,215 **** } ! /* Skip write-only files. */ ! if ((statbuf.st_mode & S_IRUSR) == 0 ! && statbuf.st_mode & S_IWUSR) { ! tst_resm(TINFO, "%s: is write-only.", obj); ! close(fd); ! return 0; ! } nread = 1; --- 267,285 ---- } ! /* Skip write-only files. */ ! if ((statbuf.st_mode & S_IRUSR) == 0 ! && statbuf.st_mode & S_IWUSR) { ! tst_resm(TINFO, "%s: is write-only.", obj); ! close(fd); ! return 0; ! } ! ! /* Skip files does not honor O_NONBLOCK. */ ! for (i = 0; error_nonblock[i][0] != '\0'; i++) ! if (!strcmp(obj, error_nonblock[i])) { ! tst_resm(TWARN, "%s: does not honor O_NONBLOCK.", obj); ! close (fd); ! return 0; ! } nread = 1; *************** *** 217,220 **** --- 287,293 ---- nread = read(fd, buf, buffsize); if (nread < 0) { + tmperr = errno; + + if (!found_errno("read", obj, tmperr)) { /* ignore no perm (not root) and no process (terminated) errors */ if (errno != EACCES && errno != ESRCH) { *************** *** 226,229 **** --- 299,303 ---- close(fd); return 0; + } } if (opt_verbose) { |