lkml.org 
[lkml]   [2010]   [Jul]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4/9] vfs: Allow handle based open on symlinks
    Date
    The patch update may_open to allow handle based open on symlinks.
    The file handle based API use file descritor returned from open_by_handle_at
    to do different file system operations. To find the link target name we
    need to get a file descriptor on symlinks.

    Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
    ---
    fs/namei.c | 17 ++++++++++++++---
    1 files changed, 14 insertions(+), 3 deletions(-)

    diff --git a/fs/namei.c b/fs/namei.c
    index c2d19c7..417bf53 100644
    --- a/fs/namei.c
    +++ b/fs/namei.c
    @@ -1422,7 +1422,7 @@ int vfs_create(struct inode *dir, struct dentry *dentry, int mode,
    return error;
    }

    -int may_open(struct path *path, int acc_mode, int flag)
    +static int __may_open(struct path *path, int acc_mode, int flag, int handle)
    {
    struct dentry *dentry = path->dentry;
    struct inode *inode = dentry->d_inode;
    @@ -1433,7 +1433,13 @@ int may_open(struct path *path, int acc_mode, int flag)

    switch (inode->i_mode & S_IFMT) {
    case S_IFLNK:
    - return -ELOOP;
    + /*
    + * For file handle based open we should allow
    + * open of symlink.
    + */
    + if (!handle)
    + return -ELOOP;
    + break;
    case S_IFDIR:
    if (acc_mode & MAY_WRITE)
    return -EISDIR;
    @@ -1473,6 +1479,11 @@ int may_open(struct path *path, int acc_mode, int flag)
    return break_lease(inode, flag);
    }

    +int may_open(struct path *path, int acc_mode, int flag)
    +{
    + return __may_open(path, acc_mode, flag, 0);
    +}
    +
    static int handle_truncate(struct path *path)
    {
    struct inode *inode = path->dentry->d_inode;
    @@ -1570,7 +1581,7 @@ struct file *finish_open_handle(struct path *path,
    if (error)
    goto exit;
    }
    - error = may_open(path, acc_mode, open_flag);
    + error = __may_open(path, acc_mode, open_flag, 1);
    if (error) {
    if (will_truncate)
    mnt_drop_write(path->mnt);
    --
    1.7.2.rc1


    \
     
     \ /
      Last update: 2010-07-06 20:41    [W:0.023 / U:89.468 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site