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:
parent
bba0bd31b1
commit
4b899da50d
|
@ -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,
|
int ecryptfs_derive_iv(char *iv, struct ecryptfs_crypt_stat *crypt_stat,
|
||||||
loff_t offset);
|
loff_t offset);
|
||||||
|
|
||||||
|
extern const struct xattr_handler *ecryptfs_xattr_handlers[];
|
||||||
|
|
||||||
#endif /* #ifndef ECRYPTFS_KERNEL_H */
|
#endif /* #ifndef ECRYPTFS_KERNEL_H */
|
||||||
|
|
|
@ -1066,19 +1066,22 @@ out:
|
||||||
return rc;
|
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;
|
int rc = 0;
|
||||||
struct dentry *lower_dentry;
|
struct dentry *lower_dentry;
|
||||||
|
struct inode *lower_inode;
|
||||||
|
|
||||||
lower_dentry = ecryptfs_dentry_to_lower(dentry);
|
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;
|
rc = -EOPNOTSUPP;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
inode_lock(d_inode(lower_dentry));
|
inode_lock(lower_inode);
|
||||||
rc = d_inode(lower_dentry)->i_op->removexattr(lower_dentry, name);
|
rc = lower_inode->i_op->removexattr(lower_dentry, name);
|
||||||
inode_unlock(d_inode(lower_dentry));
|
inode_unlock(lower_inode);
|
||||||
out:
|
out:
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
@ -1089,10 +1092,10 @@ const struct inode_operations ecryptfs_symlink_iops = {
|
||||||
.permission = ecryptfs_permission,
|
.permission = ecryptfs_permission,
|
||||||
.setattr = ecryptfs_setattr,
|
.setattr = ecryptfs_setattr,
|
||||||
.getattr = ecryptfs_getattr_link,
|
.getattr = ecryptfs_getattr_link,
|
||||||
.setxattr = ecryptfs_setxattr,
|
.setxattr = generic_setxattr,
|
||||||
.getxattr = ecryptfs_getxattr,
|
.getxattr = generic_getxattr,
|
||||||
.listxattr = ecryptfs_listxattr,
|
.listxattr = ecryptfs_listxattr,
|
||||||
.removexattr = ecryptfs_removexattr
|
.removexattr = generic_removexattr
|
||||||
};
|
};
|
||||||
|
|
||||||
const struct inode_operations ecryptfs_dir_iops = {
|
const struct inode_operations ecryptfs_dir_iops = {
|
||||||
|
@ -1107,18 +1110,49 @@ const struct inode_operations ecryptfs_dir_iops = {
|
||||||
.rename = ecryptfs_rename,
|
.rename = ecryptfs_rename,
|
||||||
.permission = ecryptfs_permission,
|
.permission = ecryptfs_permission,
|
||||||
.setattr = ecryptfs_setattr,
|
.setattr = ecryptfs_setattr,
|
||||||
.setxattr = ecryptfs_setxattr,
|
.setxattr = generic_setxattr,
|
||||||
.getxattr = ecryptfs_getxattr,
|
.getxattr = generic_getxattr,
|
||||||
.listxattr = ecryptfs_listxattr,
|
.listxattr = ecryptfs_listxattr,
|
||||||
.removexattr = ecryptfs_removexattr
|
.removexattr = generic_removexattr
|
||||||
};
|
};
|
||||||
|
|
||||||
const struct inode_operations ecryptfs_main_iops = {
|
const struct inode_operations ecryptfs_main_iops = {
|
||||||
.permission = ecryptfs_permission,
|
.permission = ecryptfs_permission,
|
||||||
.setattr = ecryptfs_setattr,
|
.setattr = ecryptfs_setattr,
|
||||||
.getattr = ecryptfs_getattr,
|
.getattr = ecryptfs_getattr,
|
||||||
.setxattr = ecryptfs_setxattr,
|
.setxattr = generic_setxattr,
|
||||||
.getxattr = ecryptfs_getxattr,
|
.getxattr = generic_getxattr,
|
||||||
.listxattr = ecryptfs_listxattr,
|
.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
|
||||||
};
|
};
|
||||||
|
|
|
@ -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 */
|
/* ->kill_sb() will take care of sbi after that point */
|
||||||
sbi = NULL;
|
sbi = NULL;
|
||||||
s->s_op = &ecryptfs_sops;
|
s->s_op = &ecryptfs_sops;
|
||||||
|
s->s_xattr = ecryptfs_xattr_handlers;
|
||||||
s->s_d_op = &ecryptfs_dops;
|
s->s_d_op = &ecryptfs_dops;
|
||||||
|
|
||||||
err = "Reading sb failed";
|
err = "Reading sb failed";
|
||||||
|
|
Loading…
Reference in New Issue