ecryptfs: Switch to generic xattr handlers

Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Andreas Gruenbacher 2016-09-29 17:48:36 +02:00 committed by Al Viro
parent bba0bd31b1
commit 4b899da50d
3 changed files with 51 additions and 14 deletions

View File

@ -715,4 +715,6 @@ int ecryptfs_set_f_namelen(long *namelen, long lower_namelen,
int ecryptfs_derive_iv(char *iv, struct ecryptfs_crypt_stat *crypt_stat,
loff_t offset);
extern const struct xattr_handler *ecryptfs_xattr_handlers[];
#endif /* #ifndef ECRYPTFS_KERNEL_H */

View File

@ -1066,19 +1066,22 @@ ecryptfs_listxattr(struct dentry *dentry, char *list, size_t size)
return rc;
}
static int ecryptfs_removexattr(struct dentry *dentry, const char *name)
static int ecryptfs_removexattr(struct dentry *dentry, struct inode *inode,
const char *name)
{
int rc = 0;
struct dentry *lower_dentry;
struct inode *lower_inode;
lower_dentry = ecryptfs_dentry_to_lower(dentry);
if (!d_inode(lower_dentry)->i_op->removexattr) {
lower_inode = ecryptfs_inode_to_lower(inode);
if (!lower_inode->i_op->removexattr) {
rc = -EOPNOTSUPP;
goto out;
}
inode_lock(d_inode(lower_dentry));
rc = d_inode(lower_dentry)->i_op->removexattr(lower_dentry, name);
inode_unlock(d_inode(lower_dentry));
inode_lock(lower_inode);
rc = lower_inode->i_op->removexattr(lower_dentry, name);
inode_unlock(lower_inode);
out:
return rc;
}
@ -1089,10 +1092,10 @@ const struct inode_operations ecryptfs_symlink_iops = {
.permission = ecryptfs_permission,
.setattr = ecryptfs_setattr,
.getattr = ecryptfs_getattr_link,
.setxattr = ecryptfs_setxattr,
.getxattr = ecryptfs_getxattr,
.setxattr = generic_setxattr,
.getxattr = generic_getxattr,
.listxattr = ecryptfs_listxattr,
.removexattr = ecryptfs_removexattr
.removexattr = generic_removexattr
};
const struct inode_operations ecryptfs_dir_iops = {
@ -1107,18 +1110,49 @@ const struct inode_operations ecryptfs_dir_iops = {
.rename = ecryptfs_rename,
.permission = ecryptfs_permission,
.setattr = ecryptfs_setattr,
.setxattr = ecryptfs_setxattr,
.getxattr = ecryptfs_getxattr,
.setxattr = generic_setxattr,
.getxattr = generic_getxattr,
.listxattr = ecryptfs_listxattr,
.removexattr = ecryptfs_removexattr
.removexattr = generic_removexattr
};
const struct inode_operations ecryptfs_main_iops = {
.permission = ecryptfs_permission,
.setattr = ecryptfs_setattr,
.getattr = ecryptfs_getattr,
.setxattr = ecryptfs_setxattr,
.getxattr = ecryptfs_getxattr,
.setxattr = generic_setxattr,
.getxattr = generic_getxattr,
.listxattr = ecryptfs_listxattr,
.removexattr = ecryptfs_removexattr
.removexattr = generic_removexattr
};
static int ecryptfs_xattr_get(const struct xattr_handler *handler,
struct dentry *dentry, struct inode *inode,
const char *name, void *buffer, size_t size)
{
return ecryptfs_getxattr(dentry, inode, name, buffer, size);
}
static int ecryptfs_xattr_set(const struct xattr_handler *handler,
struct dentry *dentry, struct inode *inode,
const char *name, const void *value, size_t size,
int flags)
{
if (value)
return ecryptfs_setxattr(dentry, inode, name, value, size, flags);
else {
BUG_ON(flags != XATTR_REPLACE);
return ecryptfs_removexattr(dentry, inode, name);
}
}
const struct xattr_handler ecryptfs_xattr_handler = {
.prefix = "", /* match anything */
.get = ecryptfs_xattr_get,
.set = ecryptfs_xattr_set,
};
const struct xattr_handler *ecryptfs_xattr_handlers[] = {
&ecryptfs_xattr_handler,
NULL
};

View File

@ -529,6 +529,7 @@ static struct dentry *ecryptfs_mount(struct file_system_type *fs_type, int flags
/* ->kill_sb() will take care of sbi after that point */
sbi = NULL;
s->s_op = &ecryptfs_sops;
s->s_xattr = ecryptfs_xattr_handlers;
s->s_d_op = &ecryptfs_dops;
err = "Reading sb failed";