Re: [PATCH v12 13/17] ovl: Check redirects for metacopy files

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

 



On Tue, Mar 6, 2018 at 10:54 PM, Vivek Goyal <vgoyal@xxxxxxxxxx> wrote:
> Right now we rely on path based lookup for data origin of metacopy upper.
> This will work only if upper has not been renamed. We solved this problem
> already for merged directories using redirect. Use same logic for metacopy
> files.
>
> This patch just goes on to check redirects for metacopy files.
>
> Signed-off-by: Vivek Goyal <vgoyal@xxxxxxxxxx>
> ---
>  fs/overlayfs/namei.c | 17 ++++++++---------
>  1 file changed, 8 insertions(+), 9 deletions(-)
>
> diff --git a/fs/overlayfs/namei.c b/fs/overlayfs/namei.c
> index 220e754c974b..a4a5c5f5540d 100644
> --- a/fs/overlayfs/namei.c
> +++ b/fs/overlayfs/namei.c
> @@ -265,22 +265,22 @@ static int ovl_lookup_single(struct dentry *base, struct ovl_lookup_data *d,
>                 goto put_and_out;
>         }
>         if (!d_can_lookup(this)) {
> -               if (d->is_dir)
> -                       goto put_and_out;
> +               d->is_dir = false;

That test was supposed to catch non-dir under dir from an upper layer
but you are loosing the information stored in d->dir.

>                 err = ovl_check_metacopy_xattr(this);
>                 if (err < 0)
>                         goto out_err;
>                 if (!err) {
>                         d->stop = true;
>                         d->metacopy = false;
> +                       goto out;
>                 } else
>                         d->metacopy = true;
> -               goto out;
> -       }
> -       d->is_dir = true;
> -       if (!d->last && ovl_is_opaquedir(this)) {
> -               d->stop = d->opaque = true;
> -               goto out;
> +       } else {
> +               d->is_dir = true;
> +               if (!d->last && ovl_is_opaquedir(this)) {
> +                       d->stop = d->opaque = true;
> +                       goto out;

I think there is a bug here - not related to your change, but semi related
to your recent fix patch (patch 1 in this series).

d->last is set to true when lookup in parent poe->numlower layer,
but parent may be pure upper for example and redirect from child can still
continue lookup to lower layers. If a directory is marked both "redirect" and
"opaque" (which is an inconsistency). In that case, d->last will be true
and opaque xattr will not be checked, but redirect will be checked.

Since AFAIK d->last is an optimization, I think it could be relaxed to
lower.layer->idx == roe->numlower - 1
and then for the d->last case, we can skip both opaque and redirect checks
and skip redirect check for both directory and metadata.


> +               }
>         }
>         err = ovl_check_redirect(this, d, prelen, post);
>         if (err)

Thanks,
Amir.
--
To unsubscribe from this list: send the line "unsubscribe linux-unionfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[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