From: Mitani <mi...@ry...> - 2010-10-13 01:38:38
|
> -----Original Message----- > From: Garrett Cooper [mailto:yan...@gm...] > Sent: Wednesday, October 13, 2010 5:24 AM > To: Bian Naimeng > Cc: Mitani; ltp...@li...; 當座 健市 > Subject: Re: [LTP] [PATCH] fix "aio_error" test > > 2010/10/8 Bian Naimeng <bi...@cn...>: > >> Hi, > >> > >> > >> "conformance/interfaces/aio_error/3-1" failed with following > message: > >> ------------ > >> conformance/interfaces/aio_error/3-1: execution: FAILED: Output: > >> aio_error/3-1.c bad aio_read return value() > >> ------------ > >> > >> This testset seems to be the error root test for "aio_error()". > >> Therefore, "aio_error()" must be called after failure of > "aio_write()", > >> I think. > >> But, "exit()" is called when expected failure of "aio_write()" > occurred: > >> ------------(3-1.c) > >> if (aio_write(&aiocb) != 0) > >> { > >> printf(TNAME " bad aio_read return value()\n"); > >> exit(PTS_FAIL); > >> } > >> ------------ > >> > >> I think that "exit()" must be called when "aio_write()" succeeded. > >> > > > > Agree. > > > >> And the message of unexpected movement of "aio_write()" is > >> "aio_read()"'s one. > >> And the indent of this program "3-1.c" seems to include both space > and tab. > >> I want to revise them, too. > >> > > > > Another one should be fix like this. > > > > if (ret != EINVAL) > > { > > - printf(TNAME " errno is not EINVAL %s\n", > strerror(errno)); > > + printf(TNAME " errno is not EINVAL %s\n", > strerror(ret)); > > return PTS_FAIL; > > } > > > >> > >> Signed-off-by: Tomonori Mitani <mi...@ry...> > >> ============ > >> --- > >> > a/testcases/open_posix_testsuite/conformance/interfaces/aio_error/ > 3-1.c 2010 > >> -09-22 22:31:24.000000000 +0900 > >> +++ > >> > b/testcases/open_posix_testsuite/conformance/interfaces/aio_error/ > 3-1.c 2010 > >> -09-30 09:51:42.000000000 +0900 > >> @@ -36,42 +36,41 @@ > >> > >> int main() > >> { > >> - > >> - char tmpfname[256]; > >> + char tmpfname[256]; > >> #define BUF_SIZE 512 > >> - char buf[BUF_SIZE]; > >> - int fd; > >> - struct aiocb aiocb; > >> + char buf[BUF_SIZE]; > >> + int fd; > >> + struct aiocb aiocb; > >> int ret=0; > >> > >> if (sysconf(_SC_ASYNCHRONOUS_IO) != 200112L) > >> return PTS_UNSUPPORTED; > >> > >> - snprintf(tmpfname, sizeof(tmpfname), > "/tmp/pts_aio_error_3_1_%d", > >> - getpid()); > >> - unlink(tmpfname); > >> - fd = open(tmpfname, O_CREAT | O_RDWR | O_EXCL, > >> - S_IRUSR | S_IWUSR); > >> - if (fd == -1) > >> - { > >> - printf(TNAME " Error at open(): %s\n", > >> - strerror(errno)); > >> - exit(PTS_UNRESOLVED); > >> - } > >> + snprintf(tmpfname, sizeof(tmpfname), > "/tmp/pts_aio_error_3_1_%d", > >> + getpid()); > >> + unlink(tmpfname); > >> + fd = open(tmpfname, O_CREAT | O_RDWR | O_EXCL, > >> + S_IRUSR | S_IWUSR); > >> + if (fd == -1) > >> + { > >> + printf(TNAME " Error at open(): %s\n", > >> + strerror(errno)); > >> + exit(PTS_UNRESOLVED); > >> + } > >> > >> - unlink(tmpfname); > >> + unlink(tmpfname); > >> > >> memset (&aiocb, 0, sizeof (struct aiocb)); > >> > >> - aiocb.aio_fildes = fd; > >> - aiocb.aio_buf = buf; > >> - aiocb.aio_reqprio = -1; > >> - aiocb.aio_nbytes = BUF_SIZE; > >> + aiocb.aio_fildes = fd; > >> + aiocb.aio_buf = buf; > >> + aiocb.aio_reqprio = -1; > >> + aiocb.aio_nbytes = BUF_SIZE; > >> > >> - if (aio_write(&aiocb) != 0) > >> + if (aio_write(&aiocb) == 0) > >> { > >> - printf(TNAME " bad aio_read return value()\n"); > >> - exit(PTS_FAIL); > >> + printf(TNAME " bad aio_write return value()\n"); > >> + exit(PTS_FAIL); > >> } > >> > >> while (aio_error (&aiocb) == EINPROGRESS); > > I'll respond to this sometime in the next couple of days after I > do some more investigation on the issue. > Thanks, > -Garrett Hi, I added Bian's following opinion to patch: ------------ Another one should be fix like this. if (ret != EINVAL) { - printf(TNAME " errno is not EINVAL %s\n", strerror(errno)); + printf(TNAME " errno is not EINVAL %s\n", strerror(ret)); return PTS_FAIL; } ------------ And I added following two modifications. - Closing the file descriptor when exit. - Clear "errno". The first "unlink()" fails because the file doesn't exist. After that, ENOENT is set to "errno" and kept intact. I revised to clear "errno". I noticed that there were similar problems in the other "aio-..." test programs. But I cannot judge whether other test programs must be revised. I revise only "aio_error/3-1". Signed-off-by: Tomonori Mitani <mi...@ry...> ============ --- testcases/open_posix_testsuite/conformance/interfaces/aio_error/3-1.c 2010-10-03 09:53:52.000000000 +0900 +++ testcases/open_posix_testsuite/conformance/interfaces/aio_error/3-1.new 2010-10-13 09:30:12.000000000 +0900 @@ -36,42 +36,43 @@ int main() { - - char tmpfname[256]; + char tmpfname[256]; #define BUF_SIZE 512 - char buf[BUF_SIZE]; - int fd; - struct aiocb aiocb; + char buf[BUF_SIZE]; + int fd; + struct aiocb aiocb; int ret=0; if (sysconf(_SC_ASYNCHRONOUS_IO) != 200112L) return PTS_UNSUPPORTED; - snprintf(tmpfname, sizeof(tmpfname), "/tmp/pts_aio_error_3_1_%d", - getpid()); - unlink(tmpfname); - fd = open(tmpfname, O_CREAT | O_RDWR | O_EXCL, - S_IRUSR | S_IWUSR); - if (fd == -1) - { - printf(TNAME " Error at open(): %s\n", - strerror(errno)); - exit(PTS_UNRESOLVED); - } + snprintf(tmpfname, sizeof(tmpfname), "/tmp/pts_aio_error_3_1_%d", + getpid()); + unlink(tmpfname); + errno = 0; + fd = open(tmpfname, O_CREAT | O_RDWR | O_EXCL, + S_IRUSR | S_IWUSR); + if (fd == -1) + { + printf(TNAME " Error at open(): %s\n", + strerror(errno)); + exit(PTS_UNRESOLVED); + } - unlink(tmpfname); + unlink(tmpfname); memset (&aiocb, 0, sizeof (struct aiocb)); - aiocb.aio_fildes = fd; - aiocb.aio_buf = buf; - aiocb.aio_reqprio = -1; - aiocb.aio_nbytes = BUF_SIZE; + aiocb.aio_fildes = fd; + aiocb.aio_buf = buf; + aiocb.aio_reqprio = -1; + aiocb.aio_nbytes = BUF_SIZE; - if (aio_write(&aiocb) != 0) + if (aio_write(&aiocb) == 0) { - printf(TNAME " bad aio_read return value()\n"); - exit(PTS_FAIL); + close(fd); + printf(TNAME " bad aio_write return value()\n"); + exit(PTS_FAIL); } while (aio_error (&aiocb) == EINPROGRESS); @@ -79,7 +80,8 @@ if (ret != EINVAL) { - printf(TNAME " errno is not EINVAL %s\n", strerror(errno)); + close(fd); + printf(TNAME " errno is not EINVAL %s\n", strerror(ret)); return PTS_FAIL; } ============ Regards-- -Tomonori Mitani |