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

index 0c1568a8f296d0a28f57a5d143917fb8f69a46b4..4950f22fec4a3ac75f02655fbc7cbe14da11d817 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 (!d_inode(lower_dentry)->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(d_inode(dentry),
+                             d_inode(lower_path.dentry));
 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(d_inode(dentry),
+                               d_inode(lower_path.dentry));
 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(d_inode(dentry),
+                               d_inode(lower_path.dentry));
 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(d_inode(dentry),
+                             d_inode(lower_path.dentry));
 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"