lkml.org 
[lkml]   [2010]   [Aug]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH -V19 08/15] vfs: Add handle based xattr syscalls
    Date
    Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
    ---
    fs/xattr.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++
    include/linux/syscalls.h | 15 ++++++++++
    2 files changed, 85 insertions(+), 0 deletions(-)

    diff --git a/fs/xattr.c b/fs/xattr.c
    index 01bb813..1d236c9 100644
    --- a/fs/xattr.c
    +++ b/fs/xattr.c
    @@ -335,6 +335,26 @@ SYSCALL_DEFINE5(fsetxattr, int, fd, const char __user *, name,
    return error;
    }

    +SYSCALL_DEFINE6(handle_setxattr, int, mountdirfd,
    + struct file_handle __user *, ufh,
    + const char __user *, name, const void __user *, value,
    + size_t, size, int, flags)
    +{
    + struct path path;
    + int error;
    +
    + error = handle_to_path(mountdirfd, ufh, &path);
    + if (error)
    + return error;
    + error = mnt_want_write(path.mnt);
    + if (!error) {
    + error = setxattr(path.dentry, name, value, size, flags);
    + mnt_drop_write(path.mnt);
    + }
    + path_put(&path);
    + return error;
    +}
    +
    /*
    * Extended attribute GET operations
    */
    @@ -416,6 +436,22 @@ SYSCALL_DEFINE4(fgetxattr, int, fd, const char __user *, name,
    return error;
    }

    +SYSCALL_DEFINE5(handle_getxattr, int, mountdirfd,
    + struct file_handle __user *, ufh,
    + const char __user *, name,
    + void __user *, value, size_t, size)
    +{
    + struct path path;
    + ssize_t error;
    +
    + error = handle_to_path(mountdirfd, ufh, &path);
    + if (error)
    + return error;
    + error = getxattr(path.dentry, name, value, size);
    + path_put(&path);
    + return error;
    +}
    +
    /*
    * Extended attribute LIST operations
    */
    @@ -488,6 +524,21 @@ SYSCALL_DEFINE3(flistxattr, int, fd, char __user *, list, size_t, size)
    return error;
    }

    +SYSCALL_DEFINE4(handle_listxattr, int, mountdirfd,
    + struct file_handle __user *, ufh,
    + char __user *, list, size_t, size)
    +{
    + struct path path;
    + ssize_t error;
    +
    + error = handle_to_path(mountdirfd, ufh, &path);
    + if (error)
    + return error;
    + error = listxattr(path.dentry, list, size);
    + path_put(&path);
    + return error;
    +}
    +
    /*
    * Extended attribute REMOVE operations
    */
    @@ -562,6 +613,25 @@ SYSCALL_DEFINE2(fremovexattr, int, fd, const char __user *, name)
    return error;
    }

    +SYSCALL_DEFINE3(handle_removexattr, int, mountdirfd,
    + struct file_handle __user *, ufh,
    + const char __user *, name)
    +{
    + struct path path;
    + int error;
    +
    + error = handle_to_path(mountdirfd, ufh, &path);
    + if (error)
    + return error;
    + error = mnt_want_write(path.mnt);
    + if (!error) {
    + error = removexattr(path.dentry, name);
    + mnt_drop_write(path.mnt);
    + }
    + path_put(&path);
    + return error;
    +}
    +

    static const char *
    strcmp_prefix(const char *a, const char *a_prefix)
    diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
    index 6dab72b..4c7e922 100644
    --- a/include/linux/syscalls.h
    +++ b/include/linux/syscalls.h
    @@ -854,4 +854,19 @@ asmlinkage long sys_handle_link(int mountdirfd, struct file_handle __user *uofh,
    int newfd, const char __user *newname);
    asmlinkage long sys_handle_chown(int mountdirfd, struct file_handle __user *ufh,
    uid_t user, gid_t group);
    +asmlinkage long sys_handle_setxattr(int mountdirfd,
    + struct file_handle __user *ufh,
    + const char __user *name,
    + const void __user *value,
    + size_t size, int flags);
    +asmlinkage long sys_handle_getxattr(int mountdirfd,
    + struct file_handle __user *ufh,
    + const char __user *name,
    + void __user *value, size_t size);
    +asmlinkage long sys_handle_listxattr(int mountdirfd,
    + struct file_handle __user *ufh,
    + char __user *list, size_t size);
    +asmlinkage long sys_handle_removexattr(int mountdirfd,
    + struct file_handle __user *ufh,
    + const char __user *name);
    #endif
    --
    1.7.0.4


    \
     
     \ /
      Last update: 2010-08-27 13:07    [W:0.026 / U:91.208 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site