lkml.org 
[lkml]   [2006]   [Jun]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[RFC][PATCH 02/20] r/o bind mount prepwork: move open_namei()'s vfs_create()
    From
    Date

    The code around vfs_create() in open_namei() is getting a
    bit too complex. Right now, there is at least the reference
    count on the dentry, and the i_mutex to worry about. Soon,
    we'll also have mnt_writecount.

    So, break the vfs_create() call out of open_namei(), and
    into a helper function. This duplicates the call to
    may_open(), but that isn't such a bad thing since the
    arguments (acc_mode and flag) were being heavily massaged
    anyway.

    Later in the series, we'll add the mnt_writecount handling
    around this new function call.

    Signed-off-by: Dave Hansen <haveblue@us.ibm.com>
    ---

    lxc-dave/fs/namei.c | 30 ++++++++++++++++++++----------
    1 files changed, 20 insertions(+), 10 deletions(-)

    diff -puN fs/namei.c~C-prepwork-cleanup-open_namei fs/namei.c
    --- lxc/fs/namei.c~C-prepwork-cleanup-open_namei 2006-06-16 15:58:00.000000000 -0700
    +++ lxc-dave/fs/namei.c 2006-06-16 15:58:00.000000000 -0700
    @@ -1560,6 +1560,24 @@ int may_open(struct nameidata *nd, int a
    return 0;
    }

    +static int open_namei_create(struct nameidata *nd, struct path *path,
    + int flag, int mode)
    +{
    + int error;
    + struct dentry *dir = nd->dentry;
    +
    + if (!IS_POSIXACL(dir->d_inode))
    + mode &= ~current->fs->umask;
    + error = vfs_create(dir->d_inode, path->dentry, mode, nd);
    + mutex_unlock(&dir->d_inode->i_mutex);
    + dput(nd->dentry);
    + nd->dentry = path->dentry;
    + if (error)
    + return error;
    + /* Don't check for write permission, don't truncate */
    + return may_open(nd, 0, flag & ~O_TRUNC);
    +}
    +
    /*
    * open_namei()
    *
    @@ -1641,18 +1659,10 @@ do_last:

    /* Negative dentry, just create the file */
    if (!path.dentry->d_inode) {
    - if (!IS_POSIXACL(dir->d_inode))
    - mode &= ~current->fs->umask;
    - error = vfs_create(dir->d_inode, path.dentry, mode, nd);
    - mutex_unlock(&dir->d_inode->i_mutex);
    - dput(nd->dentry);
    - nd->dentry = path.dentry;
    + error = open_namei_create(nd, &path, flag, mode);
    if (error)
    goto exit;
    - /* Don't check for write permission, don't truncate */
    - acc_mode = 0;
    - flag &= ~O_TRUNC;
    - goto ok;
    + return 0;
    }

    /*
    _
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/
    \
     
     \ /
      Last update: 2006-06-17 01:15    [W:0.022 / U:1.700 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site