Re: [PATCH v2] generic/530: fix shutdown failure of generic/530 in overlay

[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]



On Mon, May 20, 2019 at 9:18 PM Darrick J. Wong <darrick.wong@xxxxxxxxxx> wrote:
>
> On Mon, May 13, 2019 at 02:11:05PM +0800, Jeffle Xu wrote:
> > Testcases are recommended to use  _require_scratch_shutdown()
> > and _scratch_shutdown() pair helper function to test and execute
> > shutdown.
> >
> > generic/530 formmerly used _require_scratch_shutdown() to test
> > whether the filesystem supports shutdown or not, while executed
> > the shutdown action in a raw binary (src/t_open_tmpfiles) rather
> > than the recommended _scratch_shutdown() helper. This will cause
> > a "shutdown: Inappropriate ioctl for device" error message when
> > testing overlay filesystem.
> >
> > This patch simply move the shutdown action from the raw binary
> > into the packaged _scratch_shutdown() helper. That is, we remove
> > the "shutdown" interface of t_open_tmpfiles.c and call
> > _scratch_shutdown() in genric/530 and xfs/501.
> >
> > thx
> >
> > Signed-off-by: Jeffle Xu <jefflexu@xxxxxxxxxxxxxxxxx>
> > ---
> >  src/t_open_tmpfiles.c | 19 -------------------
> >  tests/generic/530     |  4 +++-
> >  tests/xfs/501         |  4 +++-
> >  3 files changed, 6 insertions(+), 21 deletions(-)
> >
> > diff --git a/src/t_open_tmpfiles.c b/src/t_open_tmpfiles.c
> > index da9390f..0393c6b 100644
> > --- a/src/t_open_tmpfiles.c
> > +++ b/src/t_open_tmpfiles.c
> > @@ -24,7 +24,6 @@ static int min_fd = -1;
> >  static int max_fd = -1;
> >  static unsigned int nr_opened = 0;
> >  static float start_time;
> > -static int shutdown_fs = 0;
> >
> >  void clock_time(float *time)
> >  {
> > @@ -69,22 +68,6 @@ void die(void)
> >                               end_time - start_time);
> >               fflush(stdout);
> >
> > -             if (shutdown_fs) {
> > -                     /*
> > -                      * Flush the log so that we have to process the
> > -                      * unlinked inodes the next time we mount.
> > -                      */
> > -                     int flag = XFS_FSOP_GOING_FLAGS_LOGFLUSH;
> > -                     int ret;
> > -
> > -                     ret = ioctl(min_fd, XFS_IOC_GOINGDOWN, &flag);
> > -                     if (ret) {
> > -                             perror("shutdown");
> > -                             exit(2);
> > -                     }
> > -                     exit(0);
> > -             }
> > -
> >               clock_time(&start_time);
> >               for (fd = min_fd; fd <= max_fd; fd++)
> >                       close(fd);
> > @@ -160,8 +143,6 @@ int main(int argc, char *argv[])
> >               if (ret)
> >                       perror(argv[1]);
> >       }
> > -     if (argc > 2 && !strcmp(argv[2], "shutdown"))
> > -             shutdown_fs = 1;
> >
> >       clock_time(&start_time);
> >       while (1)
> > diff --git a/tests/generic/530 b/tests/generic/530
> > index b0d188b..56c6d32 100755
> > --- a/tests/generic/530
> > +++ b/tests/generic/530
> > @@ -49,7 +49,9 @@ ulimit -n $max_files
> >
> >  # Open a lot of unlinked files
> >  echo create >> $seqres.full
> > -$here/src/t_open_tmpfiles $SCRATCH_MNT shutdown >> $seqres.full
> > +$here/src/t_open_tmpfiles $SCRATCH_MNT >> $seqres.full
> > +_scratch_shutdown -f
> > +
> >
> >  # Unmount to prove that we can clean it all
> >  echo umount >> $seqres.full
> > diff --git a/tests/xfs/501 b/tests/xfs/501
> > index 974f341..4be9997 100755
> > --- a/tests/xfs/501
> > +++ b/tests/xfs/501
> > @@ -54,7 +54,9 @@ ulimit -n $max_files
> >
> >  # Open a lot of unlinked files
> >  echo create >> $seqres.full
> > -$here/src/t_open_tmpfiles $SCRATCH_MNT shutdown >> $seqres.full
> > +$here/src/t_open_tmpfiles $SCRATCH_MNT >> $seqres.full
> > +_scratch_shutdown -f
>
> NAK.
>
> The whole point of both of these tests is to check the operation of
> unlinked inode recovery after filesystem failure.  Moving the shutdown
> call so that it happens after t_open_tmpfiles exits and releases all the
> fds renders both tests completely broken and pointless.
>
> The _require_scratch_shutdown behavior overlayfs (as I was hinting
> before I left for vacation) is not particularly intuitive, and the next
> step ought to have been "Ok, the helpers' behavior is intentional and
> any program that wants to test shutdown has to use a file on the lower
> fs; how do we pass the necessary control handle to t_open_tmpfiles", not
> ripping out the offending code without figuring out what the test
> actually does.
>
> IOWS,
>
> _scratch_shutdown_handle() {
>         if [ $FSTYP = "overlayfs" ]; then
>                 echo "$OVL_BASE_SCRATCH_MNT"
>         else
>                 echo "$SCRATCH_MNT"
>         fi
> }
>
> $here/src/t_open_tmpfiles $SCRATCH_MNT shutdown $(_scratch_shutdown_handle)
>

That sounds reasonable to me.

As a side note, overlayfs doesn't support O_TMPFILE.
I am not sure if there is any filesystem that doesn't support
O_TMPFILE which gains
important coverage from the !try_o_tmpfile code??

If there isn't, we could just require O_TMPFILE support and be done with that,
but I guess if we got this far...

> Oh, it's already upstream, I'll send a revert later <grumble>...
>

Hmm, I had a bad feeling about this one.
I should have said CC-and-wait-for-ack-by Darick.

Thanks,
Amir.



[Index of Archives]     [Linux Filesystems Development]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux