Wrapfs: use vfs xattr helpers
authorErez Zadok <ezk@cs.sunysb.edu>
Wed, 4 Nov 2015 06:24:29 +0000 (01:24 -0500)
committerErez Zadok <ezk@cs.sunysb.edu>
Tue, 27 Dec 2016 03:11:40 +0000 (22:11 -0500)
Signed-off-by: Erez Zadok <ezk@cs.sunysb.edu>
fs/wrapfs/inode.c
fs/wrapfs/wrapfs.h

index dfb67fc561c7a9acf9ce1e8040266bcca144b1dc..ef821b62a90713023415a215f38b79ef152f3983 100644 (file)
@@ -495,14 +495,15 @@ wrapfs_setxattr(struct dentry *dentry, const char *name, const void *value,
 
        wrapfs_get_lower_path(dentry, &lower_path);
        lower_dentry = lower_path.dentry;
-       if (!lower_dentry->d_inode->i_op ||
-           !lower_dentry->d_inode->i_op->setxattr) {
-               err = -EINVAL;
+       if (!lower_dentry->d_inode->i_op->setxattr) {
+               err = -EOPNOTSUPP;
                goto out;
        }
-
-       err = lower_dentry->d_inode->i_op->setxattr(lower_dentry,
-                                                   name, value, size, flags);
+       err = vfs_setxattr(lower_dentry, name, value, size, flags);
+       if (err)
+               goto out;
+       fsstack_copy_attr_all(dentry->d_inode,
+                             lower_path.dentry->d_inode);
 out:
        wrapfs_put_lower_path(dentry, &lower_path);
        return err;
@@ -518,14 +519,15 @@ wrapfs_getxattr(struct dentry *dentry, const char *name, void *buffer,
 
        wrapfs_get_lower_path(dentry, &lower_path);
        lower_dentry = lower_path.dentry;
-       if (!lower_dentry->d_inode->i_op ||
-           !lower_dentry->d_inode->i_op->getxattr) {
-               err = -EINVAL;
+       if (!lower_dentry->d_inode->i_op->getxattr) {
+               err = -EOPNOTSUPP;
                goto out;
        }
-
-       err = lower_dentry->d_inode->i_op->getxattr(lower_dentry,
-                                                   name, buffer, size);
+       err = vfs_getxattr(lower_dentry, name, buffer, size);
+       if (err)
+               goto out;
+       fsstack_copy_attr_atime(dentry->d_inode,
+                               lower_path.dentry->d_inode);
 out:
        wrapfs_put_lower_path(dentry, &lower_path);
        return err;
@@ -540,14 +542,15 @@ wrapfs_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size)
 
        wrapfs_get_lower_path(dentry, &lower_path);
        lower_dentry = lower_path.dentry;
-       if (!lower_dentry->d_inode->i_op ||
-           !lower_dentry->d_inode->i_op->listxattr) {
-               err = -EINVAL;
+       if (!lower_dentry->d_inode->i_op->listxattr) {
+               err = -EOPNOTSUPP;
                goto out;
        }
-
-       err = lower_dentry->d_inode->i_op->listxattr(lower_dentry,
-                                                    buffer, buffer_size);
+       err = vfs_listxattr(lower_dentry, buffer, buffer_size);
+       if (err)
+               goto out;
+       fsstack_copy_attr_atime(dentry->d_inode,
+                               lower_path.dentry->d_inode);
 out:
        wrapfs_put_lower_path(dentry, &lower_path);
        return err;
@@ -562,18 +565,20 @@ wrapfs_removexattr(struct dentry *dentry, const char *name)
 
        wrapfs_get_lower_path(dentry, &lower_path);
        lower_dentry = lower_path.dentry;
-       if (!lower_dentry->d_inode->i_op ||
-           !lower_dentry->d_inode->i_op->removexattr) {
-               err = -EINVAL;
+       if (!lower_dentry->d_inode->i_op->removexattr) {
+               err = -EOPNOTSUPP;
                goto out;
        }
-
-       err = lower_dentry->d_inode->i_op->removexattr(lower_dentry,
-                                                      name);
+       err = vfs_removexattr(lower_dentry, name);
+       if (err)
+               goto out;
+       fsstack_copy_attr_all(dentry->d_inode,
+                             lower_path.dentry->d_inode);
 out:
        wrapfs_put_lower_path(dentry, &lower_path);
        return err;
 }
+
 const struct inode_operations wrapfs_symlink_iops = {
        .readlink       = wrapfs_readlink,
        .permission     = wrapfs_permission,
index 9aa387cb8d8a8ff15a75a2f29543b15d5b186f10..ec1f4efd87e5be056183a082daab01dfd55c1b55 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/uaccess.h>
 #include <linux/slab.h>
 #include <linux/sched.h>
+#include <linux/xattr.h>
 
 /* the file system name */
 #define WRAPFS_NAME "wrapfs"