Re: [PATCH v2 03/23] ovl: store layer index in ovl_layer

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

 



On Fri, Jan 5, 2018 at 12:22 PM, Amir Goldstein <amir73il@xxxxxxxxx> wrote:
> On Fri, Jan 5, 2018 at 7:05 AM, Amir Goldstein <amir73il@xxxxxxxxx> wrote:
>> On Thu, Jan 4, 2018 at 11:00 PM, Vivek Goyal <vgoyal@xxxxxxxxxx> wrote:
>>> On Thu, Jan 04, 2018 at 06:39:58PM +0200, Amir Goldstein wrote:
>>>> Store the fs root layer index inside ovl_layer struct, so we can
>>>> get the root fs layer index from merge dir lower layer instead of
>>>> find it with ovl_find_layer() helper.
>>>>
>>>> Signed-off-by: Amir Goldstein <amir73il@xxxxxxxxx>
>>>> ---
>>>>  fs/overlayfs/namei.c     | 17 +----------------
>>>>  fs/overlayfs/ovl_entry.h |  2 ++
>>>>  fs/overlayfs/super.c     |  1 +
>>>>  3 files changed, 4 insertions(+), 16 deletions(-)
>>>>
>>>> diff --git a/fs/overlayfs/namei.c b/fs/overlayfs/namei.c
>>>> index 71db9a966d88..a48ee02c4524 100644
>>>> --- a/fs/overlayfs/namei.c
>>>> +++ b/fs/overlayfs/namei.c
>>>> @@ -572,18 +572,6 @@ int ovl_path_next(int idx, struct dentry *dentry, struct path *path)
>>>>       return (idx < oe->numlower) ? idx + 1 : -1;
>>>>  }
>>>>
>>>> -static int ovl_find_layer(struct ovl_fs *ofs, struct ovl_path *path)
>>>> -{
>>>> -     int i;
>>>> -
>>>> -     for (i = 0; i < ofs->numlower; i++) {
>>>> -             if (ofs->lower_layers[i].mnt == path->layer->mnt)
>>>> -                     break;
>>>> -     }
>>>> -
>>>> -     return i;
>>>> -}
>>>> -
>>>>  /* Fix missing 'origin' xattr */
>>>>  static int ovl_fix_origin(struct dentry *dentry, struct dentry *lower,
>>>>                         struct dentry *upper)
>>>> @@ -733,11 +721,8 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry,
>>>>
>>>>               if (d.redirect && d.redirect[0] == '/' && poe != roe) {
>>>>                       poe = roe;
>>>> -
>>>>                       /* Find the current layer on the root dentry */
>>>> -                     i = ovl_find_layer(ofs, &lower);
>>>> -                     if (WARN_ON(i == ofs->numlower))
>>>> -                             break;
>>>> +                     i = lower.layer->idx - 1;
>>>>               }
>>>>       }
>>>>
>>>> diff --git a/fs/overlayfs/ovl_entry.h b/fs/overlayfs/ovl_entry.h
>>>> index 9d0bc03bf6e4..608e48755070 100644
>>>> --- a/fs/overlayfs/ovl_entry.h
>>>> +++ b/fs/overlayfs/ovl_entry.h
>>>> @@ -22,6 +22,8 @@ struct ovl_config {
>>>>  struct ovl_layer {
>>>>       struct vfsmount *mnt;
>>>>       dev_t pseudo_dev;
>>>> +     /* Index of this layer in fs root (upper == 0) */
>>>> +     int idx;
>>>
>>> Just curious. If we are stroing idx, then do we have to store ovl_layer
>>> and every ovl_entry. Just idx can give us the position and we should
>>> be able to then accessovl_find_layer mnt and pseudo_dev directly from
>>> ofs->lower_layers[idx]. If yes, we can avoid storing vfsmount and
>>> pseudo_dev per dentry.
>>>
>>
>> But we are not storing vfsmount and pseudo_dev per dentry
>> We are storing &ofs->lower_layers[idx] per dentry.
>> Do we gain anything from storing the idx instead?

We could go to 16bit index and decrease memory requirement of
ofs->lower_layers by 75% on 64bit archs.

Probably not worth it, though, since very few entries will have a
large enough layers to matter in most situations, I guess.

Also, someone might want >64k layers, although that really stretches
the limits of current implementation.

Thanks,
Miklos
--
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