[LTP] [PATCH v3] syscalls/swap{on, off}: skip if FIBMAP ioctl trial fails

Li Wang liwan@redhat.com
Tue May 7 10:52:01 CEST 2019


Hi Murphy,

On Wed, May 1, 2019 at 7:59 AM Murphy Zhou <xzhou@redhat.com> wrote:

> That means swapfile in the test filesystem is not supported.
> Add a test helper to do a FIBMAP ioctl test. Remove old fs type whitelist
> code.
>
> Signed-off-by: Murphy Zhou <xzhou@redhat.com>
> ---
> v2:
>    Test FIBMAP instead of fstype whitelist.
> v3:
>    Fix fs_type undeclared in swapoff01.c.
>
>  include/tst_fs.h                              |  5 +++
>  lib/tst_ioctl.c                               | 41 +++++++++++++++++++
>  testcases/kernel/syscalls/swapoff/swapoff01.c | 13 ++----
>  testcases/kernel/syscalls/swapoff/swapoff02.c | 11 +++--
>  testcases/kernel/syscalls/swapon/swapon01.c   | 13 ++----
>  testcases/kernel/syscalls/swapon/swapon02.c   | 16 ++------
>  testcases/kernel/syscalls/swapon/swapon03.c   | 20 ++-------
>  7 files changed, 65 insertions(+), 54 deletions(-)
>  create mode 100644 lib/tst_ioctl.c
>
> diff --git a/include/tst_fs.h b/include/tst_fs.h
> index b2b19ada6..cc38b3547 100644
> --- a/include/tst_fs.h
> +++ b/include/tst_fs.h
> @@ -172,6 +172,11 @@ const char **tst_get_supported_fs_types(void);
>   */
>  void tst_fill_fs(const char *path, int verbose);
>
> +/*
> + * test if FIBMAP ioctl is supported
> + */
> +int tst_fibmap(void);
> +
>  #ifdef TST_TEST_H__
>  static inline long tst_fs_type(const char *path)
>  {
> diff --git a/lib/tst_ioctl.c b/lib/tst_ioctl.c
> new file mode 100644
> index 000000000..d468d5898
> --- /dev/null
> +++ b/lib/tst_ioctl.c
> @@ -0,0 +1,41 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +
> +#include <errno.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <sys/ioctl.h>
> +#include <linux/fs.h>
> +
> +#define TST_NO_DEFAULT_MAIN
> +
> +#include "tst_test.h"
> +
> +int tst_fibmap(void)
> +{
> +       /* test if FIBMAP ioctl is supported */
> +       int fd, block = 0;
> +       const char *tmpdir = getenv("TMPDIR");
> +       char buf[128];
> +
> +       tst_res(TINFO, "Testing if FIBMAP ioctl is supported in %s",
> tmpdir);
> +
> +       sprintf(buf, "%s/tst_fibmap", tmpdir);
> +
> +       fd = open(buf, O_RDWR | O_CREAT, 0666);
> +       if (fd < 0) {
> +               tst_res(TWARN | TERRNO,
> +                        "open(%s, O_RDWR | O_CREAT, 0666) failed", buf);
> +               return 1;
> +       }
> +
> +       if (ioctl(fd, FIBMAP, &block)) {
> +               close(fd);
> +               return 1;
> +       }
> +
> +       if (close(fd)) {
> +               tst_res(TWARN | TERRNO, "close(fd) failed");
> +               return 1;
> +       }
> +       return 0;
> +}
> diff --git a/testcases/kernel/syscalls/swapoff/swapoff01.c
> b/testcases/kernel/syscalls/swapoff/swapoff01.c
> index a63e661a5..a37cd9be1 100644
> --- a/testcases/kernel/syscalls/swapoff/swapoff01.c
> +++ b/testcases/kernel/syscalls/swapoff/swapoff01.c
> @@ -55,11 +55,6 @@ int main(int ac, char **av)
>  static void verify_swapoff(void)
>  {
>         if (ltp_syscall(__NR_swapon, "./swapfile01", 0) != 0) {
> -               if (fs_type == TST_BTRFS_MAGIC && errno == EINVAL) {
> -                       tst_brkm(TCONF, cleanup,
> -                                "Swapfiles on BTRFS are not implemented");
> -               }
> -
>                 tst_resm(TBROK, "Failed to turn on the swap file"
>                          ", skipping test iteration");
>                 return;
> @@ -86,13 +81,11 @@ static void setup(void)
>
>         tst_tmpdir();
>
> -       switch ((fs_type = tst_fs_type(cleanup, "."))) {
> -       case TST_NFS_MAGIC:
> -       case TST_TMPFS_MAGIC:
> +       fs_type = tst_fs_type(cleanup, ".");
> +       if (tst_fibmap()) {
>                 tst_brkm(TCONF, cleanup,
> -                        "Cannot do swapoff on a file on %s filesystem",
> +                        "Cannot do FIBMAP ioctl on a file on %s
> filesystem",
>                          tst_fs_type_name(fs_type));
> -       break;
>         }
>
>         if (!tst_fs_has_free(NULL, ".", 64, TST_MB)) {
> diff --git a/testcases/kernel/syscalls/swapoff/swapoff02.c
> b/testcases/kernel/syscalls/swapoff/swapoff02.c
> index b5c6312a1..889f3c800 100644
> --- a/testcases/kernel/syscalls/swapoff/swapoff02.c
> +++ b/testcases/kernel/syscalls/swapoff/swapoff02.c
> @@ -43,6 +43,7 @@ char *TCID = "swapoff02";
>  int TST_TOTAL = 3;
>
>  static uid_t nobody_uid;
> +static long fs_type;
>
>  static struct test_case_t {
>         char *err_desc;
> @@ -138,13 +139,11 @@ static void setup(void)
>
>         tst_tmpdir();
>
> -       switch ((type = tst_fs_type(cleanup, "."))) {
> -       case TST_NFS_MAGIC:
> -       case TST_TMPFS_MAGIC:
> +       fs_type = tst_fs_type(cleanup, ".");
> +       if (tst_fibmap()) {
>                 tst_brkm(TCONF, cleanup,
> -                        "Cannot do swapoff on a file on %s filesystem",
> -                        tst_fs_type_name(type));
> -       break;
> +                        "Cannot do FIBMAP ioctl on a file on %s
> filesystem",
> +                        tst_fs_type_name(fs_type));
>         }
>
>         if (!tst_fs_has_free(NULL, ".", 1, TST_KB)) {
> diff --git a/testcases/kernel/syscalls/swapon/swapon01.c
> b/testcases/kernel/syscalls/swapon/swapon01.c
> index 32538f82b..0a5a3de86 100644
> --- a/testcases/kernel/syscalls/swapon/swapon01.c
> +++ b/testcases/kernel/syscalls/swapon/swapon01.c
> @@ -39,11 +39,6 @@ static void verify_swapon(void)
>         TEST(ltp_syscall(__NR_swapon, "./swapfile01", 0));
>
>         if (TEST_RETURN == -1) {
> -               if (fs_type == TST_BTRFS_MAGIC && errno == EINVAL) {
> -                       tst_brkm(TCONF, cleanup,
> -                                "Swapfile on BTRFS not implemeted");
> -                       return;
> -               }
>                 tst_resm(TFAIL | TTERRNO, "Failed to turn on swapfile");
>         } else {
>                 tst_resm(TPASS, "Succeeded to turn on swapfile");
> @@ -84,13 +79,11 @@ static void setup(void)
>
>         tst_tmpdir();
>
> -       switch ((fs_type = tst_fs_type(cleanup, "."))) {
> -       case TST_NFS_MAGIC:
> -       case TST_TMPFS_MAGIC:
> +       fs_type = tst_fs_type(cleanup, ".");
> +       if (tst_fibmap()) {
>

I'm not sure whether FIBMAP ioctl FAIL means that swapfile is unsupportted
on a filesystem.
If that's true, shouldn't we verify FIBMAP ioctl on the swapfile?  Here you
just test that in a tmp file, it probably not a correct way I guess.

IMO, maybe we can define the function API as:
    tst_fibmap(const char *filename);
And calling it in behind of make_swapfile(cleanup, "swapfile01");

Beside that, there is another issue in this patch, since the
getenv("TMPDIR"); depend on runltp script, so we cann't run the test
independently.

# ./swapon01
tst_ioctl.c:20: INFO: Testing if FIBMAP ioctl is supported in (null)
tst_ioctl.c:27: WARN: open((null)/tst_fibmap, O_RDWR | O_CREAT, 0666)
failed: ENOENT
swapon01    1  TCONF  :  swapon01.c:86: Cannot do FIBMAP ioctl on a file on
XFS filesystem
swapon01    2  TCONF  :  swapon01.c:86: Remaining cases not appropriate for
configuration

-- 
Regards,
Li Wang
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.linux.it/pipermail/ltp/attachments/20190507/9bdefaa0/attachment-0001.html>


More information about the ltp mailing list