Re: overlayfs: NFS lowerdir changes & opaque negative lookups

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

 



On Wed, Jul 17, 2024 at 6:37 PM Daire Byrne <daire@xxxxxxxx> wrote:
>
> On Fri, 12 Jul 2024 at 00:30, Amir Goldstein <amir73il@xxxxxxxxx> wrote:
> >
> >
> > One more thing that could help said service is if overlayfs
> > supported a hybrid mode of redirect_dir=follow,metacopy=on,
> > where redirect is enabled for regular files for metacopy, but NOT
> > enabled for directories (which was redirect_dir original use case).
> >
> > This way, the service could run the command line:
> > $ mv /ovl/blah/thing /ovl/local
> > then "mv" will get EXDEV for moving directories and will create
> > opaque directories in their place and it will recursively move all
> > the files to the opaque directories.
> >
> > Actually, current code does not even check for redirect_dir=on
> > (i.e. in ovl_can_move()) before setting redirect xattr on regular
> > metacopy files.
> >
> > So as far as I can tell, the following UNTESTED patch might
> > be acceptable, so you can try it out if you like if you think this
> > will help you implement to suggestions above:
> >
> > --- a/fs/overlayfs/params.c
> > +++ b/fs/overlayfs/params.c
> > @@ -824,15 +824,9 @@ int ovl_fs_params_verify(const struct ovl_fs_context *ctx,
> >                 config->metacopy = true;
> >         }
> >
> > -       /*
> > -        * This is to make the logic below simpler.  It doesn't make any other
> > -        * difference, since redirect_dir=on is only used for upper.
> > -        */
> > -       if (!config->upperdir && config->redirect_mode == OVL_REDIRECT_FOLLOW)
> > -               config->redirect_mode = OVL_REDIRECT_ON;
> > -
> >         /* Resolve verity -> metacopy -> redirect_dir dependency */
> > -       if (config->metacopy && config->redirect_mode != OVL_REDIRECT_ON) {
> > +       if (config->metacopy && config->redirect_mode != OVL_REDIRECT_ON &&
> > +                               config->redirect_mode != OVL_REDIRECT_FOLLOW) {
> >                 if (set.metacopy && set.redirect) {
> >                         pr_err("conflicting options:
> > metacopy=on,redirect_dir=%s\n",
> >                                ovl_redirect_mode(config));
> > --
> >
> > Apologies in advance if this idea is flawed.
>
> I finally got around to testing this out
> (metacopy=on,redirect_dir=follow). I had to munge it slightly for
> v6.3.7 (because that's what I had quickly to hand on this
> workstation).
>
> So then I did something like:
>
> mkdir /ovl/lib (makes new opaque dir)
> mv /ovl/blah/thing/version/lib/* /ovl/lib/
> rm -rf  /ovl/blah/thing/version/lib
> mv /ovl/lib /ovl/blah/thing/version/lib
>
> With this I get an opaque lib dir and new (non-opaque) dirs below with
> all files containing xattr redirects to the lower level files.
>
> One issue I came across is that it was failing to "mv" symlinks:
>
> mv: cannot move '/ovl/blah/thing/version/lib/libpcre.so' to
> '/ovl/lib/libpcre.so': No such device or address
> mv: cannot move '/ovl/blah/thing/version/lib/libpcre.so.1' to
> '/ovl/lib/libpcre.so.1': No such device or address
>

Not sure. You'll need to debug the problem.

> Where the lib in the same dir they point to was "moved" just fine.
> Again, I can't be certain that my munge of the patch for v6.3.7 isn't
> at fault.
>
> Apart from that, clearly this is a much faster way to build a metadata
> overlay with a root opaque directory in the way that I wanted
> (localising all library dirs and associated lookups).
>
> One doubt, I only need an opaque directory at the top (lib) and then
> everything in the tree below will always come from the upper overlay
> right? So lib/stuff/python2 where lib is opaque and stuff and python2
> are just dirs that would normally be merged but for the opaque lib
> dir? I'm probably confusing myself a little at this point.

If we want to use accurate terminology, lib is not "opaque", but it is
a "pure upper". it only needs to be "opaque" if there is a lower dir
below it that needs to be hidden, so lib will become "opaque" when
you move it *back* into place above the former lower lib dir.

The story with stuff/python2 is - when they are moved into the
opaque lib, they are pure upper and not opaque, then when
lib is moved back, the whole tree just moves so stuff/python2
remain pure upper and not opaque.

Unless I missed something...

>
> I'm aware you can have the redirect on a dir below the lib directory
> to get back to the lower dir contents again. I'm just not sure when
> you are many dir levels down past the only opaque one.
>

With redirect_dir=follow, new dir redirects are not created when moving
directories. Only non-dir metacopy redirects are created.

Thanks,
Amir.





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

  Powered by Linux