[LTP] [PATCH v3] mmap01: Convert to new API

Jan Stancek jstancek@redhat.com
Tue Nov 19 13:49:25 CET 2024


On Mon, Nov 18, 2024 at 11:16 AM Ricardo B. Marliere via ltp
<ltp@lists.linux.it> wrote:
>
> From: Ricardo B. Marliere <rbm@suse.com>
>
> Refactor the old mmap01 code into the new LTP API.
>
> Signed-off-by: Ricardo B. Marliere <rbm@suse.com>

Acked-by: Jan Stancek <jstancek@redhat.com>

> ---
> Changes in v3:
> - Use SAFE_MMAP and SAFE_MUNMAP as suggested by Jan Stancek
> - Re-aligned a few comments
> - Link to v2: https://lore.kernel.org/r/20241114-convert_mmap01-v2-1-a8a1379dec89@suse.com
>
> Changes in v2:
> - Fixed metadata alignment
> - Link to v1: https://lore.kernel.org/r/20241113-convert_mmap01-v1-1-e7d60e7404c4@suse.com
> ---
>  testcases/kernel/syscalls/mmap/mmap01.c | 231 +++++++++++---------------------
>  1 file changed, 76 insertions(+), 155 deletions(-)
>
> diff --git a/testcases/kernel/syscalls/mmap/mmap01.c b/testcases/kernel/syscalls/mmap/mmap01.c
> index 99266b57ffc16e6c3a0e31a2c87d0f8106f429e5..cb60fed024af7ad7a3114ad2838a5a52d5d3a1dc 100644
> --- a/testcases/kernel/syscalls/mmap/mmap01.c
> +++ b/testcases/kernel/syscalls/mmap/mmap01.c
> @@ -1,57 +1,30 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
>  /*
>   * Copyright (c) International Business Machines  Corp., 2001
> + * Copyright (c) 2024 Ricardo B. Marliere <rbm@suse.com>
>   *
> - * 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
> + * HISTORY
> + *     07/2001 Ported by Wayne Boyer
>   */
>
> -/*
> - * Test Description:
> - *  Verify that, mmap() succeeds when used to map a file where size of the
> - *  file is not a multiple of the page size, the memory area beyond the end
> - *  of the file to the end of the page is accessible. Also, verify that
> - *  this area is all zeroed and the modifications done to this area are
> - *  not written to the file.
> +/*\
> + * [Description]
>   *
> - * Expected Result:
> - *  mmap() should succeed returning the address of the mapped region.
> - *  The memory area beyond the end of file to the end of page should be
> - *  filled with zero.
> - *  The changes beyond the end of file should not get written to the file.
> + * Verify that, mmap() succeeds when used to map a file where size of the
> + * file is not a multiple of the page size, the memory area beyond the end
> + * of the file to the end of the page is accessible. Also, verify that
> + * this area is all zeroed and the modifications done to this area are
> + * not written to the file.
>   *
> - * HISTORY
> - *     07/2001 Ported by Wayne Boyer
> + * mmap() should succeed returning the address of the mapped region.
> + * The memory area beyond the end of file to the end of page should be
> + * filled with zero.
> + * The changes beyond the end of file should not get written to the file.
>   */
> -#include <stdio.h>
> -#include <stdlib.h>
> -#include <sys/types.h>
> -#include <errno.h>
> -#include <unistd.h>
> -#include <fcntl.h>
> -#include <string.h>
> -#include <signal.h>
> -#include <stdint.h>
> -#include <sys/stat.h>
> -#include <sys/mman.h>
> -#include <sys/shm.h>
> -
> -#include "test.h"
> -
> -#define TEMPFILE       "mmapfile"
> -
> -char *TCID = "mmap01";
> -int TST_TOTAL = 1;
> +
> +#include "tst_test.h"
> +
> +#define TEMPFILE "mmapfile"
>
>  static char *addr;
>  static char *dummy;
> @@ -60,135 +33,83 @@ static size_t file_sz;
>  static int fildes;
>  static char cmd_buffer[BUFSIZ];
>
> -static void setup(void);
> -static void cleanup(void);
> -
> -int main(int ac, char **av)
> +static void run(void)
>  {
> -       int lc;
> -
> -       tst_parse_opts(ac, av, NULL, NULL);
> -
> -       setup();
> -
> -       for (lc = 0; TEST_LOOPING(lc); lc++) {
> -
> -               tst_count = 0;
> -
> -               /*
> -                * Call mmap to map the temporary file beyond EOF
> -                * with write access.
> -                */
> -               errno = 0;
> -               addr = mmap(NULL, page_sz, PROT_READ | PROT_WRITE,
> -                           MAP_FILE | MAP_SHARED, fildes, 0);
> -
> -               /* Check for the return value of mmap() */
> -               if (addr == MAP_FAILED) {
> -                       tst_resm(TFAIL | TERRNO, "mmap of %s failed", TEMPFILE);
> -                       continue;
> -               }
> -
> -               /*
> -                * Check if mapped memory area beyond EOF are
> -                * zeros and changes beyond EOF are not written
> -                * to file.
> -                */
> -               if (memcmp(&addr[file_sz], dummy, page_sz - file_sz)) {
> -                       tst_brkm(TFAIL, cleanup,
> -                                "mapped memory area contains invalid "
> -                                "data");
> -               }
> -
> -               /*
> -                * Initialize memory beyond file size
> -                */
> -               addr[file_sz] = 'X';
> -               addr[file_sz + 1] = 'Y';
> -               addr[file_sz + 2] = 'Z';
> -
> -               /*
> -                * Synchronize the mapped memory region
> -                * with the file.
> -                */
> -               if (msync(addr, page_sz, MS_SYNC) != 0) {
> -                       tst_brkm(TFAIL | TERRNO, cleanup,
> -                                "failed to synchronize mapped file");
> -               }
> -
> -               /*
> -                * Now, Search for the pattern 'XYZ' in the
> -                * temporary file.  The pattern should not be
> -                * found and the return value should be 1.
> -                */
> -               if (system(cmd_buffer) != 0) {
> -                       tst_resm(TPASS,
> -                                "Functionality of mmap() successful");
> -               } else {
> -                       tst_resm(TFAIL,
> -                                "Specified pattern found in file");
> -               }
> -
> -               /* Clean up things in case we are looping */
> -               /* Unmap the mapped memory */
> -               if (munmap(addr, page_sz) != 0) {
> -                       tst_brkm(TFAIL | TERRNO, NULL, "munmap failed");
> -               }
> +       addr = SAFE_MMAP(NULL, page_sz, PROT_READ | PROT_WRITE,
> +                        MAP_FILE | MAP_SHARED, fildes, 0);
> +
> +       /*
> +        * Check if mapped memory area beyond EOF are zeros and changes beyond
> +        * EOF are not written to file.
> +        */
> +       if (memcmp(&addr[file_sz], dummy, page_sz - file_sz))
> +               tst_brk(TFAIL, "mapped memory area contains invalid data");
> +
> +       /*
> +        * Initialize memory beyond file size
> +        */
> +       addr[file_sz] = 'X';
> +       addr[file_sz + 1] = 'Y';
> +       addr[file_sz + 2] = 'Z';
> +
> +       /*
> +        * Synchronize the mapped memory region with the file.
> +        */
> +       if (msync(addr, page_sz, MS_SYNC) != 0) {
> +               tst_res(TFAIL | TERRNO, "failed to synchronize mapped file");
> +               return;
>         }
>
> -       cleanup();
> -       tst_exit();
> +       /*
> +        * Now, search for the pattern 'XYZ' in the temporary file.
> +        * The pattern should not be found and the return value should be 1.
> +        */
> +       if (system(cmd_buffer) != 0) {
> +               tst_res(TPASS, "Functionality of mmap() successful");
> +       } else {
> +               tst_res(TFAIL, "Specified pattern found in file");
> +               return;
> +       }
> +
> +       SAFE_MUNMAP(addr, page_sz);
> +}
> +
> +static void cleanup(void)
> +{
> +       if (dummy)
> +               free(dummy);
> +       if (fildes > 0)
> +               SAFE_CLOSE(fildes);
>  }
>
>  static void setup(void)
>  {
>         struct stat stat_buf;
> -       char Path_name[PATH_MAX];
>         char write_buf[] = "hello world\n";
>
> -       tst_sig(FORK, DEF_HANDLER, cleanup);
> -
> -       TEST_PAUSE;
> -
> -       tst_tmpdir();
> -
> -       /* Get the path of temporary file to be created */
> -       if (getcwd(Path_name, sizeof(Path_name)) == NULL) {
> -               tst_brkm(TFAIL | TERRNO, cleanup,
> -                        "getcwd failed to get current working directory");
> -       }
> -
> -       /* Creat a temporary file used for mapping */
> -       if ((fildes = open(TEMPFILE, O_RDWR | O_CREAT, 0666)) < 0) {
> -               tst_brkm(TFAIL, cleanup, "opening %s failed", TEMPFILE);
> -       }
> +       /* Create a temporary file used for mapping */
> +       fildes = SAFE_OPEN(TEMPFILE, O_RDWR | O_CREAT, 0666);
>
>         /* Write some data into temporary file */
> -       if (write(fildes, write_buf, strlen(write_buf)) != (long)strlen(write_buf)) {
> -               tst_brkm(TFAIL, cleanup, "writing to %s", TEMPFILE);
> -       }
> +       SAFE_WRITE(SAFE_WRITE_ALL, fildes, write_buf, strlen(write_buf));
>
>         /* Get the size of temporary file */
> -       if (stat(TEMPFILE, &stat_buf) < 0) {
> -               tst_brkm(TFAIL | TERRNO, cleanup, "stat of %s failed",
> -                        TEMPFILE);
> -       }
> +       SAFE_STAT(TEMPFILE, &stat_buf);
>         file_sz = stat_buf.st_size;
>
>         page_sz = getpagesize();
>
>         /* Allocate and initialize dummy string of system page size bytes */
> -       if ((dummy = calloc(page_sz, sizeof(char))) == NULL) {
> -               tst_brkm(TFAIL, cleanup, "calloc failed (dummy)");
> -       }
> +       dummy = SAFE_CALLOC(page_sz, sizeof(char));
>
>         /* Create the command which will be executed in the test */
> -       sprintf(cmd_buffer, "grep XYZ %s/%s > /dev/null", Path_name, TEMPFILE);
> +       snprintf(cmd_buffer, sizeof(cmd_buffer),
> +                "grep XYZ %s > /dev/null", TEMPFILE);
>  }
>
> -static void cleanup(void)
> -{
> -       close(fildes);
> -       free(dummy);
> -       tst_rmdir();
> -}
> +static struct tst_test test = {
> +       .setup = setup,
> +       .cleanup = cleanup,
> +       .needs_tmpdir = 1,
> +       .test_all = run,
> +};
>
> ---
> base-commit: 865be36ffce81e795854d0bdd1cda17b4d5fd37d
> change-id: 20241113-convert_mmap01-db208e002801
>
> Best regards,
> --
> Ricardo B. Marliere <rbm@suse.com>
>
>
> --
> Mailing list info: https://lists.linux.it/listinfo/ltp
>



More information about the ltp mailing list