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

Cyril Hrubis chrubis@suse.cz
Wed Mar 25 14:40:02 CET 2020


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.

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.

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.

> 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.

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

-- 
Cyril Hrubis
chrubis@suse.cz


More information about the ltp mailing list