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