[LTP] [PATCH] aio_return: Remove cases and refactor 4-1.c

Yang Xu xuyang2018.jy@cn.fujitsu.com
Thu Mar 26 08:15:01 CET 2020


Hi Cyril


> Hi!
>>  From aio_return(3) manpage, the aio_return() function returns the
>> final return status for the asynchronous I/O request with control
>> block pointed to by aiocbp. It should be called only once for any
>> given request. If we want to call twice for same aiocbp, it only
>> returns the last value. It doesn't make sense. So remove 2-1.c and
>> 3-2.c.
> 
> For the open posix test you have to read the POSIX specification, not
> the manuals that describe how the interface is implemented in Linux.
> Oh, Thanks for the reminder and posix spec(When I looked into the reason 
  of openposix/twoptimers[1] failure, I guess it maybe related to posix 
spec, but I can not find document about it) .

[1]https://patchwork.ozlabs.org/patch/1261131/
> See: https://pubs.opengroup.org/onlinepubs/9699919799/
> 
> There it says that it may return error in case that it's called twice.
> Linux the test returns UNTESTED because we got the last value stored in
> the structure.
> 
Yes, I see "thereafter, if the same aiocb structure is used in a call to 
aio_return() or aio_error(), an error may be returned. "

I plan to create a FreeBSD12 env to see its posix manpage and action.
> The 3-2.c seems to be bogus, the description says that if the aiocb is
> reused for a subsequent AIO operation the aio_return() should work fine
> to retrieve it's status, but it's nearly identicall to 2-1.c.
I see 3-1.c code, it has tested this coverage. I think 2-1.c and 3.2 are 
identicall. I guess we should remove 3-2.c. Is it right?
> 
>> For 4-1.c, it failed with the same reason. But we can refactor this
>> , firstly call aio_return(&aiocb2) and then call aio_return(&aiocb).
>> It tests whether value override.
> 
> Looking at the assertions.xml the assertion 2 and 4 are nearly
> identical. The assertion 2 is a subset of assertion 4 so it makes sense
> to remove 2-1.c at least.
> 
Yes, they are nearly identical. But I think we should keep 2-1.c (remove 
3-2.c)because 2-1.c tests call twice and the second call may fail(we do 
nothing), but 4-1.c tests asynchronous I/O operation has not yet 
completed(such as read, sync,write not completed, we just create aiocb2 
  and memset but not call other I/O operation), then aio_return calls 
failed.

Best Regards
Yang Xu
> I guess that the 3-2.c may be rewritten to submit two operations so that
> we actually test what is in the description
> 
>> Reported-by: Gang Liu <liug.fnst@cn.fujitsu.com>
>> Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
>> ---
>>   .../conformance/interfaces/aio_return/2-1.c   | 108 -----------------
>>   .../conformance/interfaces/aio_return/3-2.c   | 111 ------------------
>>   .../conformance/interfaces/aio_return/4-1.c   |  23 +++-
>>   3 files changed, 18 insertions(+), 224 deletions(-)
>>   delete mode 100644 testcases/open_posix_testsuite/conformance/interfaces/aio_return/2-1.c
>>   delete mode 100644 testcases/open_posix_testsuite/conformance/interfaces/aio_return/3-2.c
>>
>> diff --git a/testcases/open_posix_testsuite/conformance/interfaces/aio_return/2-1.c b/testcases/open_posix_testsuite/conformance/interfaces/aio_return/2-1.c
>> deleted file mode 100644
>> index ac9873200..000000000
>> --- a/testcases/open_posix_testsuite/conformance/interfaces/aio_return/2-1.c
>> +++ /dev/null
>> @@ -1,108 +0,0 @@
>> -/*
>> - * Copyright (c) 2004, Bull SA. All rights reserved.
>> - * Created by:  Laurent.Vivier@bull.net
>> - * This file is licensed under the GPL license.  For the full content
>> - * of this license, see the COPYING file at the top level of this
>> - * source tree.
>> - */
>> -
>> -/*
>> - * assertion:
>> - *
>> - *	aio_return() may be called exactly once to retrieve the return status.
>> - *
>> - * method:
>> - *
>> - *	- open a file
>> - *	- fill in an aiocb for writing
>> - *	- call aio_write using this aiocb
>> - *	- call aio_return to get the aiocb status (number of bytes written)
>> - *	- call aio_return again, return status should be -1
>> - */
>> -
>> -#include <sys/stat.h>
>> -#include <aio.h>
>> -#include <errno.h>
>> -#include <fcntl.h>
>> -#include <stdio.h>
>> -#include <stdlib.h>
>> -#include <string.h>
>> -#include <unistd.h>
>> -#include "posixtest.h"
>> -#include <time.h>
>> -
>> -#define TNAME "aio_return/2-1.c"
>> -#define BUF_SIZE 111
>> -
>> -int main(void)
>> -{
>> -	char tmpfname[256];
>> -	char buf[BUF_SIZE];
>> -	struct aiocb aiocb;
>> -	int fd, retval;
>> -	struct timespec completion_wait_ts = {0, 10000000};
>> -
>> -	if (sysconf(_SC_ASYNCHRONOUS_IO) < 200112L)
>> -		return PTS_UNSUPPORTED;
>> -
>> -	snprintf(tmpfname, sizeof(tmpfname), "/tmp/pts_aio_return_2_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));
>> -		return PTS_UNRESOLVED;
>> -	}
>> -
>> -	unlink(tmpfname);
>> -
>> -	memset(buf, 0xaa, BUF_SIZE);
>> -	memset(&aiocb, 0, sizeof(struct aiocb));
>> -	aiocb.aio_fildes = fd;
>> -	aiocb.aio_buf = buf;
>> -	aiocb.aio_nbytes = BUF_SIZE;
>> -
>> -	if (aio_write(&aiocb) == -1) {
>> -		close(fd);
>> -		printf(TNAME " Error at aio_write(): %s\n",
>> -		       strerror(aio_error(&aiocb)));
>> -		return PTS_FAIL;
>> -	}
>> -
>> -	do {
>> -		nanosleep(&completion_wait_ts, NULL);
>> -		retval = aio_error(&aiocb);
>> -	} while (retval == EINPROGRESS);
>> -
>> -	retval = aio_return(&aiocb);
>> -
>> -	if (0 < retval) {
>> -
>> -		if (retval != BUF_SIZE) {
>> -			close(fd);
>> -			printf(TNAME " aio_return didn't return expected size: "
>> -			       "%d\n", retval);
>> -			return PTS_FAIL;
>> -		}
>> -
>> -		retval = aio_return(&aiocb);
>> -
>> -		if (retval != -1) {
>> -			close(fd);
>> -			printf(TNAME " Second call to aio_return() may "
>> -			       "return -1; aio_return() returned %d\n", retval);
>> -			return PTS_UNTESTED;
>> -		}
>> -
>> -	} else {
>> -		close(fd);
>> -		printf(TNAME " Error at aio_error(): %s\n",
>> -		       strerror(aio_error(&aiocb)));
>> -		return PTS_UNRESOLVED;
>> -	}
>> -
>> -	close(fd);
>> -	printf("Test PASSED\n");
>> -	return PTS_PASS;
>> -}
>> diff --git a/testcases/open_posix_testsuite/conformance/interfaces/aio_return/3-2.c b/testcases/open_posix_testsuite/conformance/interfaces/aio_return/3-2.c
>> deleted file mode 100644
>> index 883823bac..000000000
>> --- a/testcases/open_posix_testsuite/conformance/interfaces/aio_return/3-2.c
>> +++ /dev/null
>> @@ -1,111 +0,0 @@
>> -/*
>> - * Copyright (c) 2004, Bull SA. All rights reserved.
>> - * Created by:  Laurent.Vivier@bull.net
>> - * This file is licensed under the GPL license.  For the full content
>> - * of this license, see the COPYING file at the top level of this
>> - * source tree.
>> - */
>> -
>> -/*
>> - * assertion:
>> - *
>> - *	If the aiocbp is used to submit another asynchronous operation,
>> - *	then aio_return may be successfully used to retrieve the return status.
>> - *
>> - * method:
>> - *
>> - *	- open a file
>> - *	- fill in an aiocb for writing
>> - *	- call aio_write using this aiocb
>> - *	- call aio_return to get the aiocb status (number of bytes written)
>> - *	- call aio_return again, return status should be -1
>> - */
>> -
>> -#include <stdio.h>
>> -#include <sys/types.h>
>> -#include <unistd.h>
>> -#include <sys/stat.h>
>> -#include <fcntl.h>
>> -#include <string.h>
>> -#include <errno.h>
>> -#include <stdlib.h>
>> -#include <aio.h>
>> -#include <time.h>
>> -
>> -#include "posixtest.h"
>> -
>> -#define TNAME "aio_return/3-2.c"
>> -#define BUF_SIZE 4096
>> -
>> -int main(void)
>> -{
>> -	char tmpfname[256];
>> -	char buf[BUF_SIZE];
>> -	struct aiocb aiocb;
>> -	int fd, retval;
>> -	struct timespec completion_wait_ts = {0, 10000000};
>> -
>> -	if (sysconf(_SC_ASYNCHRONOUS_IO) < 200112L)
>> -		return PTS_UNSUPPORTED;
>> -
>> -	snprintf(tmpfname, sizeof(tmpfname), "/tmp/pts_aio_return_3_2_%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));
>> -		return PTS_UNRESOLVED;
>> -	}
>> -
>> -	unlink(tmpfname);
>> -
>> -	memset(buf, 0xaa, BUF_SIZE);
>> -	memset(&aiocb, 0, sizeof(struct aiocb));
>> -	aiocb.aio_fildes = fd;
>> -	aiocb.aio_buf = buf;
>> -	aiocb.aio_nbytes = BUF_SIZE;
>> -
>> -	if (aio_write(&aiocb) == -1) {
>> -		close(fd);
>> -		printf(TNAME " Error at aio_write(): %s\n",
>> -		       strerror(aio_error(&aiocb)));
>> -		return PTS_FAIL;
>> -	}
>> -
>> -	do {
>> -		nanosleep(&completion_wait_ts, NULL);
>> -		retval = aio_error(&aiocb);
>> -	} while (retval == EINPROGRESS);
>> -
>> -	retval = aio_return(&aiocb);
>> -
>> -	if (retval == -1) {
>> -		printf(TNAME " Error at aio_error(): %s\n",
>> -		       strerror(aio_error(&aiocb)));
>> -		return PTS_UNRESOLVED;
>> -	} else {
>> -
>> -		if (retval != BUF_SIZE) {
>> -			close(fd);
>> -			printf(TNAME " Error at aio_return(): %d, %s\n", retval,
>> -			       strerror(aio_error(&aiocb)));
>> -			return PTS_FAIL;
>> -		}
>> -
>> -		retval = aio_return(&aiocb);
>> -
>> -		if (retval != -1 && aio_error(&aiocb) != EINVAL) {
>> -			close(fd);
>> -			printf(TNAME " aio_return() may fail with (-1, %d); "
>> -			       "failed with (%d, %d) instead\n",
>> -			       EINVAL, retval, aio_error(&aiocb));
>> -			return PTS_UNTESTED;
>> -		}
>> -
>> -	}
>> -
>> -	close(fd);
>> -	printf("Test PASSED\n");
>> -	return PTS_PASS;
>> -}
>> diff --git a/testcases/open_posix_testsuite/conformance/interfaces/aio_return/4-1.c b/testcases/open_posix_testsuite/conformance/interfaces/aio_return/4-1.c
>> index 7a039b13f..770699b54 100644
>> --- a/testcases/open_posix_testsuite/conformance/interfaces/aio_return/4-1.c
>> +++ b/testcases/open_posix_testsuite/conformance/interfaces/aio_return/4-1.c
>> @@ -17,8 +17,10 @@
>>    *
>>    *	- Open a file
>>    *	- fill in an aiocb for writing
>> - *	- call aio_write usign this aiocb
>> + *	- call aio_write using this aiocb
>>    *	- fill in a new aiocb
>> + *	- call aio_write using this aiocb
>> + *	- call aio_return with aiocb
>>    *	- call aio_return with this last aiocb
>>    */
>>   
>> @@ -86,20 +88,31 @@ int main(void)
>>   		aiocb2.aio_fildes = fd;
>>   		aiocb2.aio_buf = buf;
>>   		aiocb2.aio_nbytes = BUF_SIZE;
>> +		if (aio_write(&aiocb2) == -1) {
>> +			close(fd);
>> +			printf(TNAME " Error at aio_write(): %s\n", strerror(errno));
>> +			return PTS_FAIL;
>> +		}
>> +
>> +		do {
>> +			nanosleep(&completion_wait_ts, NULL);
>> +			retval = aio_error(&aiocb);
>> +		} while (retval == EINPROGRESS);
>>   
>>   		retval = aio_return(&aiocb2);
>>   
>> -		if (retval != -1 || aio_error(&aiocb) != EINVAL) {
>> +		if (retval != BUF_SIZE) {
>>   			close(fd);
>> -			printf(TNAME "aio_return() have not failed\n");
>> -			return PTS_UNTESTED;
>> +			printf(TNAME " Error at aio_return(&aiocb2): %d, %s\n", retval,
>> +				strerror(aio_error(&aiocb)));
>> +			return PTS_UNRESOLVED;
>>   		}
>>   
>>   		retval = aio_return(&aiocb);
>>   
>>   		if (retval != BUF_SIZE) {
>>   			close(fd);
>> -			printf(TNAME " Error at aio_return(): %d, %s\n", retval,
>> +			printf(TNAME " Error at aio_return(&aiocb): %d, %s\n", retval,
>>   			       strerror(aio_error(&aiocb)));
>>   			return PTS_UNRESOLVED;
>>   		}
>> -- 
>> 2.23.0
>>
>>
>>
>>
>> -- 
>> Mailing list info: https://lists.linux.it/listinfo/ltp
> 




More information about the ltp mailing list