From mboxrd@z Thu Jan 1 00:00:00 1970 From: Matthias Maennich Date: Tue, 26 Feb 2019 17:02:42 +0000 Subject: [LTP] [PATCH v4 2/3] aio_tio: convert to new lib In-Reply-To: <20190226170243.134366-1-maennich@google.com> References: <20190111085326.171826-1-maennich@google.com> <20190226170243.134366-1-maennich@google.com> Message-ID: <20190226170243.134366-3-maennich@google.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: ltp@lists.linux.it Convert to the new test lib and perform various cleanups. Also refactor the test definition for readability. Signed-off-by: Matthias Maennich --- testcases/kernel/io/aio/aio02/Makefile | 24 +-- testcases/kernel/io/aio/aio02/aio_tio.c | 218 ++++++++++++------------ testcases/kernel/io/aio/aio02/common.h | 28 --- testcases/kernel/io/aio/aio02/main.c | 37 ---- 4 files changed, 110 insertions(+), 197 deletions(-) delete mode 100644 testcases/kernel/io/aio/aio02/common.h delete mode 100644 testcases/kernel/io/aio/aio02/main.c diff --git a/testcases/kernel/io/aio/aio02/Makefile b/testcases/kernel/io/aio/aio02/Makefile index a99807c26..629aa9a58 100644 --- a/testcases/kernel/io/aio/aio02/Makefile +++ b/testcases/kernel/io/aio/aio02/Makefile @@ -1,36 +1,14 @@ -# -# kernel/io/aio/aio2 testcase Makefile. +// SPDX-License-Identifier: GPL-2.0-or-later # # Copyright (C) 2009, Cisco Systems Inc. # -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Ngie Cooper, July 2009 -# top_srcdir ?= ../../../../.. include $(top_srcdir)/include/mk/testcases.mk -# Needed for common.h... CPPFLAGS += -D_GNU_SOURCE LDLIBS += $(AIO_LIBS) -FILTER_OUT_MAKE_TARGETS := main - include $(top_srcdir)/include/mk/generic_leaf_target.mk - -$(MAKE_TARGETS): %: %.o main.o diff --git a/testcases/kernel/io/aio/aio02/aio_tio.c b/testcases/kernel/io/aio/aio02/aio_tio.c index ddf71e85b..be53ace68 100644 --- a/testcases/kernel/io/aio/aio02/aio_tio.c +++ b/testcases/kernel/io/aio/aio02/aio_tio.c @@ -1,72 +1,100 @@ -/************************************************************************************* -* -* Copyright (c) International Business Machines Corp., 2003 -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 2 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See -* the GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program; if not, write to the Free Software -* Foundation, -* -* FILE : aio_tio -* USAGE : ./aio_tio -* -* DESCRIPTION : This program will test Asynchronous I/O for 2.5 Kernel infrastructure -* REQUIREMENTS: -* 1) libaio-0.3.92 or up for 2.5 kernal -* 2) glibc 2.1.91 or up -* HISTORY : -* 11/03/2003 Kai Zhao (ltcd3@cn.ibm.com) -* -* CODE COVERAGE: -* 68.3% - fs/aio.c -* -************************************************************************************/ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) International Business Machines Corp., 2003 + * + * AUTHORS + * Kai Zhao (ltcd3@cn.ibm.com) + * + * DESCRIPTION : Test Asynchronous I/O for 2.5 Kernel Infrastructure + * + * REQUIREMENTS: + * 1) libaio-0.3.92 or up for 2.5 kernel + * 2) glibc 2.1.91 or up + */ #include "config.h" -#include "common.h" -#include "test.h" -#include "safe_macros.h" -#include +#include "tst_test.h" #include +#include +#include +#include #ifdef HAVE_LIBAIO +#include #define AIO_MAXIO 32 #define AIO_BLKSIZE (64*1024) static int wait_count = 0; +/* + * test case definition + */ +struct testcase { + const char *description; + int flags; + int operation; +} testcases[] = { + {"WRITE: O_WRONLY | O_TRUNC | O_DIRECT | O_LARGEFILE | O_CREAT", + O_WRONLY | O_TRUNC | O_DIRECT | O_LARGEFILE | O_CREAT, + IO_CMD_PWRITE + }, + {"WRITE: O_RDONLY | O_DIRECT | O_LARGEFILE", + O_RDONLY | O_DIRECT | O_LARGEFILE, + IO_CMD_PREAD + }, + {"WRITE: O_RDWR | O_TRUNC", + O_RDWR | O_TRUNC, + IO_CMD_PWRITE + }, + {"READ : O_RDWR", + O_RDWR, + IO_CMD_PREAD + }, + {"WRITE: O_WRONLY | O_TRUNC", + O_WRONLY | O_TRUNC, + IO_CMD_PWRITE + }, + {"READ : O_RDONLY", + O_RDONLY, + IO_CMD_PREAD + }, +}; + +/* + * Fatal error handler + */ +static void io_error(const char *func, int rc) +{ + if (rc == -ENOSYS) + tst_brk(TCONF, "AIO not in this kernel\n"); + else if (rc < 0) + tst_brk(TFAIL, "%s: %s\n", func, strerror(-rc)); + else + tst_brk(TFAIL, "%s: error %d\n", func, rc); +} + /* * write work done */ static void work_done(io_context_t ctx, struct iocb *iocb, long res, long res2) { + (void) ctx; // silence compiler warning (-Wunused) - if (res2 != 0) { + if (res2 != 0) io_error("aio write", res2); - } - if (res != iocb->u.c.nbytes) { - fprintf(stderr, "write missed bytes expect %lu got %ld\n", + if (res != (long)iocb->u.c.nbytes) + tst_brk(TFAIL, "write missed bytes expect %lu got %ld\n", iocb->u.c.nbytes, res); - exit(1); - } + wait_count--; } /* * io_wait_run() - wait for an io_event and then call the callback. */ -int io_wait_run(io_context_t ctx, struct timespec *to) +static int io_wait_run(io_context_t ctx, struct timespec *to) { struct io_event events[AIO_MAXIO]; struct io_event *ep; @@ -88,7 +116,7 @@ int io_wait_run(io_context_t ctx, struct timespec *to) return ret; } -int io_tio(char *pathname, int flag, int n, int operation) +static int io_tio(char *pathname, int flag, int operation) { int res, fd = 0, i = 0; void *bufptr = NULL; @@ -101,31 +129,26 @@ int io_tio(char *pathname, int flag, int n, int operation) struct iocb iocb_array[AIO_MAXIO]; struct iocb *iocbps[AIO_MAXIO]; - fd = open(pathname, flag, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); - if (fd <= 0) { - printf("open for %s failed: %s\n", pathname, strerror(errno)); - return -1; - } + fd = SAFE_OPEN(pathname, flag, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); /* determine the alignment from the blksize of the underlying device */ - SAFE_FSTAT(NULL, fd, &fi_stat); + SAFE_FSTAT(fd, &fi_stat); alignment = fi_stat.st_blksize; - res = io_queue_init(n, &myctx); - //printf (" res = %d \n", res); + res = io_queue_init(AIO_MAXIO, &myctx); for (i = 0; i < AIO_MAXIO; i++) { switch (operation) { case IO_CMD_PWRITE: if (posix_memalign(&bufptr, alignment, AIO_BLKSIZE)) { - perror(" posix_memalign failed "); + tst_brk(TBROK | TERRNO, "posix_memalign failed"); return -1; } memset(bufptr, 0, AIO_BLKSIZE); io_prep_pwrite(&iocb_array[i], fd, bufptr, - AIO_BLKSIZE, offset); + AIO_BLKSIZE, offset); io_set_callback(&iocb_array[i], work_done); iocbps[i] = &iocb_array[i]; offset += AIO_BLKSIZE; @@ -133,13 +156,13 @@ int io_tio(char *pathname, int flag, int n, int operation) break; case IO_CMD_PREAD: if (posix_memalign(&bufptr, alignment, AIO_BLKSIZE)) { - perror(" posix_memalign failed "); + tst_brk(TBROK | TERRNO, "posix_memalign failed"); return -1; } memset(bufptr, 0, AIO_BLKSIZE); io_prep_pread(&iocb_array[i], fd, bufptr, - AIO_BLKSIZE, offset); + AIO_BLKSIZE, offset); io_set_callback(&iocb_array[i], work_done); iocbps[i] = &iocb_array[i]; offset += AIO_BLKSIZE; @@ -148,9 +171,7 @@ int io_tio(char *pathname, int flag, int n, int operation) case IO_CMD_NOOP: break; default: - tst_resm(TFAIL, - "Command failed; opcode returned: %d\n", - operation); + tst_res(TFAIL, "Command failed; opcode returned: %d\n", operation); return -1; break; } @@ -159,13 +180,13 @@ int io_tio(char *pathname, int flag, int n, int operation) do { res = io_submit(myctx, AIO_MAXIO, iocbps); } while (res == -EAGAIN); - if (res < 0) { + + if (res < 0) io_error("io_submit tio", res); - } /* - * We have submitted all the i/o requests. Wait for@least one to complete - * and call the callbacks. + * We have submitted all the i/o requests. Wait for them to complete and + * call the callbacks. */ wait_count = AIO_MAXIO; @@ -185,62 +206,41 @@ int io_tio(char *pathname, int flag, int n, int operation) break; } - close(fd); + SAFE_CLOSE(fd); - for (i = 0; i < AIO_MAXIO; i++) { - if (iocb_array[i].u.c.buf != NULL) { + for (i = 0; i < AIO_MAXIO; i++) + if (iocb_array[i].u.c.buf != NULL) free(iocb_array[i].u.c.buf); - } - } io_queue_release(myctx); return 0; } -int test_main(void) +static void test_io(unsigned int n) { - int status = 0; - - tst_resm(TINFO, "Running test 1\n"); - status = io_tio("file1", - O_TRUNC | O_DIRECT | O_WRONLY | O_CREAT | O_LARGEFILE, - AIO_MAXIO, IO_CMD_PWRITE); - if (status) { - return status; - } - - tst_resm(TINFO, "Running test 2\n"); - status = io_tio("file1", O_RDONLY | O_DIRECT | O_LARGEFILE, - AIO_MAXIO, IO_CMD_PREAD); - if (status) { - return status; - } - - tst_resm(TINFO, "Running test 3\n"); - status = io_tio("file1", O_TRUNC | O_RDWR, AIO_MAXIO, IO_CMD_PWRITE); - if (status) { - return status; - } - - tst_resm(TINFO, "Running test 4\n"); - status = io_tio("file1", O_RDWR, AIO_MAXIO, IO_CMD_PREAD); - if (status) { - return status; - } - - tst_resm(TINFO, "Running test 5\n"); - status = io_tio("file1", O_TRUNC | O_WRONLY, AIO_MAXIO, IO_CMD_PWRITE); - if (status) { - return status; - } + int status; + struct testcase *tc = testcases + n; + + tst_res(TINFO, "%s", tc->description); + status = io_tio("file", tc->flags, tc->operation); + if (status) + tst_res(TFAIL, "%s, status = %d", tc->description, status); + else + tst_res(TPASS, "%s", tc->description); +} - tst_resm(TINFO, "Running test 6 \n"); - status = io_tio("file1", O_RDONLY, AIO_MAXIO, IO_CMD_PREAD); - if (status) { - return status; - } +#else - return status; +static void test_main(void) +{ + tst_brk(TCONF, "test requires libaio and its development packages"); } + #endif + +static struct tst_test test = { + .needs_tmpdir = 1, + .test = test_io, + .tcnt = ARRAY_SIZE(testcases), +}; diff --git a/testcases/kernel/io/aio/aio02/common.h b/testcases/kernel/io/aio/aio02/common.h deleted file mode 100644 index 4b80761a6..000000000 --- a/testcases/kernel/io/aio/aio02/common.h +++ /dev/null @@ -1,28 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#if HAVE_LIBAIO_H -#include -#endif -#include -#include -#include -#include -#include - -/* Fatal error handler */ -static void io_error(const char *func, int rc) -{ - if (rc == -ENOSYS) - fprintf(stderr, "AIO not in this kernel\n"); - else if (rc < 0) - fprintf(stderr, "%s: %s\n", func, strerror(-rc)); - else - fprintf(stderr, "%s: error %d\n", func, rc); - - exit(1); -} diff --git a/testcases/kernel/io/aio/aio02/main.c b/testcases/kernel/io/aio/aio02/main.c deleted file mode 100644 index 7b157f31b..000000000 --- a/testcases/kernel/io/aio/aio02/main.c +++ /dev/null @@ -1,37 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -#include "config.h" -#include "test.h" - -#define TEST_NAME "aio_tio" - -char *TCID = "aio02/" TEST_NAME; -int TST_TOTAL = 0; - -#ifdef HAVE_LIBAIO -#include - -int test_main(void); - -int main(void) -{ - tst_tmpdir(); - - test_main(); - - tst_rmdir(); - tst_exit(); -} -#else -int main(void) -{ - tst_brkm(TCONF, NULL, "test requires libaio and it's development packages"); -} -#endif -- 2.21.0.rc2.261.ga7da99ff1b-goog