aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Gruenbacher <agruenba@redhat.com>2016-08-22 11:52:55 -0400
committerMiklos Szeredi <mszeredi@redhat.com>2016-09-01 05:12:00 -0400
commit0eb45fc3bb7a2cf9c9c93d9e95986a841e5f4625 (patch)
treed88d9c499a3de864cc9ad48dfa79bfc61b27efed
parentce31513a9114f74fe3e9caa6534d201bdac7238d (diff)
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 <agruenba@redhat.com> Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
-rw-r--r--fs/overlayfs/dir.c2
-rw-r--r--fs/overlayfs/inode.c11
-rw-r--r--fs/overlayfs/overlayfs.h4
-rw-r--r--fs/overlayfs/super.c26
4 files changed, 33 insertions, 10 deletions
diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c
index 791c6a209656..1560fdc09a5f 100644
--- a/fs/overlayfs/dir.c
+++ b/fs/overlayfs/dir.c
@@ -1004,7 +1004,7 @@ const struct inode_operations ovl_dir_inode_operations = {
1004 .permission = ovl_permission, 1004 .permission = ovl_permission,
1005 .getattr = ovl_dir_getattr, 1005 .getattr = ovl_dir_getattr,
1006 .setxattr = generic_setxattr, 1006 .setxattr = generic_setxattr,
1007 .getxattr = ovl_getxattr, 1007 .getxattr = generic_getxattr,
1008 .listxattr = ovl_listxattr, 1008 .listxattr = ovl_listxattr,
1009 .removexattr = generic_removexattr, 1009 .removexattr = generic_removexattr,
1010 .get_acl = ovl_get_acl, 1010 .get_acl = ovl_get_acl,
diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c
index 94bca710e6d2..1878591f6a2d 100644
--- a/fs/overlayfs/inode.c
+++ b/fs/overlayfs/inode.c
@@ -238,16 +238,13 @@ out:
238 return err; 238 return err;
239} 239}
240 240
241ssize_t ovl_getxattr(struct dentry *dentry, struct inode *inode, 241int ovl_xattr_get(struct dentry *dentry, const char *name,
242 const char *name, void *value, size_t size) 242 void *value, size_t size)
243{ 243{
244 struct dentry *realdentry = ovl_dentry_real(dentry); 244 struct dentry *realdentry = ovl_dentry_real(dentry);
245 ssize_t res; 245 ssize_t res;
246 const struct cred *old_cred; 246 const struct cred *old_cred;
247 247
248 if (ovl_is_private_xattr(name))
249 return -ENODATA;
250
251 old_cred = ovl_override_creds(dentry->d_sb); 248 old_cred = ovl_override_creds(dentry->d_sb);
252 res = vfs_getxattr(realdentry, name, value, size); 249 res = vfs_getxattr(realdentry, name, value, size);
253 revert_creds(old_cred); 250 revert_creds(old_cred);
@@ -368,7 +365,7 @@ static const struct inode_operations ovl_file_inode_operations = {
368 .permission = ovl_permission, 365 .permission = ovl_permission,
369 .getattr = ovl_getattr, 366 .getattr = ovl_getattr,
370 .setxattr = generic_setxattr, 367 .setxattr = generic_setxattr,
371 .getxattr = ovl_getxattr, 368 .getxattr = generic_getxattr,
372 .listxattr = ovl_listxattr, 369 .listxattr = ovl_listxattr,
373 .removexattr = generic_removexattr, 370 .removexattr = generic_removexattr,
374 .get_acl = ovl_get_acl, 371 .get_acl = ovl_get_acl,
@@ -381,7 +378,7 @@ static const struct inode_operations ovl_symlink_inode_operations = {
381 .readlink = ovl_readlink, 378 .readlink = ovl_readlink,
382 .getattr = ovl_getattr, 379 .getattr = ovl_getattr,
383 .setxattr = generic_setxattr, 380 .setxattr = generic_setxattr,
384 .getxattr = ovl_getxattr, 381 .getxattr = generic_getxattr,
385 .listxattr = ovl_listxattr, 382 .listxattr = ovl_listxattr,
386 .removexattr = generic_removexattr, 383 .removexattr = generic_removexattr,
387 .update_time = ovl_update_time, 384 .update_time = ovl_update_time,
diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h
index 5769aaf151a3..5813ccff8cd9 100644
--- a/fs/overlayfs/overlayfs.h
+++ b/fs/overlayfs/overlayfs.h
@@ -187,8 +187,8 @@ int ovl_setattr(struct dentry *dentry, struct iattr *attr);
187int ovl_permission(struct inode *inode, int mask); 187int ovl_permission(struct inode *inode, int mask);
188int ovl_xattr_set(struct dentry *dentry, const char *name, const void *value, 188int ovl_xattr_set(struct dentry *dentry, const char *name, const void *value,
189 size_t size, int flags); 189 size_t size, int flags);
190ssize_t ovl_getxattr(struct dentry *dentry, struct inode *inode, 190int ovl_xattr_get(struct dentry *dentry, const char *name,
191 const char *name, void *value, size_t size); 191 void *value, size_t size);
192ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size); 192ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size);
193struct posix_acl *ovl_get_acl(struct inode *inode, int type); 193struct posix_acl *ovl_get_acl(struct inode *inode, int type);
194int ovl_open_maybe_copy_up(struct dentry *dentry, unsigned int file_flags); 194int ovl_open_maybe_copy_up(struct dentry *dentry, unsigned int file_flags);
diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c
index cba2c9fea98c..a4585f961bf9 100644
--- a/fs/overlayfs/super.c
+++ b/fs/overlayfs/super.c
@@ -987,6 +987,14 @@ static unsigned int ovl_split_lowerdirs(char *str)
987} 987}
988 988
989static int __maybe_unused 989static int __maybe_unused
990ovl_posix_acl_xattr_get(const struct xattr_handler *handler,
991 struct dentry *dentry, struct inode *inode,
992 const char *name, void *buffer, size_t size)
993{
994 return ovl_xattr_get(dentry, handler->name, buffer, size);
995}
996
997static int __maybe_unused
990ovl_posix_acl_xattr_set(const struct xattr_handler *handler, 998ovl_posix_acl_xattr_set(const struct xattr_handler *handler,
991 struct dentry *dentry, struct inode *inode, 999 struct dentry *dentry, struct inode *inode,
992 const char *name, const void *value, 1000 const char *name, const void *value,
@@ -1029,6 +1037,13 @@ out_acl_release:
1029 return err; 1037 return err;
1030} 1038}
1031 1039
1040static int ovl_own_xattr_get(const struct xattr_handler *handler,
1041 struct dentry *dentry, struct inode *inode,
1042 const char *name, void *buffer, size_t size)
1043{
1044 return -EPERM;
1045}
1046
1032static int ovl_own_xattr_set(const struct xattr_handler *handler, 1047static int ovl_own_xattr_set(const struct xattr_handler *handler,
1033 struct dentry *dentry, struct inode *inode, 1048 struct dentry *dentry, struct inode *inode,
1034 const char *name, const void *value, 1049 const char *name, const void *value,
@@ -1037,6 +1052,13 @@ static int ovl_own_xattr_set(const struct xattr_handler *handler,
1037 return -EPERM; 1052 return -EPERM;
1038} 1053}
1039 1054
1055static int ovl_other_xattr_get(const struct xattr_handler *handler,
1056 struct dentry *dentry, struct inode *inode,
1057 const char *name, void *buffer, size_t size)
1058{
1059 return ovl_xattr_get(dentry, name, buffer, size);
1060}
1061
1040static int ovl_other_xattr_set(const struct xattr_handler *handler, 1062static int ovl_other_xattr_set(const struct xattr_handler *handler,
1041 struct dentry *dentry, struct inode *inode, 1063 struct dentry *dentry, struct inode *inode,
1042 const char *name, const void *value, 1064 const char *name, const void *value,
@@ -1049,6 +1071,7 @@ static const struct xattr_handler __maybe_unused
1049ovl_posix_acl_access_xattr_handler = { 1071ovl_posix_acl_access_xattr_handler = {
1050 .name = XATTR_NAME_POSIX_ACL_ACCESS, 1072 .name = XATTR_NAME_POSIX_ACL_ACCESS,
1051 .flags = ACL_TYPE_ACCESS, 1073 .flags = ACL_TYPE_ACCESS,
1074 .get = ovl_posix_acl_xattr_get,
1052 .set = ovl_posix_acl_xattr_set, 1075 .set = ovl_posix_acl_xattr_set,
1053}; 1076};
1054 1077
@@ -1056,16 +1079,19 @@ static const struct xattr_handler __maybe_unused
1056ovl_posix_acl_default_xattr_handler = { 1079ovl_posix_acl_default_xattr_handler = {
1057 .name = XATTR_NAME_POSIX_ACL_DEFAULT, 1080 .name = XATTR_NAME_POSIX_ACL_DEFAULT,
1058 .flags = ACL_TYPE_DEFAULT, 1081 .flags = ACL_TYPE_DEFAULT,
1082 .get = ovl_posix_acl_xattr_get,
1059 .set = ovl_posix_acl_xattr_set, 1083 .set = ovl_posix_acl_xattr_set,
1060}; 1084};
1061 1085
1062static const struct xattr_handler ovl_own_xattr_handler = { 1086static const struct xattr_handler ovl_own_xattr_handler = {
1063 .prefix = OVL_XATTR_PREFIX, 1087 .prefix = OVL_XATTR_PREFIX,
1088 .get = ovl_own_xattr_get,
1064 .set = ovl_own_xattr_set, 1089 .set = ovl_own_xattr_set,
1065}; 1090};
1066 1091
1067static const struct xattr_handler ovl_other_xattr_handler = { 1092static const struct xattr_handler ovl_other_xattr_handler = {
1068 .prefix = "", /* catch all */ 1093 .prefix = "", /* catch all */
1094 .get = ovl_other_xattr_get,
1069 .set = ovl_other_xattr_set, 1095 .set = ovl_other_xattr_set,
1070}; 1096};
1071 1097