lkml.org 
[lkml]   [2010]   [Jul]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH -V17 05/12] vfs: Support null pathname in readlink
    Date
    From: NeilBrown <neilb@suse.de>

    This enables to use readlink to get the link target name
    from a file descriptor point to the link. This can be used
    with open_by_handle syscall that returns a file descriptor for a link.
    We can then use this file descriptor to get the target name.

    This is similar to utimensat(2) interface

    Signed-off-by: NeilBrown <neilb@suse.de>
    Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
    ---
    fs/stat.c | 30 ++++++++++++++++++++++--------
    1 files changed, 22 insertions(+), 8 deletions(-)

    diff --git a/fs/stat.c b/fs/stat.c
    index c4ecd52..a66a0ef 100644
    --- a/fs/stat.c
    +++ b/fs/stat.c
    @@ -284,26 +284,40 @@ SYSCALL_DEFINE2(newfstat, unsigned int, fd, struct stat __user *, statbuf)
    SYSCALL_DEFINE4(readlinkat, int, dfd, const char __user *, pathname,
    char __user *, buf, int, bufsiz)
    {
    - struct path path;
    - int error;
    + int error = 0, fput_needed;
    + struct path path, *pp;
    + struct file *file = NULL;

    if (bufsiz <= 0)
    return -EINVAL;

    - error = user_path_at(dfd, pathname, 0, &path);
    + if (pathname == NULL && dfd != AT_FDCWD) {
    + file = fget_light(dfd, &fput_needed);
    +
    + if (file)
    + pp = &file->f_path;
    + else
    + error = -EBADF;
    + } else {
    + error = user_path_at(dfd, pathname, 0, &path);
    + pp = &path;
    + }
    if (!error) {
    - struct inode *inode = path.dentry->d_inode;
    + struct inode *inode = pp->dentry->d_inode;

    error = -EINVAL;
    if (inode->i_op->readlink) {
    - error = security_inode_readlink(path.dentry);
    + error = security_inode_readlink(pp->dentry);
    if (!error) {
    - touch_atime(path.mnt, path.dentry);
    - error = inode->i_op->readlink(path.dentry,
    + touch_atime(pp->mnt, pp->dentry);
    + error = inode->i_op->readlink(pp->dentry,
    buf, bufsiz);
    }
    }
    - path_put(&path);
    + if (file)
    + fput_light(file, fput_needed);
    + else
    + path_put(&path);
    }
    return error;
    }
    --
    1.7.2.rc3.43.g24e7a


    \
     
     \ /
      Last update: 2010-07-19 21:17    [W:0.034 / U:31.412 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site