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

index 503088f670e0f8b23e0468f19f2cbff7c55e06fa..1e0d5cf1e1384383c2244ed13c3466fc75f67aeb 100644 (file)
@@ -457,14 +457,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;
@@ -480,14 +481,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;
@@ -502,14 +504,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;
@@ -524,18 +527,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 6520c0f32d7a55edc8fcc788014c1c9cc14a989a..63d1228b8757727406022ffb5ee07706d62182b5 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"