[LTP] [PATCH v4 2/3] aio_tio: convert to new lib
Matthias Maennich
maennich@google.com
Tue Feb 26 18:02:42 CET 2019
Convert to the new test lib and perform various cleanups.
Also refactor the test definition for readability.
Signed-off-by: Matthias Maennich <maennich@google.com>
---
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 <string.h>
+#include "tst_test.h"
#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
#ifdef HAVE_LIBAIO
+#include <libaio.h>
#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 at 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 <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/param.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <sys/select.h>
-#if HAVE_LIBAIO_H
-#include <libaio.h>
-#endif
-#include <sys/uio.h>
-#include <assert.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <string.h>
-
-/* 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 <stdio.h>
-#include <errno.h>
-#include <assert.h>
-#include <stdlib.h>
-#include <fcntl.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-
-#include "config.h"
-#include "test.h"
-
-#define TEST_NAME "aio_tio"
-
-char *TCID = "aio02/" TEST_NAME;
-int TST_TOTAL = 0;
-
-#ifdef HAVE_LIBAIO
-#include <libaio.h>
-
-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
More information about the ltp
mailing list