Re: [PATCH v12 15/17] ovl: Remove redirect when data of a metacopy file is copied up

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

 



On Thu, Mar 15, 2018 at 8:47 PM, Vivek Goyal <vgoyal@xxxxxxxxxx> wrote:
> On Wed, Mar 14, 2018 at 03:15:33PM -0400, Vivek Goyal wrote:
>> On Wed, Mar 07, 2018 at 10:21:30AM +0200, Amir Goldstein wrote:
>> > On Tue, Mar 6, 2018 at 10:54 PM, Vivek Goyal <vgoyal@xxxxxxxxxx> wrote:
>> > > When a metacopy file is no longer a metacopy and data has been copied up,
>> > > remove REDIRECT xattr. Its not needed anymore.
>> > >
>> > > Signed-off-by: Vivek Goyal <vgoyal@xxxxxxxxxx>
>> > > ---
>> > >  fs/overlayfs/copy_up.c | 9 +++++++++
>> > >  1 file changed, 9 insertions(+)
>> > >
>> > > diff --git a/fs/overlayfs/copy_up.c b/fs/overlayfs/copy_up.c
>> > > index 0c8d2755bd25..704febd2e2fa 100644
>> > > --- a/fs/overlayfs/copy_up.c
>> > > +++ b/fs/overlayfs/copy_up.c
>> > > @@ -775,6 +775,15 @@ static int ovl_copy_up_meta_inode_data(struct ovl_copy_up_ctx *c)
>> > >         if (err)
>> > >                 return err;
>> > >
>> > > +       /*
>> > > +        * A metacopy files does not need redirect xattr once data has
>> > > +        * been copied up.
>> > > +        */
>> > > +       err = vfs_removexattr(upperpath.dentry, OVL_XATTR_REDIRECT);
>> > > +       if (err && err != -ENODATA && err != -EOPNOTSUPP)
>> > > +               return err;
>> > > +
>> > > +       err = 0;
>> > >         ovl_set_upperdata(d_inode(c->dentry));
>> > >         return err;
>> >
>> > By intuition, I would say that removing redirect should be done after setting
>> > upperdata flag. Not sure if it really matters in real life.
>> > Maybe when racing a lookup of a metacopy hardlink and copy up data of
>> > an upper alias?
>>
>> I think you found a good race situation.
>>
>> >
>> > Also, it would make sense to also ovl_dentry_set_redirect(c->dentry, NULL)
>> > probably use a helper ovl_clear_redirect() for the locking.
>> >
>> > But that highlights a serious problem with current patches -
>> > Access to OVL_I(inode)->redirect is protected with parent mutex in ovl_lookup()
>> > and additionally with dentry->d_lock in ovl_rename()
>> > That is sufficient for directories which can only have a single dentry
>> > alias to an
>> > inode but not at all sufficient for non-directories.
>>
>> This is a good point. So we need to protect OVL_I(inode)->redirect with
>> oi->lock mutex as well (atleast for non-dirs). So ovl_rename() will nest
>> 3 locks (which it already does for index case).
>>
>> parent dir i_mutex.
>>  oi->lock
>>    dentry->d_lock().
>>
>> I will try to write a patch for this and see what issues do I face
>
> Hi Amir,
>
> I am trying to understand better how you are taking oi->lock w.r.t
> nlink stuff and I am having a hard time.
>
> - Why do you keep oi->locked for the duration of operation (link, unlink
>   etc) using ovl_nlink_start() and ovl_nlink_end().

As the comment above ovl_nlink_start() says, union nlink may be changed
by link(), unlink() and copyup. nlink is an overlay inode property, so we need
to protect its updates with a lock on the inode object, which in this level if
oi->lock. Also, in ovl_nlink_end() we cleanup the index on last union nlink drop
and we need to do that also under inode object lock.

>
> - What exactly is oi->lock protecting. I understand its protecting
>   copy up. What else. Comment just says "synchronize copy up and more"
>   and its not clear what is that "more".

It is protecting operations that need to be serialized on the overlay inode
object, while inode->i_rwsem cannot be used for that purpose, because
it is used earlier in the locking order by VFS layer.
Those operations include copyup and union nlink update. I don't recall
there are other users for oi->lock at the moment, but did not check.

>
>   I need to understand that better to be able to use this lock for
>   protecting "oi->redirect" for the case of hard links.
>

If I am not mistaken, as long as you preserve locking order, you
should be able to use oi->lock to protect oi->redirect updates.
After all oi->redirect is really a property on the overlay inode.
It just happens to be protected a dentry level lock, from the time
that redirect was stored in the overlay dentry and that is only
still correct because of the one to one mapping between directory
inode and dentry.

Cheers,
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