Wrapfs: use vfs xattr helpers
authorErez Zadok <ezk@cs.sunysb.edu>
Wed, 4 Nov 2015 02:16:58 +0000 (21:16 -0500)
committerErez Zadok <ezk@cs.sunysb.edu>
Tue, 27 Dec 2016 19:05:24 +0000 (14:05 -0500)
Signed-off-by: Erez Zadok <ezk@cs.sunysb.edu>
fs/wrapfs/inode.c
fs/wrapfs/wrapfs.h

index 6a6bcf104ca7de9e648bd2f92856a3e7544f93ab..e8f8e48a9b18b760c6ea62ac7196a967bd237aa9 100644 (file)
@@ -455,14 +455,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 (!d_inode(lower_dentry)->i_op ||
-           !d_inode(lower_dentry)->i_op->setxattr) {
-               err = -EINVAL;
+       if (!d_inode(lower_dentry)->i_op->setxattr) {
+               err = -EOPNOTSUPP;
                goto out;
        }
-
-       err = d_inode(lower_dentry)->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;
@@ -478,14 +479,15 @@ wrapfs_getxattr(struct dentry *dentry, const char *name, void *buffer,
 
        wrapfs_get_lower_path(dentry, &lower_path);
        lower_dentry = lower_path.dentry;
-       if (!d_inode(lower_dentry)->i_op ||
-           !d_inode(lower_dentry)->i_op->getxattr) {
-               err = -EINVAL;
+       if (!d_inode(lower_dentry)->i_op->getxattr) {
+               err = -EOPNOTSUPP;
                goto out;
        }
-
-       err = d_inode(lower_dentry)->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;
@@ -500,14 +502,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 (!d_inode(lower_dentry)->i_op ||
-           !d_inode(lower_dentry)->i_op->listxattr) {
-               err = -EINVAL;
+       if (!d_inode(lower_dentry)->i_op->listxattr) {
+               err = -EOPNOTSUPP;
                goto out;
        }
-
-       err = d_inode(lower_dentry)->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;
@@ -527,9 +530,11 @@ wrapfs_removexattr(struct dentry *dentry, const char *name)
                err = -EINVAL;
                goto out;
        }
-
-       err = d_inode(lower_dentry)->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;
index 7d1d4ef3843abc0ec0b11ddb4e33962059aa04ab..051c7a38d643a1fbdd43b1dc2531d902e59af332 100644 (file)
@@ -25,6 +25,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"