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;
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;
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;
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,