From: Matthias Maennich <maennich@google.com>
To: ltp@lists.linux.it
Subject: [LTP] [PATCH v4 2/3] aio_tio: convert to new lib
Date: Tue, 26 Feb 2019 17:02:42 +0000 [thread overview]
Message-ID: <20190226170243.134366-3-maennich@google.com> (raw)
In-Reply-To: <20190226170243.134366-1-maennich@google.com>
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@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
next prev parent reply other threads:[~2019-02-26 17:02 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-01-11 8:53 [LTP] [PATCH v2 1/2] aio_tio: fix error diagnosis for byte transfers Matthias Maennich
2019-01-11 8:53 ` [LTP] [PATCH v2 2/2] aio_tio: determine alignment based on target filesystem Matthias Maennich
2019-01-29 18:19 ` Steve Muckle
2019-02-22 15:33 ` Cyril Hrubis
2019-02-26 15:37 ` Matthias =?unknown-8bit?q?M=C3=A4nnich?=
2019-02-20 15:20 ` [LTP] [PATCH v3 0/3] aio_tio: fixes and conversion to new lib Matthias Maennich
2019-02-20 15:20 ` [LTP] [PATCH v3 1/3] aio_tio: fix error diagnosis for byte transfers Matthias Maennich
2019-02-20 15:20 ` [LTP] [PATCH v3 2/3] aio_tio: determine alignment based on target filesystem Matthias Maennich
2019-02-20 15:20 ` [LTP] [PATCH v3 3/3] aio_tio: convert to new lib Matthias Maennich
2019-02-22 20:40 ` Steve Muckle
2019-02-22 15:28 ` [LTP] [PATCH v2 1/2] aio_tio: fix error diagnosis for byte transfers Cyril Hrubis
2019-02-26 17:02 ` [LTP] [PATCH v4 0/3] aio_tio: fixes and conversion to new lib Matthias Maennich
2019-02-26 17:02 ` [LTP] [PATCH v4 1/3] aio_tio: determine alignment based on target block device Matthias Maennich
2019-02-26 17:02 ` Matthias Maennich [this message]
2019-02-26 19:13 ` [LTP] [PATCH v4 2/3] aio_tio: convert to new lib Steve Muckle
2019-03-15 11:50 ` Petr Vorel
2019-02-26 17:02 ` [LTP] [PATCH v4 3/3] io/aio: cleanup test directory Matthias Maennich
2019-02-26 19:16 ` Steve Muckle
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190226170243.134366-3-maennich@google.com \
--to=maennich@google.com \
--cc=ltp@lists.linux.it \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.