[LTP] [PATCH] swapon: commit swapfile caches to disk

Li Wang liwang@redhat.com
Tue Jun 12 15:12:12 CEST 2018


On Tue, Jun 12, 2018 at 8:56 PM, Jan Stancek <jstancek@redhat.com> wrote:

>
> ----- Original Message -----
> > Testcase include swapon(8) fails on mainline kernel-v4.17+ as:
> >   swapon01    1  TFAIL  :  swapon01.c:47: Failed to turn on swapfile:
> >   TEST_ERRNO=EINVAL(22): Invalid argument
> >   swapon02    4  TFAIL  :  swapon02.c:91: swapon(2) failed to produce
> >   expected error: 16, errno: EBUSY and got 22.
> >   swapon03    1  TFAIL  :  swapon03.c:243: Failed to setup swaps
> >   swapoff01   1  TBROK  :  swapoff01.c:64: Failed to turn on the swap
> file,
> >   skipping test iteration
> >
> > And dmesg shows that:
> >   [  128.698981] swapon: file is not committed
> >
> > The error located in IOMAP_F_DIRTY(linux/fs/iomap.c) checking, which
> means
> > this swapfile have uncommitted metadata in caches. After adding sync() to
> > the end of all mkswap opertaion, these errors were gone.
> >
> > linux/fs/iomap.c:
> >       static loff_t iomap_swapfile_activate_actor(
> >               struct inode *inode,
> >               loff_t pos,
> >               loff_t count,
> >               void *data,
> >               struct iomap *iomap)
> >       {
> >               struct iomap_swapfile_info *isi = data;
> >               int error;
> >               ...
> >
> >               /* No uncommitted metadata or shared blocks. */
> >               if (iomap->flags & IOMAP_F_DIRTY) {
> >                       pr_err("swapon: file is not committed\n");
> >                       return -EINVAL;
> >               }
> >               ...
> >       }
> >                                                                       }
> > Signed-off-by: Li Wang <liwang@redhat.com>
> > ---
> >
> > Notes:
> >     The new changes about swapfile activation function were merged in
> >     kernel-4.17
> >     recently, so we didn't hit this failures before.
>
> Comment/code in mkswap, that has been present for years:
>         /*
>          * A subsequent swapon() will fail if the signature
>          * is not actually on disk. (This is a kernel bug.)
>          * The fsync() in close_fd() will take care of writing.
>          */
>
> I'm assuming your mkswap is recent enough. Any idea why fsync()
> in mkswap is no longer enough?
>


​Good catch, Jan. It sounds like a mkswap/fsync issue.

Both of my mkswap failed to sync that, let me re-check it later.

#  rpm -qf /usr/sbin/mkswap
util-linux-2.23.2-43.el7.x86_64

# rpm -qf /usr/sbin/mkswap
util-linux-2.23.2-52.el7.x86_64




>
> Regards,
> Jan
>
> >
> >  testcases/kernel/syscalls/swapoff/swapoff01.c | 2 ++
> >  testcases/kernel/syscalls/swapoff/swapoff02.c | 2 ++
> >  testcases/kernel/syscalls/swapon/libswapon.c  | 2 ++
> >  3 files changed, 6 insertions(+)
> >
> > diff --git a/testcases/kernel/syscalls/swapoff/swapoff01.c
> > b/testcases/kernel/syscalls/swapoff/swapoff01.c
> > index a63e661..b587b0d 100644
> > --- a/testcases/kernel/syscalls/swapoff/swapoff01.c
> > +++ b/testcases/kernel/syscalls/swapoff/swapoff01.c
> > @@ -105,6 +105,8 @@ static void setup(void)
> >
> >       if (system("mkswap swapfile01 > tmpfile 2>&1") != 0)
> >               tst_brkm(TBROK, cleanup, "Failed to make swapfile");
> > +
> > +     sync();
> >  }
> >
> >  static void cleanup(void)
> > diff --git a/testcases/kernel/syscalls/swapoff/swapoff02.c
> > b/testcases/kernel/syscalls/swapoff/swapoff02.c
> > index b5c6312..d8c5889 100644
> > --- a/testcases/kernel/syscalls/swapoff/swapoff02.c
> > +++ b/testcases/kernel/syscalls/swapoff/swapoff02.c
> > @@ -154,6 +154,8 @@ static void setup(void)
> >
> >       if (tst_fill_file("./swapfile01", 0x00, 1024, 1))
> >               tst_brkm(TBROK, cleanup, "Failed to create swapfile");
> > +
> > +     sync();
> >  }
> >
> >  static void cleanup(void)
> > diff --git a/testcases/kernel/syscalls/swapon/libswapon.c
> > b/testcases/kernel/syscalls/swapon/libswapon.c
> > index cf6a988..49fa5ed 100644
> > --- a/testcases/kernel/syscalls/swapon/libswapon.c
> > +++ b/testcases/kernel/syscalls/swapon/libswapon.c
> > @@ -46,4 +46,6 @@ void make_swapfile(void (cleanup)(void), const char
> > *swapfile)
> >       argv[2] = NULL;
> >
> >       tst_run_cmd(cleanup, argv, "/dev/null", "/dev/null", 0);
> > +
> > +     sync();
> >  }
> > --
> > 1.9.3
> >
> >
> > --
> > Mailing list info: https://lists.linux.it/listinfo/ltp
> >
>



-- 
Regards,
Li Wang
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.linux.it/pipermail/ltp/attachments/20180612/2924ebc9/attachment.html>


More information about the ltp mailing list