Message ID | 20211130145206.32124-1-andrea.cervesato@suse.com |
---|---|
State | Superseded |
Headers | show |
Series | [v1] Refactoring dio_append.c test using LTP API | expand |
Hi, there's an bug in the patch that I'm going to fix in v2 Andrea On 11/30/21 15:52, Andrea Cervesato wrote: > Signed-off-by: Andrea Cervesato<andrea.cervesato@suse.com> > --- > testcases/kernel/io/ltp-aiodio/dio_append.c | 174 ++++++++------------ > 1 file changed, 71 insertions(+), 103 deletions(-) > > diff --git a/testcases/kernel/io/ltp-aiodio/dio_append.c b/testcases/kernel/io/ltp-aiodio/dio_append.c > index b1b4dc039..d6999064d 100644 > --- a/testcases/kernel/io/ltp-aiodio/dio_append.c > +++ b/testcases/kernel/io/ltp-aiodio/dio_append.c > @@ -1,143 +1,111 @@ > - > +// SPDX-License-Identifier: GPL-2.0-or-later > /* > * Copyright (c) 2004 Daniel McNeil<daniel@osdl.org> > - * 2004 Open Source Development Lab > - * 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 > - * > - * Module: .c > + * 2004 Open Source Development Lab > + * 2004 Marty Ridgeway<mridge@us.ibm.com> > + * Copyright (C) 2021 SUSE LLC Andrea Cervesato<andrea.cervesato@suse.com> > */ > > -/* > - * Change History: > - * > - * 2/2004 Marty Ridgeway (mridge@us.ibm.com) Changes to adapt to LTP > +/*\ > + * [Description] > * > + * Append zeroed data to a file using O_DIRECT while other processes are doing > + * buffered reads and check if the buffer reads always see zero. > */ > -/* > - * dio_append - append zeroed data to a file using O_DIRECT while > - * a 2nd process is doing buffered reads and check if the buffer > - * reads always see zero. > - */ > + > #define _GNU_SOURCE > > #include <stdlib.h> > -#include <sys/types.h> > -#include <signal.h> > -#include <errno.h> > -#include <fcntl.h> > -#include <stdio.h> > #include <unistd.h> > -#include <memory.h> > -#include <limits.h> > +#include <fcntl.h> > +#include "tst_test.h" > +#include "common.h" > > -#include "test.h" > -#define NUM_CHILDREN 8 > +#define NUM_CHILDREN 16 > +#define FILE_SIZE (64 * 1024) > > -#include "common_checkzero.h" > +static int *run_child; > > -int read_eof(char *filename) > +static void read_eof(const char *filename, size_t bs) > { > int fd; > - int i; > int r; > - char buf[4096]; > + char *bufptr; > > - while ((fd = open(filename, O_RDONLY)) < 0) { > - sleep(1); /* wait for file to be created */ > - } > + bufptr = SAFE_MEMALIGN(getpagesize(), bs); > + > + while ((fd = open(filename, O_RDONLY, 0666)) < 0) > + usleep(100); > > - for (i = 0; i < 1000000; i++) { > + tst_res(TINFO, "child %i reading file", getpid()); > + while (*run_child) { > off_t offset; > char *bufoff; > > - offset = lseek(fd, SEEK_END, 0); > - r = read(fd, buf, 4096); > - if (r > 0) { > - if ((bufoff = check_zero(buf, r))) { > - fprintf(stderr, "non-zero read at offset %p\n", > - offset + bufoff); > - exit(1); > + offset = SAFE_LSEEK(fd, 0, SEEK_SET); > + do { > + r = read(fd, bufptr, bs); > + if (r > 0) { > + bufoff = check_zero(bufptr, r); > + if (bufoff) { > + tst_res(TINFO, "non-zero read at offset %zu", > + offset + (bufoff - bufptr)); > + free(bufptr); > + SAFE_CLOSE(fd); > + return; > + } > + offset += r; > } > - } > + } while (r > 0); > } > - return 0; > + > + free(bufptr); > + SAFE_CLOSE(fd); > } > > -void dio_append(char *filename) > +static void setup(void) > { > - int fd; > - void *bufptr = NULL; > - int i; > - int w; > - > - fd = open(filename, O_DIRECT | O_WRONLY | O_CREAT, 0666); > - > - if (fd < 0) { > - perror("cannot create file"); > - return; > - } > - > - TEST(posix_memalign(&bufptr, 4096, 64 * 1024)); > - if (TEST_RETURN) { > - tst_resm(TBROK | TRERRNO, "cannot malloc aligned memory"); > - close(fd); > - return; > - } > + run_child = SAFE_MMAP(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); > +} > > - memset(bufptr, 0, 64 * 1024); > - for (i = 0; i < 1000; i++) { > - if ((w = write(fd, bufptr, 64 * 1024)) != 64 * 1024) { > - fprintf(stderr, "write %d returned %d\n", i, w); > - } > - } > +static void cleanup(void) > +{ > + SAFE_MUNMAP(run_child, sizeof(int)); > } > > -int main(void) > +static void run(void) > { > - char filename[PATH_MAX]; > - int pid[NUM_CHILDREN]; > - int num_children = 1; > + char *filename = "file"; > + int filesize = FILE_SIZE; > + int num_children = NUM_CHILDREN; > + int status; > int i; > > - snprintf(filename, sizeof(filename), "%s/aiodio/file", > - getenv("TMP") ? getenv("TMP") : "/tmp"); > - > - printf("Begin dio_append test...\n"); > + *run_child = 1; > > for (i = 0; i < num_children; i++) { > - if ((pid[i] = fork()) == 0) { > - /* child */ > - return read_eof(filename); > - } else if (pid[i] < 0) { > - /* error */ > - perror("fork error"); > - break; > - } else { > - /* Parent */ > - continue; > + if (!SAFE_FORK()) { > + read_eof(filename, filesize); > + return; > } > } > > - /* > - * Parent appends to end of file using direct i/o > - */ > + tst_res(TINFO, "parent append to file"); > > - dio_append(filename); > + io_append(filename, 0, O_DIRECT | O_WRONLY | O_CREAT, filesize, 1000); > > - for (i = 0; i < num_children; i++) { > - kill(pid[i], SIGTERM); > - } > - return 0; > + if (SAFE_WAITPID(-1, &status, WNOHANG)) > + tst_res(TFAIL, "Non zero bytes read"); > + else > + tst_res(TPASS, "All bytes read were zeroed"); > + > + *run_child = 0; > } > + > +static struct tst_test test = { > + .test_all = run, > + .setup = setup, > + .cleanup = cleanup, > + .needs_tmpdir = 1, > + .forks_child = 1, > +};
diff --git a/testcases/kernel/io/ltp-aiodio/dio_append.c b/testcases/kernel/io/ltp-aiodio/dio_append.c index b1b4dc039..d6999064d 100644 --- a/testcases/kernel/io/ltp-aiodio/dio_append.c +++ b/testcases/kernel/io/ltp-aiodio/dio_append.c @@ -1,143 +1,111 @@ - +// SPDX-License-Identifier: GPL-2.0-or-later /* * Copyright (c) 2004 Daniel McNeil <daniel@osdl.org> - * 2004 Open Source Development Lab - * 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 - * - * Module: .c + * 2004 Open Source Development Lab + * 2004 Marty Ridgeway <mridge@us.ibm.com> + * Copyright (C) 2021 SUSE LLC Andrea Cervesato <andrea.cervesato@suse.com> */ -/* - * Change History: - * - * 2/2004 Marty Ridgeway (mridge@us.ibm.com) Changes to adapt to LTP +/*\ + * [Description] * + * Append zeroed data to a file using O_DIRECT while other processes are doing + * buffered reads and check if the buffer reads always see zero. */ -/* - * dio_append - append zeroed data to a file using O_DIRECT while - * a 2nd process is doing buffered reads and check if the buffer - * reads always see zero. - */ + #define _GNU_SOURCE #include <stdlib.h> -#include <sys/types.h> -#include <signal.h> -#include <errno.h> -#include <fcntl.h> -#include <stdio.h> #include <unistd.h> -#include <memory.h> -#include <limits.h> +#include <fcntl.h> +#include "tst_test.h" +#include "common.h" -#include "test.h" -#define NUM_CHILDREN 8 +#define NUM_CHILDREN 16 +#define FILE_SIZE (64 * 1024) -#include "common_checkzero.h" +static int *run_child; -int read_eof(char *filename) +static void read_eof(const char *filename, size_t bs) { int fd; - int i; int r; - char buf[4096]; + char *bufptr; - while ((fd = open(filename, O_RDONLY)) < 0) { - sleep(1); /* wait for file to be created */ - } + bufptr = SAFE_MEMALIGN(getpagesize(), bs); + + while ((fd = open(filename, O_RDONLY, 0666)) < 0) + usleep(100); - for (i = 0; i < 1000000; i++) { + tst_res(TINFO, "child %i reading file", getpid()); + while (*run_child) { off_t offset; char *bufoff; - offset = lseek(fd, SEEK_END, 0); - r = read(fd, buf, 4096); - if (r > 0) { - if ((bufoff = check_zero(buf, r))) { - fprintf(stderr, "non-zero read at offset %p\n", - offset + bufoff); - exit(1); + offset = SAFE_LSEEK(fd, 0, SEEK_SET); + do { + r = read(fd, bufptr, bs); + if (r > 0) { + bufoff = check_zero(bufptr, r); + if (bufoff) { + tst_res(TINFO, "non-zero read at offset %zu", + offset + (bufoff - bufptr)); + free(bufptr); + SAFE_CLOSE(fd); + return; + } + offset += r; } - } + } while (r > 0); } - return 0; + + free(bufptr); + SAFE_CLOSE(fd); } -void dio_append(char *filename) +static void setup(void) { - int fd; - void *bufptr = NULL; - int i; - int w; - - fd = open(filename, O_DIRECT | O_WRONLY | O_CREAT, 0666); - - if (fd < 0) { - perror("cannot create file"); - return; - } - - TEST(posix_memalign(&bufptr, 4096, 64 * 1024)); - if (TEST_RETURN) { - tst_resm(TBROK | TRERRNO, "cannot malloc aligned memory"); - close(fd); - return; - } + run_child = SAFE_MMAP(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); +} - memset(bufptr, 0, 64 * 1024); - for (i = 0; i < 1000; i++) { - if ((w = write(fd, bufptr, 64 * 1024)) != 64 * 1024) { - fprintf(stderr, "write %d returned %d\n", i, w); - } - } +static void cleanup(void) +{ + SAFE_MUNMAP(run_child, sizeof(int)); } -int main(void) +static void run(void) { - char filename[PATH_MAX]; - int pid[NUM_CHILDREN]; - int num_children = 1; + char *filename = "file"; + int filesize = FILE_SIZE; + int num_children = NUM_CHILDREN; + int status; int i; - snprintf(filename, sizeof(filename), "%s/aiodio/file", - getenv("TMP") ? getenv("TMP") : "/tmp"); - - printf("Begin dio_append test...\n"); + *run_child = 1; for (i = 0; i < num_children; i++) { - if ((pid[i] = fork()) == 0) { - /* child */ - return read_eof(filename); - } else if (pid[i] < 0) { - /* error */ - perror("fork error"); - break; - } else { - /* Parent */ - continue; + if (!SAFE_FORK()) { + read_eof(filename, filesize); + return; } } - /* - * Parent appends to end of file using direct i/o - */ + tst_res(TINFO, "parent append to file"); - dio_append(filename); + io_append(filename, 0, O_DIRECT | O_WRONLY | O_CREAT, filesize, 1000); - for (i = 0; i < num_children; i++) { - kill(pid[i], SIGTERM); - } - return 0; + if (SAFE_WAITPID(-1, &status, WNOHANG)) + tst_res(TFAIL, "Non zero bytes read"); + else + tst_res(TPASS, "All bytes read were zeroed"); + + *run_child = 0; } + +static struct tst_test test = { + .test_all = run, + .setup = setup, + .cleanup = cleanup, + .needs_tmpdir = 1, + .forks_child = 1, +};
Signed-off-by: Andrea Cervesato <andrea.cervesato@suse.com> --- testcases/kernel/io/ltp-aiodio/dio_append.c | 174 ++++++++------------ 1 file changed, 71 insertions(+), 103 deletions(-)