lkml.org 
[lkml]   [2010]   [Jun]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH -V14 05/11] 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.

    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..49b95a7 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;
    + 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(dfd);
    +
    + 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(file);
    + else
    + path_put(&path);
    }
    return error;
    }
    --
    1.7.1.331.ga5080


    \
     
     \ /
      Last update: 2010-06-15 19:17    [W:0.022 / U:242.180 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site