lkml.org 
[lkml]   [2010]   [Sep]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH -V20 06/12] vfs: Add handle based link syscall
    Date
    Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
    ---
    fs/namei.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
    include/linux/syscalls.h | 2 ++
    2 files changed, 47 insertions(+), 0 deletions(-)

    diff --git a/fs/namei.c b/fs/namei.c
    index 3439962..141cc78 100644
    --- a/fs/namei.c
    +++ b/fs/namei.c
    @@ -2697,6 +2697,51 @@ SYSCALL_DEFINE2(link, const char __user *, oldname, const char __user *, newname
    return sys_linkat(AT_FDCWD, oldname, AT_FDCWD, newname, 0);
    }

    +SYSCALL_DEFINE4(handle_link, int, mountdirfd, struct file_handle __user *, uofh,
    + int, newdfd, const char __user *, newname)
    +{
    + char *to;
    + int error;
    + struct dentry *new_dentry;
    + struct nameidata nd;
    + struct path old_path;
    +
    + error = handle_to_path(mountdirfd, uofh, &old_path);
    + if (error)
    + return error;
    +
    + error = user_path_parent(newdfd, newname, &nd, &to);
    + if (error)
    + goto out;
    + error = -EXDEV;
    + if (old_path.mnt != nd.path.mnt)
    + goto out_release;
    + new_dentry = lookup_create(&nd, 0);
    + error = PTR_ERR(new_dentry);
    + if (IS_ERR(new_dentry))
    + goto out_unlock;
    + error = mnt_want_write(nd.path.mnt);
    + if (error)
    + goto out_dput;
    + error = security_path_link(old_path.dentry, &nd.path, new_dentry);
    + if (error)
    + goto out_drop_write;
    + error = vfs_link(old_path.dentry, nd.path.dentry->d_inode, new_dentry);
    +out_drop_write:
    + mnt_drop_write(nd.path.mnt);
    +out_dput:
    + dput(new_dentry);
    +out_unlock:
    + mutex_unlock(&nd.path.dentry->d_inode->i_mutex);
    +out_release:
    + path_put(&nd.path);
    + putname(to);
    +out:
    + path_put(&old_path);
    +
    + return error;
    +}
    +
    /*
    * The worst of all namespace operations - renaming directory. "Perverted"
    * doesn't even start to describe it. Somebody in UCB had a heck of a trip...
    diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
    index de4f242..278d2ae 100644
    --- a/include/linux/syscalls.h
    +++ b/include/linux/syscalls.h
    @@ -850,4 +850,6 @@ asmlinkage long sys_handle_stat(int mountdirfd,
    struct file_handle __user *ufh,
    struct stat __user *statbuf);
    #endif
    +asmlinkage long sys_handle_link(int mountdirfd, struct file_handle __user *uofh,
    + int newfd, const char __user *newname);
    #endif
    --
    1.7.0.4


    \
     
     \ /
      Last update: 2010-09-28 21:41    [W:3.438 / U:0.928 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site