From: Andreas Gruenbacher Date: Mon, 22 Aug 2016 15:52:55 +0000 (+0200) Subject: ovl: Switch to generic_getxattr X-Git-Tag: v4.1.12-108.0.20170806_1300~18 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=bffcc6aeff4e1164050dde7a8846db363fbd193a;p=users%2Fjedix%2Flinux-maple.git ovl: Switch to generic_getxattr Now that overlayfs has xattr handlers for iop->{set,remove}xattr, use those same handlers for iop->getxattr as well. Signed-off-by: Andreas Gruenbacher Signed-off-by: Miklos Szeredi Signed-off-by: Shan Hai Orabug: 26401569 (backport upstream commit 0eb45fc3bb7a2cf9c9c93d9e95986a841e5f4625) Signed-off-by: Shan Hai Reviewed-by: Somasundaram Krishnasamy --- diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c index 0149221bba430..f66e7a7d761b5 100644 --- a/fs/overlayfs/dir.c +++ b/fs/overlayfs/dir.c @@ -958,7 +958,7 @@ const struct inode_operations ovl_dir_inode_operations = { .permission = ovl_permission, .getattr = ovl_dir_getattr, .setxattr = generic_setxattr, - .getxattr = ovl_getxattr, + .getxattr = generic_getxattr, .listxattr = ovl_listxattr, .removexattr = generic_removexattr, .get_acl = ovl_get_acl, diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c index 7907411d23a6f..c8952c9dda19d 100644 --- a/fs/overlayfs/inode.c +++ b/fs/overlayfs/inode.c @@ -257,16 +257,13 @@ out: return err; } -ssize_t ovl_getxattr(struct dentry *dentry, const char *name, - void *value, size_t size) +int ovl_xattr_get(struct dentry *dentry, const char *name, + void *value, size_t size) { struct dentry *realdentry = ovl_dentry_real(dentry); ssize_t res; const struct cred *old_cred; - if (ovl_is_private_xattr(name)) - return -ENODATA; - old_cred = ovl_override_creds(dentry->d_sb); res = vfs_getxattr(realdentry, name, value, size); revert_creds(old_cred); @@ -398,7 +395,7 @@ static const struct inode_operations ovl_file_inode_operations = { .permission = ovl_permission, .getattr = ovl_getattr, .setxattr = generic_setxattr, - .getxattr = ovl_getxattr, + .getxattr = generic_getxattr, .listxattr = ovl_listxattr, .removexattr = generic_removexattr, .get_acl = ovl_get_acl, @@ -412,7 +409,7 @@ static const struct inode_operations ovl_symlink_inode_operations = { .readlink = ovl_readlink, .getattr = ovl_getattr, .setxattr = generic_setxattr, - .getxattr = ovl_getxattr, + .getxattr = generic_getxattr, .listxattr = ovl_listxattr, .removexattr = generic_removexattr, .update_time = ovl_update_time, diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h index f4784b824bba6..3ef63f93875c0 100644 --- a/fs/overlayfs/overlayfs.h +++ b/fs/overlayfs/overlayfs.h @@ -185,8 +185,8 @@ int ovl_setattr(struct dentry *dentry, struct iattr *attr); int ovl_permission(struct inode *inode, int mask); int ovl_xattr_set(struct dentry *dentry, const char *name, const void *value, size_t size, int flags); -ssize_t ovl_getxattr(struct dentry *dentry, const char *name, - void *value, size_t size); +int ovl_xattr_get(struct dentry *dentry, const char *name, + void *value, size_t size); ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size); struct inode *ovl_d_select_inode(struct dentry *dentry, unsigned file_flags); struct posix_acl *ovl_get_acl(struct inode *inode, int type); diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c index 82455d52f8fe9..404195531847d 100644 --- a/fs/overlayfs/super.c +++ b/fs/overlayfs/super.c @@ -862,7 +862,14 @@ static unsigned int ovl_split_lowerdirs(char *str) return ctr; } -static int ovl_posix_acl_xattr_set(struct dentry *dentry, const char *name, +static int ovl_posix_acl_xattr_get(struct dentry *dentry, const char *name, + void *buffer, size_t size, int handler_flags) +{ + return ovl_xattr_get(dentry, name, buffer, size); +} + +static int __maybe_unused +ovl_posix_acl_xattr_set(struct dentry *dentry, const char *name, const void *value, size_t size, int flags, int handler_flags) { @@ -900,6 +907,12 @@ out_acl_release: return err; } +static int ovl_own_xattr_get(struct dentry *dentry, const char *name, + void *buffer, size_t size, int handler_flags) +{ + return -EPERM; +} + static int ovl_own_xattr_set(struct dentry *dentry, const char *name, const void *value, size_t size, int flags, int handler_flags) @@ -907,6 +920,12 @@ static int ovl_own_xattr_set(struct dentry *dentry, const char *name, return -EPERM; } +static int ovl_other_xattr_get(struct dentry *dentry, const char *name, + void *buffer, size_t size, int handler_flags) +{ + return ovl_xattr_get(dentry, name, buffer, size); +} + static int ovl_other_xattr_set(struct dentry *dentry, const char *name, const void *value, size_t size, int flags, int handler_flags) @@ -918,6 +937,7 @@ static const struct xattr_handler __maybe_unused ovl_posix_acl_access_xattr_handler = { .prefix = XATTR_NAME_POSIX_ACL_ACCESS, .flags = ACL_TYPE_ACCESS, + .get = ovl_posix_acl_xattr_get, .set = ovl_posix_acl_xattr_set, }; @@ -925,16 +945,19 @@ static const struct xattr_handler __maybe_unused ovl_posix_acl_default_xattr_handler = { .prefix = XATTR_NAME_POSIX_ACL_DEFAULT, .flags = ACL_TYPE_DEFAULT, + .get = ovl_posix_acl_xattr_get, .set = ovl_posix_acl_xattr_set, }; static const struct xattr_handler ovl_own_xattr_handler = { .prefix = OVL_XATTR_PREFIX, + .get = ovl_own_xattr_get, .set = ovl_own_xattr_set, }; static const struct xattr_handler ovl_other_xattr_handler = { .prefix = "", /* catch all */ + .get = ovl_other_xattr_get, .set = ovl_other_xattr_set, };