lkml.org 
[lkml]   [2009]   [Nov]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 29/41] union-mount: Always create topmost directory on open
    In message <1256152779-10054-30-git-send-email-vaurora@redhat.com>, Valerie Aurora writes:
    > When we open a directory, always create a matching directory on the
    > top-level. This way we don't have to go back and create all the
    > directories on the path to an element when we want to copy it up.
    >
    > XXX - Turn into #ifdef'able function
    >
    > Signed-off-by: Jan Blunck <jblunck@suse.de>
    > Signed-off-by: Valerie Aurora <vaurora@redhat.com>
    > ---
    > fs/namei.c | 34 ++++++++++++++++++++++++++++++----
    > 1 files changed, 30 insertions(+), 4 deletions(-)
    >
    > diff --git a/fs/namei.c b/fs/namei.c
    > index 1f2a214..8d95eb1 100644
    > --- a/fs/namei.c
    > +++ b/fs/namei.c
    > @@ -1284,8 +1284,31 @@ static int __link_path_walk(const char *name, struct nameidata *nd)
    > if (err)
    > break;
    >
    > - if ((nd->flags & LOOKUP_TOPMOST) &&
    > - (nd->um_flags & LAST_LOWLEVEL)) {
    > + /*
    > + * We want to create this element on the top level
    > + * file system in two cases:
    > + *
    > + * - We are specifically told to - LOOKUP_TOPMOST.
    > + * - This is a directory, and it does not yet exist on
    > + * the top level. Various tricks only work if
    > + * directories always exist on the top level.
    > + *
    > + * In either case, only create this element on the top
    > + * level if the last element is located on the lower
    > + * level. If the last element is located on the top
    > + * level, then every single element in the path
    > + * already exists on the top level.
    > + *
    > + * Note that we can assume that the parent is on the
    > + * top level since we always create the directory on
    > + * the top level.
    > + */

    OK, yes: a number of things (not "tricks" as you call them) become easier if
    you always copyup directories upon path traversal. It's esp. nice wrt
    locking semantics to know that the parent dir must always exist.

    But, what you're trading off is that you'll be consuming many inodes and
    directories on the topmost layer; worse, this policy turns an innocent
    readonly "find . -print" into a massive meta-data write operation. If
    that's an acceptable compromise, then fine: but you should document this
    carefully under a section named "limitations" in your design doc.

    > + if ((nd->um_flags & LAST_LOWLEVEL) &&
    > + ((next.dentry->d_inode &&
    > + S_ISDIR(next.dentry->d_inode->i_mode) &&
    > + (nd->path.mnt != next.mnt)) ||
    > + (nd->flags & LOOKUP_TOPMOST))) {
    > struct dentry *dentry;
    >
    > dentry = union_create_topmost(nd, &this, &next);
    > @@ -1349,8 +1372,11 @@ last_component:
    > if (err)
    > break;
    >
    > - if ((nd->flags & LOOKUP_TOPMOST) &&
    > - (nd->um_flags & LAST_LOWLEVEL)) {
    > + if ((nd->um_flags & LAST_LOWLEVEL) &&
    > + ((next.dentry->d_inode &&
    > + S_ISDIR(next.dentry->d_inode->i_mode) &&
    > + (nd->path.mnt != next.mnt)) ||
    > + (nd->flags & LOOKUP_TOPMOST))) {
    > struct dentry *dentry;
    >
    > dentry = union_create_topmost(nd, &this, &next);
    > --
    > 1.6.3.3
    >
    > --
    > To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
    > the body of a message to majordomo@vger.kernel.org
    > More majordomo info at http://vger.kernel.org/majordomo-info.html

    Erez.


    \
     
     \ /
      Last update: 2009-12-01 05:17    [W:3.623 / U:0.284 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site