Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'for-linus-3' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs

Pull vfs xattr cleanups from Al Viro.

* 'for-linus-3' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
f2fs: xattr simplifications
squashfs: xattr simplifications
9p: xattr simplifications
xattr handlers: Pass handler to operations instead of flags
jffs2: Add missing capability check for listing trusted xattrs
hfsplus: Remove unused xattr handler list operations
ubifs: Remove unused security xattr handler
vfs: Fix the posix_acl_xattr_list return value
vfs: Check attribute names in posix acl xattr handers

+390 -651
+1 -4
fs/9p/Makefile
··· 10 10 vfs_dentry.o \ 11 11 v9fs.o \ 12 12 fid.o \ 13 - xattr.o \ 14 - xattr_user.o \ 15 - xattr_trusted.o 13 + xattr.o 16 14 17 15 9p-$(CONFIG_9P_FSCACHE) += cache.o 18 16 9p-$(CONFIG_9P_FS_POSIX_ACL) += acl.o 19 - 9p-$(CONFIG_9P_FS_SECURITY) += xattr_security.o
+13 -52
fs/9p/acl.c
··· 212 212 return 0; 213 213 } 214 214 215 - static int v9fs_remote_get_acl(struct dentry *dentry, const char *name, 216 - void *buffer, size_t size, int type) 217 - { 218 - char *full_name; 219 - 220 - switch (type) { 221 - case ACL_TYPE_ACCESS: 222 - full_name = POSIX_ACL_XATTR_ACCESS; 223 - break; 224 - case ACL_TYPE_DEFAULT: 225 - full_name = POSIX_ACL_XATTR_DEFAULT; 226 - break; 227 - default: 228 - BUG(); 229 - } 230 - return v9fs_xattr_get(dentry, full_name, buffer, size); 231 - } 232 - 233 - static int v9fs_xattr_get_acl(struct dentry *dentry, const char *name, 234 - void *buffer, size_t size, int type) 215 + static int v9fs_xattr_get_acl(const struct xattr_handler *handler, 216 + struct dentry *dentry, const char *name, 217 + void *buffer, size_t size) 235 218 { 236 219 struct v9fs_session_info *v9ses; 237 220 struct posix_acl *acl; ··· 228 245 * We allow set/get/list of acl when access=client is not specified 229 246 */ 230 247 if ((v9ses->flags & V9FS_ACCESS_MASK) != V9FS_ACCESS_CLIENT) 231 - return v9fs_remote_get_acl(dentry, name, buffer, size, type); 248 + return v9fs_xattr_get(dentry, handler->prefix, buffer, size); 232 249 233 - acl = v9fs_get_cached_acl(d_inode(dentry), type); 250 + acl = v9fs_get_cached_acl(d_inode(dentry), handler->flags); 234 251 if (IS_ERR(acl)) 235 252 return PTR_ERR(acl); 236 253 if (acl == NULL) ··· 241 258 return error; 242 259 } 243 260 244 - static int v9fs_remote_set_acl(struct dentry *dentry, const char *name, 245 - const void *value, size_t size, 246 - int flags, int type) 247 - { 248 - char *full_name; 249 - 250 - switch (type) { 251 - case ACL_TYPE_ACCESS: 252 - full_name = POSIX_ACL_XATTR_ACCESS; 253 - break; 254 - case ACL_TYPE_DEFAULT: 255 - full_name = POSIX_ACL_XATTR_DEFAULT; 256 - break; 257 - default: 258 - BUG(); 259 - } 260 - return v9fs_xattr_set(dentry, full_name, value, size, flags); 261 - } 262 - 263 - 264 - static int v9fs_xattr_set_acl(struct dentry *dentry, const char *name, 265 - const void *value, size_t size, 266 - int flags, int type) 261 + static int v9fs_xattr_set_acl(const struct xattr_handler *handler, 262 + struct dentry *dentry, const char *name, 263 + const void *value, size_t size, int flags) 267 264 { 268 265 int retval; 269 266 struct posix_acl *acl; ··· 259 296 * xattr value. We leave it to the server to validate 260 297 */ 261 298 if ((v9ses->flags & V9FS_ACCESS_MASK) != V9FS_ACCESS_CLIENT) 262 - return v9fs_remote_set_acl(dentry, name, 263 - value, size, flags, type); 299 + return v9fs_xattr_set(dentry, handler->prefix, value, size, 300 + flags); 264 301 265 302 if (S_ISLNK(inode->i_mode)) 266 303 return -EOPNOTSUPP; ··· 279 316 } else 280 317 acl = NULL; 281 318 282 - switch (type) { 319 + switch (handler->flags) { 283 320 case ACL_TYPE_ACCESS: 284 - name = POSIX_ACL_XATTR_ACCESS; 285 321 if (acl) { 286 322 umode_t mode = inode->i_mode; 287 323 retval = posix_acl_equiv_mode(acl, &mode); ··· 311 349 } 312 350 break; 313 351 case ACL_TYPE_DEFAULT: 314 - name = POSIX_ACL_XATTR_DEFAULT; 315 352 if (!S_ISDIR(inode->i_mode)) { 316 353 retval = acl ? -EINVAL : 0; 317 354 goto err_out; ··· 319 358 default: 320 359 BUG(); 321 360 } 322 - retval = v9fs_xattr_set(dentry, name, value, size, flags); 361 + retval = v9fs_xattr_set(dentry, handler->prefix, value, size, flags); 323 362 if (!retval) 324 - set_cached_acl(inode, type, acl); 363 + set_cached_acl(inode, handler->flags, acl); 325 364 err_out: 326 365 posix_acl_release(acl); 327 366 return retval;
+42
fs/9p/xattr.c
··· 137 137 return v9fs_xattr_get(dentry, NULL, buffer, buffer_size); 138 138 } 139 139 140 + static int v9fs_xattr_handler_get(const struct xattr_handler *handler, 141 + struct dentry *dentry, const char *name, 142 + void *buffer, size_t size) 143 + { 144 + const char *full_name = xattr_full_name(handler, name); 145 + 146 + if (strcmp(name, "") == 0) 147 + return -EINVAL; 148 + return v9fs_xattr_get(dentry, full_name, buffer, size); 149 + } 150 + 151 + static int v9fs_xattr_handler_set(const struct xattr_handler *handler, 152 + struct dentry *dentry, const char *name, 153 + const void *value, size_t size, int flags) 154 + { 155 + const char *full_name = xattr_full_name(handler, name); 156 + 157 + if (strcmp(name, "") == 0) 158 + return -EINVAL; 159 + return v9fs_xattr_set(dentry, full_name, value, size, flags); 160 + } 161 + 162 + static struct xattr_handler v9fs_xattr_user_handler = { 163 + .prefix = XATTR_USER_PREFIX, 164 + .get = v9fs_xattr_handler_get, 165 + .set = v9fs_xattr_handler_set, 166 + }; 167 + 168 + static struct xattr_handler v9fs_xattr_trusted_handler = { 169 + .prefix = XATTR_TRUSTED_PREFIX, 170 + .get = v9fs_xattr_handler_get, 171 + .set = v9fs_xattr_handler_set, 172 + }; 173 + 174 + #ifdef CONFIG_9P_FS_SECURITY 175 + static struct xattr_handler v9fs_xattr_security_handler = { 176 + .prefix = XATTR_SECURITY_PREFIX, 177 + .get = v9fs_xattr_handler_get, 178 + .set = v9fs_xattr_handler_set, 179 + }; 180 + #endif 181 + 140 182 const struct xattr_handler *v9fs_xattr_handlers[] = { 141 183 &v9fs_xattr_user_handler, 142 184 &v9fs_xattr_trusted_handler,
-3
fs/9p/xattr.h
··· 19 19 #include <net/9p/client.h> 20 20 21 21 extern const struct xattr_handler *v9fs_xattr_handlers[]; 22 - extern struct xattr_handler v9fs_xattr_user_handler; 23 - extern struct xattr_handler v9fs_xattr_trusted_handler; 24 - extern struct xattr_handler v9fs_xattr_security_handler; 25 22 extern const struct xattr_handler v9fs_xattr_acl_access_handler; 26 23 extern const struct xattr_handler v9fs_xattr_acl_default_handler; 27 24
-80
fs/9p/xattr_security.c
··· 1 - /* 2 - * Copyright IBM Corporation, 2010 3 - * Author Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> 4 - * 5 - * This program is free software; you can redistribute it and/or modify it 6 - * under the terms of version 2.1 of the GNU Lesser General Public License 7 - * as published by the Free Software Foundation. 8 - * 9 - * This program is distributed in the hope that it would be useful, but 10 - * WITHOUT ANY WARRANTY; without even the implied warranty of 11 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 12 - * 13 - */ 14 - 15 - 16 - #include <linux/module.h> 17 - #include <linux/string.h> 18 - #include <linux/fs.h> 19 - #include <linux/slab.h> 20 - #include "xattr.h" 21 - 22 - static int v9fs_xattr_security_get(struct dentry *dentry, const char *name, 23 - void *buffer, size_t size, int type) 24 - { 25 - int retval; 26 - char *full_name; 27 - size_t name_len; 28 - size_t prefix_len = XATTR_SECURITY_PREFIX_LEN; 29 - 30 - if (name == NULL) 31 - return -EINVAL; 32 - 33 - if (strcmp(name, "") == 0) 34 - return -EINVAL; 35 - 36 - name_len = strlen(name); 37 - full_name = kmalloc(prefix_len + name_len + 1 , GFP_KERNEL); 38 - if (!full_name) 39 - return -ENOMEM; 40 - memcpy(full_name, XATTR_SECURITY_PREFIX, prefix_len); 41 - memcpy(full_name+prefix_len, name, name_len); 42 - full_name[prefix_len + name_len] = '\0'; 43 - 44 - retval = v9fs_xattr_get(dentry, full_name, buffer, size); 45 - kfree(full_name); 46 - return retval; 47 - } 48 - 49 - static int v9fs_xattr_security_set(struct dentry *dentry, const char *name, 50 - const void *value, size_t size, int flags, int type) 51 - { 52 - int retval; 53 - char *full_name; 54 - size_t name_len; 55 - size_t prefix_len = XATTR_SECURITY_PREFIX_LEN; 56 - 57 - if (name == NULL) 58 - return -EINVAL; 59 - 60 - if (strcmp(name, "") == 0) 61 - return -EINVAL; 62 - 63 - name_len = strlen(name); 64 - full_name = kmalloc(prefix_len + name_len + 1 , GFP_KERNEL); 65 - if (!full_name) 66 - return -ENOMEM; 67 - memcpy(full_name, XATTR_SECURITY_PREFIX, prefix_len); 68 - memcpy(full_name + prefix_len, name, name_len); 69 - full_name[prefix_len + name_len] = '\0'; 70 - 71 - retval = v9fs_xattr_set(dentry, full_name, value, size, flags); 72 - kfree(full_name); 73 - return retval; 74 - } 75 - 76 - struct xattr_handler v9fs_xattr_security_handler = { 77 - .prefix = XATTR_SECURITY_PREFIX, 78 - .get = v9fs_xattr_security_get, 79 - .set = v9fs_xattr_security_set, 80 - };
-80
fs/9p/xattr_trusted.c
··· 1 - /* 2 - * Copyright IBM Corporation, 2010 3 - * Author Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> 4 - * 5 - * This program is free software; you can redistribute it and/or modify it 6 - * under the terms of version 2.1 of the GNU Lesser General Public License 7 - * as published by the Free Software Foundation. 8 - * 9 - * This program is distributed in the hope that it would be useful, but 10 - * WITHOUT ANY WARRANTY; without even the implied warranty of 11 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 12 - * 13 - */ 14 - 15 - 16 - #include <linux/module.h> 17 - #include <linux/string.h> 18 - #include <linux/fs.h> 19 - #include <linux/slab.h> 20 - #include "xattr.h" 21 - 22 - static int v9fs_xattr_trusted_get(struct dentry *dentry, const char *name, 23 - void *buffer, size_t size, int type) 24 - { 25 - int retval; 26 - char *full_name; 27 - size_t name_len; 28 - size_t prefix_len = XATTR_TRUSTED_PREFIX_LEN; 29 - 30 - if (name == NULL) 31 - return -EINVAL; 32 - 33 - if (strcmp(name, "") == 0) 34 - return -EINVAL; 35 - 36 - name_len = strlen(name); 37 - full_name = kmalloc(prefix_len + name_len + 1 , GFP_KERNEL); 38 - if (!full_name) 39 - return -ENOMEM; 40 - memcpy(full_name, XATTR_TRUSTED_PREFIX, prefix_len); 41 - memcpy(full_name+prefix_len, name, name_len); 42 - full_name[prefix_len + name_len] = '\0'; 43 - 44 - retval = v9fs_xattr_get(dentry, full_name, buffer, size); 45 - kfree(full_name); 46 - return retval; 47 - } 48 - 49 - static int v9fs_xattr_trusted_set(struct dentry *dentry, const char *name, 50 - const void *value, size_t size, int flags, int type) 51 - { 52 - int retval; 53 - char *full_name; 54 - size_t name_len; 55 - size_t prefix_len = XATTR_TRUSTED_PREFIX_LEN; 56 - 57 - if (name == NULL) 58 - return -EINVAL; 59 - 60 - if (strcmp(name, "") == 0) 61 - return -EINVAL; 62 - 63 - name_len = strlen(name); 64 - full_name = kmalloc(prefix_len + name_len + 1 , GFP_KERNEL); 65 - if (!full_name) 66 - return -ENOMEM; 67 - memcpy(full_name, XATTR_TRUSTED_PREFIX, prefix_len); 68 - memcpy(full_name + prefix_len, name, name_len); 69 - full_name[prefix_len + name_len] = '\0'; 70 - 71 - retval = v9fs_xattr_set(dentry, full_name, value, size, flags); 72 - kfree(full_name); 73 - return retval; 74 - } 75 - 76 - struct xattr_handler v9fs_xattr_trusted_handler = { 77 - .prefix = XATTR_TRUSTED_PREFIX, 78 - .get = v9fs_xattr_trusted_get, 79 - .set = v9fs_xattr_trusted_set, 80 - };
-80
fs/9p/xattr_user.c
··· 1 - /* 2 - * Copyright IBM Corporation, 2010 3 - * Author Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> 4 - * 5 - * This program is free software; you can redistribute it and/or modify it 6 - * under the terms of version 2.1 of the GNU Lesser General Public License 7 - * as published by the Free Software Foundation. 8 - * 9 - * This program is distributed in the hope that it would be useful, but 10 - * WITHOUT ANY WARRANTY; without even the implied warranty of 11 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 12 - * 13 - */ 14 - 15 - 16 - #include <linux/module.h> 17 - #include <linux/string.h> 18 - #include <linux/fs.h> 19 - #include <linux/slab.h> 20 - #include "xattr.h" 21 - 22 - static int v9fs_xattr_user_get(struct dentry *dentry, const char *name, 23 - void *buffer, size_t size, int type) 24 - { 25 - int retval; 26 - char *full_name; 27 - size_t name_len; 28 - size_t prefix_len = XATTR_USER_PREFIX_LEN; 29 - 30 - if (name == NULL) 31 - return -EINVAL; 32 - 33 - if (strcmp(name, "") == 0) 34 - return -EINVAL; 35 - 36 - name_len = strlen(name); 37 - full_name = kmalloc(prefix_len + name_len + 1 , GFP_KERNEL); 38 - if (!full_name) 39 - return -ENOMEM; 40 - memcpy(full_name, XATTR_USER_PREFIX, prefix_len); 41 - memcpy(full_name+prefix_len, name, name_len); 42 - full_name[prefix_len + name_len] = '\0'; 43 - 44 - retval = v9fs_xattr_get(dentry, full_name, buffer, size); 45 - kfree(full_name); 46 - return retval; 47 - } 48 - 49 - static int v9fs_xattr_user_set(struct dentry *dentry, const char *name, 50 - const void *value, size_t size, int flags, int type) 51 - { 52 - int retval; 53 - char *full_name; 54 - size_t name_len; 55 - size_t prefix_len = XATTR_USER_PREFIX_LEN; 56 - 57 - if (name == NULL) 58 - return -EINVAL; 59 - 60 - if (strcmp(name, "") == 0) 61 - return -EINVAL; 62 - 63 - name_len = strlen(name); 64 - full_name = kmalloc(prefix_len + name_len + 1 , GFP_KERNEL); 65 - if (!full_name) 66 - return -ENOMEM; 67 - memcpy(full_name, XATTR_USER_PREFIX, prefix_len); 68 - memcpy(full_name + prefix_len, name, name_len); 69 - full_name[prefix_len + name_len] = '\0'; 70 - 71 - retval = v9fs_xattr_set(dentry, full_name, value, size, flags); 72 - kfree(full_name); 73 - return retval; 74 - } 75 - 76 - struct xattr_handler v9fs_xattr_user_handler = { 77 - .prefix = XATTR_USER_PREFIX, 78 - .get = v9fs_xattr_user_get, 79 - .set = v9fs_xattr_user_set, 80 - };
+3 -4
fs/ext2/xattr.c
··· 293 293 ext2_xattr_handler(entry->e_name_index); 294 294 295 295 if (handler) { 296 - size_t size = handler->list(dentry, buffer, rest, 297 - entry->e_name, 298 - entry->e_name_len, 299 - handler->flags); 296 + size_t size = handler->list(handler, dentry, buffer, 297 + rest, entry->e_name, 298 + entry->e_name_len); 300 299 if (buffer) { 301 300 if (size > rest) { 302 301 error = -ERANGE;
+9 -6
fs/ext2/xattr_security.c
··· 8 8 #include "xattr.h" 9 9 10 10 static size_t 11 - ext2_xattr_security_list(struct dentry *dentry, char *list, size_t list_size, 12 - const char *name, size_t name_len, int type) 11 + ext2_xattr_security_list(const struct xattr_handler *handler, 12 + struct dentry *dentry, char *list, size_t list_size, 13 + const char *name, size_t name_len) 13 14 { 14 15 const int prefix_len = XATTR_SECURITY_PREFIX_LEN; 15 16 const size_t total_len = prefix_len + name_len + 1; ··· 24 23 } 25 24 26 25 static int 27 - ext2_xattr_security_get(struct dentry *dentry, const char *name, 28 - void *buffer, size_t size, int type) 26 + ext2_xattr_security_get(const struct xattr_handler *handler, 27 + struct dentry *dentry, const char *name, 28 + void *buffer, size_t size) 29 29 { 30 30 if (strcmp(name, "") == 0) 31 31 return -EINVAL; ··· 35 33 } 36 34 37 35 static int 38 - ext2_xattr_security_set(struct dentry *dentry, const char *name, 39 - const void *value, size_t size, int flags, int type) 36 + ext2_xattr_security_set(const struct xattr_handler *handler, 37 + struct dentry *dentry, const char *name, 38 + const void *value, size_t size, int flags) 40 39 { 41 40 if (strcmp(name, "") == 0) 42 41 return -EINVAL;
+9 -6
fs/ext2/xattr_trusted.c
··· 9 9 #include "xattr.h" 10 10 11 11 static size_t 12 - ext2_xattr_trusted_list(struct dentry *dentry, char *list, size_t list_size, 13 - const char *name, size_t name_len, int type) 12 + ext2_xattr_trusted_list(const struct xattr_handler *handler, 13 + struct dentry *dentry, char *list, size_t list_size, 14 + const char *name, size_t name_len) 14 15 { 15 16 const int prefix_len = XATTR_TRUSTED_PREFIX_LEN; 16 17 const size_t total_len = prefix_len + name_len + 1; ··· 28 27 } 29 28 30 29 static int 31 - ext2_xattr_trusted_get(struct dentry *dentry, const char *name, 32 - void *buffer, size_t size, int type) 30 + ext2_xattr_trusted_get(const struct xattr_handler *handler, 31 + struct dentry *dentry, const char *name, 32 + void *buffer, size_t size) 33 33 { 34 34 if (strcmp(name, "") == 0) 35 35 return -EINVAL; ··· 39 37 } 40 38 41 39 static int 42 - ext2_xattr_trusted_set(struct dentry *dentry, const char *name, 43 - const void *value, size_t size, int flags, int type) 40 + ext2_xattr_trusted_set(const struct xattr_handler *handler, 41 + struct dentry *dentry, const char *name, 42 + const void *value, size_t size, int flags) 44 43 { 45 44 if (strcmp(name, "") == 0) 46 45 return -EINVAL;
+9 -6
fs/ext2/xattr_user.c
··· 11 11 #include "xattr.h" 12 12 13 13 static size_t 14 - ext2_xattr_user_list(struct dentry *dentry, char *list, size_t list_size, 15 - const char *name, size_t name_len, int type) 14 + ext2_xattr_user_list(const struct xattr_handler *handler, 15 + struct dentry *dentry, char *list, size_t list_size, 16 + const char *name, size_t name_len) 16 17 { 17 18 const size_t prefix_len = XATTR_USER_PREFIX_LEN; 18 19 const size_t total_len = prefix_len + name_len + 1; ··· 30 29 } 31 30 32 31 static int 33 - ext2_xattr_user_get(struct dentry *dentry, const char *name, 34 - void *buffer, size_t size, int type) 32 + ext2_xattr_user_get(const struct xattr_handler *handler, 33 + struct dentry *dentry, const char *name, 34 + void *buffer, size_t size) 35 35 { 36 36 if (strcmp(name, "") == 0) 37 37 return -EINVAL; ··· 43 41 } 44 42 45 43 static int 46 - ext2_xattr_user_set(struct dentry *dentry, const char *name, 47 - const void *value, size_t size, int flags, int type) 44 + ext2_xattr_user_set(const struct xattr_handler *handler, 45 + struct dentry *dentry, const char *name, 46 + const void *value, size_t size, int flags) 48 47 { 49 48 if (strcmp(name, "") == 0) 50 49 return -EINVAL;
+3 -4
fs/ext4/xattr.c
··· 405 405 ext4_xattr_handler(entry->e_name_index); 406 406 407 407 if (handler) { 408 - size_t size = handler->list(dentry, buffer, rest, 409 - entry->e_name, 410 - entry->e_name_len, 411 - handler->flags); 408 + size_t size = handler->list(handler, dentry, buffer, 409 + rest, entry->e_name, 410 + entry->e_name_len); 412 411 if (buffer) { 413 412 if (size > rest) 414 413 return -ERANGE;
+9 -6
fs/ext4/xattr_security.c
··· 12 12 #include "xattr.h" 13 13 14 14 static size_t 15 - ext4_xattr_security_list(struct dentry *dentry, char *list, size_t list_size, 16 - const char *name, size_t name_len, int type) 15 + ext4_xattr_security_list(const struct xattr_handler *handler, 16 + struct dentry *dentry, char *list, size_t list_size, 17 + const char *name, size_t name_len) 17 18 { 18 19 const size_t prefix_len = sizeof(XATTR_SECURITY_PREFIX)-1; 19 20 const size_t total_len = prefix_len + name_len + 1; ··· 29 28 } 30 29 31 30 static int 32 - ext4_xattr_security_get(struct dentry *dentry, const char *name, 33 - void *buffer, size_t size, int type) 31 + ext4_xattr_security_get(const struct xattr_handler *handler, 32 + struct dentry *dentry, const char *name, 33 + void *buffer, size_t size) 34 34 { 35 35 if (strcmp(name, "") == 0) 36 36 return -EINVAL; ··· 40 38 } 41 39 42 40 static int 43 - ext4_xattr_security_set(struct dentry *dentry, const char *name, 44 - const void *value, size_t size, int flags, int type) 41 + ext4_xattr_security_set(const struct xattr_handler *handler, 42 + struct dentry *dentry, const char *name, 43 + const void *value, size_t size, int flags) 45 44 { 46 45 if (strcmp(name, "") == 0) 47 46 return -EINVAL;
+9 -6
fs/ext4/xattr_trusted.c
··· 13 13 #include "xattr.h" 14 14 15 15 static size_t 16 - ext4_xattr_trusted_list(struct dentry *dentry, char *list, size_t list_size, 17 - const char *name, size_t name_len, int type) 16 + ext4_xattr_trusted_list(const struct xattr_handler *handler, 17 + struct dentry *dentry, char *list, size_t list_size, 18 + const char *name, size_t name_len) 18 19 { 19 20 const size_t prefix_len = XATTR_TRUSTED_PREFIX_LEN; 20 21 const size_t total_len = prefix_len + name_len + 1; ··· 32 31 } 33 32 34 33 static int 35 - ext4_xattr_trusted_get(struct dentry *dentry, const char *name, void *buffer, 36 - size_t size, int type) 34 + ext4_xattr_trusted_get(const struct xattr_handler *handler, 35 + struct dentry *dentry, const char *name, void *buffer, 36 + size_t size) 37 37 { 38 38 if (strcmp(name, "") == 0) 39 39 return -EINVAL; ··· 43 41 } 44 42 45 43 static int 46 - ext4_xattr_trusted_set(struct dentry *dentry, const char *name, 47 - const void *value, size_t size, int flags, int type) 44 + ext4_xattr_trusted_set(const struct xattr_handler *handler, 45 + struct dentry *dentry, const char *name, 46 + const void *value, size_t size, int flags) 48 47 { 49 48 if (strcmp(name, "") == 0) 50 49 return -EINVAL;
+9 -6
fs/ext4/xattr_user.c
··· 12 12 #include "xattr.h" 13 13 14 14 static size_t 15 - ext4_xattr_user_list(struct dentry *dentry, char *list, size_t list_size, 16 - const char *name, size_t name_len, int type) 15 + ext4_xattr_user_list(const struct xattr_handler *handler, 16 + struct dentry *dentry, char *list, size_t list_size, 17 + const char *name, size_t name_len) 17 18 { 18 19 const size_t prefix_len = XATTR_USER_PREFIX_LEN; 19 20 const size_t total_len = prefix_len + name_len + 1; ··· 31 30 } 32 31 33 32 static int 34 - ext4_xattr_user_get(struct dentry *dentry, const char *name, 35 - void *buffer, size_t size, int type) 33 + ext4_xattr_user_get(const struct xattr_handler *handler, 34 + struct dentry *dentry, const char *name, 35 + void *buffer, size_t size) 36 36 { 37 37 if (strcmp(name, "") == 0) 38 38 return -EINVAL; ··· 44 42 } 45 43 46 44 static int 47 - ext4_xattr_user_set(struct dentry *dentry, const char *name, 48 - const void *value, size_t size, int flags, int type) 45 + ext4_xattr_user_set(const struct xattr_handler *handler, 46 + struct dentry *dentry, const char *name, 47 + const void *value, size_t size, int flags) 49 48 { 50 49 if (strcmp(name, "") == 0) 51 50 return -EINVAL;
+29 -31
fs/f2fs/xattr.c
··· 25 25 #include "f2fs.h" 26 26 #include "xattr.h" 27 27 28 - static size_t f2fs_xattr_generic_list(struct dentry *dentry, char *list, 29 - size_t list_size, const char *name, size_t len, int type) 28 + static size_t f2fs_xattr_generic_list(const struct xattr_handler *handler, 29 + struct dentry *dentry, char *list, size_t list_size, 30 + const char *name, size_t len) 30 31 { 31 32 struct f2fs_sb_info *sbi = F2FS_SB(dentry->d_sb); 32 - int total_len, prefix_len = 0; 33 - const char *prefix = NULL; 33 + int total_len, prefix_len; 34 34 35 - switch (type) { 35 + switch (handler->flags) { 36 36 case F2FS_XATTR_INDEX_USER: 37 37 if (!test_opt(sbi, XATTR_USER)) 38 38 return -EOPNOTSUPP; 39 - prefix = XATTR_USER_PREFIX; 40 - prefix_len = XATTR_USER_PREFIX_LEN; 41 39 break; 42 40 case F2FS_XATTR_INDEX_TRUSTED: 43 41 if (!capable(CAP_SYS_ADMIN)) 44 42 return -EPERM; 45 - prefix = XATTR_TRUSTED_PREFIX; 46 - prefix_len = XATTR_TRUSTED_PREFIX_LEN; 47 43 break; 48 44 case F2FS_XATTR_INDEX_SECURITY: 49 - prefix = XATTR_SECURITY_PREFIX; 50 - prefix_len = XATTR_SECURITY_PREFIX_LEN; 51 45 break; 52 46 default: 53 47 return -EINVAL; 54 48 } 55 49 50 + prefix_len = strlen(handler->prefix); 56 51 total_len = prefix_len + len + 1; 57 52 if (list && total_len <= list_size) { 58 - memcpy(list, prefix, prefix_len); 53 + memcpy(list, handler->prefix, prefix_len); 59 54 memcpy(list + prefix_len, name, len); 60 55 list[prefix_len + len] = '\0'; 61 56 } 62 57 return total_len; 63 58 } 64 59 65 - static int f2fs_xattr_generic_get(struct dentry *dentry, const char *name, 66 - void *buffer, size_t size, int type) 60 + static int f2fs_xattr_generic_get(const struct xattr_handler *handler, 61 + struct dentry *dentry, const char *name, void *buffer, 62 + size_t size) 67 63 { 68 64 struct f2fs_sb_info *sbi = F2FS_SB(dentry->d_sb); 69 65 70 - switch (type) { 66 + switch (handler->flags) { 71 67 case F2FS_XATTR_INDEX_USER: 72 68 if (!test_opt(sbi, XATTR_USER)) 73 69 return -EOPNOTSUPP; ··· 79 83 } 80 84 if (strcmp(name, "") == 0) 81 85 return -EINVAL; 82 - return f2fs_getxattr(d_inode(dentry), type, name, buffer, size, NULL); 86 + return f2fs_getxattr(d_inode(dentry), handler->flags, name, 87 + buffer, size, NULL); 83 88 } 84 89 85 - static int f2fs_xattr_generic_set(struct dentry *dentry, const char *name, 86 - const void *value, size_t size, int flags, int type) 90 + static int f2fs_xattr_generic_set(const struct xattr_handler *handler, 91 + struct dentry *dentry, const char *name, const void *value, 92 + size_t size, int flags) 87 93 { 88 94 struct f2fs_sb_info *sbi = F2FS_SB(dentry->d_sb); 89 95 90 - switch (type) { 96 + switch (handler->flags) { 91 97 case F2FS_XATTR_INDEX_USER: 92 98 if (!test_opt(sbi, XATTR_USER)) 93 99 return -EOPNOTSUPP; ··· 106 108 if (strcmp(name, "") == 0) 107 109 return -EINVAL; 108 110 109 - return f2fs_setxattr(d_inode(dentry), type, name, 111 + return f2fs_setxattr(d_inode(dentry), handler->flags, name, 110 112 value, size, NULL, flags); 111 113 } 112 114 113 - static size_t f2fs_xattr_advise_list(struct dentry *dentry, char *list, 114 - size_t list_size, const char *name, size_t len, int type) 115 + static size_t f2fs_xattr_advise_list(const struct xattr_handler *handler, 116 + struct dentry *dentry, char *list, size_t list_size, 117 + const char *name, size_t len) 115 118 { 116 119 const char *xname = F2FS_SYSTEM_ADVISE_PREFIX; 117 120 size_t size; 118 - 119 - if (type != F2FS_XATTR_INDEX_ADVISE) 120 - return 0; 121 121 122 122 size = strlen(xname) + 1; 123 123 if (list && size <= list_size) ··· 123 127 return size; 124 128 } 125 129 126 - static int f2fs_xattr_advise_get(struct dentry *dentry, const char *name, 127 - void *buffer, size_t size, int type) 130 + static int f2fs_xattr_advise_get(const struct xattr_handler *handler, 131 + struct dentry *dentry, const char *name, void *buffer, 132 + size_t size) 128 133 { 129 134 struct inode *inode = d_inode(dentry); 130 135 ··· 137 140 return sizeof(char); 138 141 } 139 142 140 - static int f2fs_xattr_advise_set(struct dentry *dentry, const char *name, 141 - const void *value, size_t size, int flags, int type) 143 + static int f2fs_xattr_advise_set(const struct xattr_handler *handler, 144 + struct dentry *dentry, const char *name, const void *value, 145 + size_t size, int flags) 142 146 { 143 147 struct inode *inode = d_inode(dentry); 144 148 ··· 460 462 if (!handler) 461 463 continue; 462 464 463 - size = handler->list(dentry, buffer, rest, entry->e_name, 464 - entry->e_name_len, handler->flags); 465 + size = handler->list(handler, dentry, buffer, rest, 466 + entry->e_name, entry->e_name_len); 465 467 if (buffer && size > rest) { 466 468 error = -ERANGE; 467 469 goto cleanup;
+8 -5
fs/gfs2/xattr.c
··· 583 583 * 584 584 * Returns: actual size of data on success, -errno on error 585 585 */ 586 - static int gfs2_xattr_get(struct dentry *dentry, const char *name, 587 - void *buffer, size_t size, int type) 586 + static int gfs2_xattr_get(const struct xattr_handler *handler, 587 + struct dentry *dentry, const char *name, 588 + void *buffer, size_t size) 588 589 { 589 590 struct gfs2_inode *ip = GFS2_I(d_inode(dentry)); 590 591 struct gfs2_ea_location el; 592 + int type = handler->flags; 591 593 int error; 592 594 593 595 if (!ip->i_eattr) ··· 1229 1227 return error; 1230 1228 } 1231 1229 1232 - static int gfs2_xattr_set(struct dentry *dentry, const char *name, 1233 - const void *value, size_t size, int flags, int type) 1230 + static int gfs2_xattr_set(const struct xattr_handler *handler, 1231 + struct dentry *dentry, const char *name, 1232 + const void *value, size_t size, int flags) 1234 1233 { 1235 1234 return __gfs2_xattr_set(d_inode(dentry), name, value, 1236 - size, flags, type); 1235 + size, flags, handler->flags); 1237 1236 } 1238 1237 1239 1238
+6 -15
fs/hfsplus/xattr.c
··· 849 849 return err; 850 850 } 851 851 852 - static int hfsplus_osx_getxattr(struct dentry *dentry, const char *name, 853 - void *buffer, size_t size, int type) 852 + static int hfsplus_osx_getxattr(const struct xattr_handler *handler, 853 + struct dentry *dentry, const char *name, 854 + void *buffer, size_t size) 854 855 { 855 856 if (!strcmp(name, "")) 856 857 return -EINVAL; ··· 872 871 return __hfsplus_getxattr(d_inode(dentry), name, buffer, size); 873 872 } 874 873 875 - static int hfsplus_osx_setxattr(struct dentry *dentry, const char *name, 876 - const void *buffer, size_t size, int flags, int type) 874 + static int hfsplus_osx_setxattr(const struct xattr_handler *handler, 875 + struct dentry *dentry, const char *name, 876 + const void *buffer, size_t size, int flags) 877 877 { 878 878 if (!strcmp(name, "")) 879 879 return -EINVAL; ··· 895 893 return __hfsplus_setxattr(d_inode(dentry), name, buffer, size, flags); 896 894 } 897 895 898 - static size_t hfsplus_osx_listxattr(struct dentry *dentry, char *list, 899 - size_t list_size, const char *name, size_t name_len, int type) 900 - { 901 - /* 902 - * This method is not used. 903 - * It is used hfsplus_listxattr() instead of generic_listxattr(). 904 - */ 905 - return -EOPNOTSUPP; 906 - } 907 - 908 896 const struct xattr_handler hfsplus_xattr_osx_handler = { 909 897 .prefix = XATTR_MAC_OSX_PREFIX, 910 - .list = hfsplus_osx_listxattr, 911 898 .get = hfsplus_osx_getxattr, 912 899 .set = hfsplus_osx_setxattr, 913 900 };
+6 -15
fs/hfsplus/xattr_security.c
··· 13 13 #include "xattr.h" 14 14 #include "acl.h" 15 15 16 - static int hfsplus_security_getxattr(struct dentry *dentry, const char *name, 17 - void *buffer, size_t size, int type) 16 + static int hfsplus_security_getxattr(const struct xattr_handler *handler, 17 + struct dentry *dentry, const char *name, 18 + void *buffer, size_t size) 18 19 { 19 20 return hfsplus_getxattr(dentry, name, buffer, size, 20 21 XATTR_SECURITY_PREFIX, 21 22 XATTR_SECURITY_PREFIX_LEN); 22 23 } 23 24 24 - static int hfsplus_security_setxattr(struct dentry *dentry, const char *name, 25 - const void *buffer, size_t size, int flags, int type) 25 + static int hfsplus_security_setxattr(const struct xattr_handler *handler, 26 + struct dentry *dentry, const char *name, 27 + const void *buffer, size_t size, int flags) 26 28 { 27 29 return hfsplus_setxattr(dentry, name, buffer, size, flags, 28 30 XATTR_SECURITY_PREFIX, 29 31 XATTR_SECURITY_PREFIX_LEN); 30 - } 31 - 32 - static size_t hfsplus_security_listxattr(struct dentry *dentry, char *list, 33 - size_t list_size, const char *name, size_t name_len, int type) 34 - { 35 - /* 36 - * This method is not used. 37 - * It is used hfsplus_listxattr() instead of generic_listxattr(). 38 - */ 39 - return -EOPNOTSUPP; 40 32 } 41 33 42 34 static int hfsplus_initxattrs(struct inode *inode, ··· 84 92 85 93 const struct xattr_handler hfsplus_xattr_security_handler = { 86 94 .prefix = XATTR_SECURITY_PREFIX, 87 - .list = hfsplus_security_listxattr, 88 95 .get = hfsplus_security_getxattr, 89 96 .set = hfsplus_security_setxattr, 90 97 };
+6 -15
fs/hfsplus/xattr_trusted.c
··· 11 11 #include "hfsplus_fs.h" 12 12 #include "xattr.h" 13 13 14 - static int hfsplus_trusted_getxattr(struct dentry *dentry, const char *name, 15 - void *buffer, size_t size, int type) 14 + static int hfsplus_trusted_getxattr(const struct xattr_handler *handler, 15 + struct dentry *dentry, const char *name, 16 + void *buffer, size_t size) 16 17 { 17 18 return hfsplus_getxattr(dentry, name, buffer, size, 18 19 XATTR_TRUSTED_PREFIX, 19 20 XATTR_TRUSTED_PREFIX_LEN); 20 21 } 21 22 22 - static int hfsplus_trusted_setxattr(struct dentry *dentry, const char *name, 23 - const void *buffer, size_t size, int flags, int type) 23 + static int hfsplus_trusted_setxattr(const struct xattr_handler *handler, 24 + struct dentry *dentry, const char *name, 25 + const void *buffer, size_t size, int flags) 24 26 { 25 27 return hfsplus_setxattr(dentry, name, buffer, size, flags, 26 28 XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN); 27 29 } 28 30 29 - static size_t hfsplus_trusted_listxattr(struct dentry *dentry, char *list, 30 - size_t list_size, const char *name, size_t name_len, int type) 31 - { 32 - /* 33 - * This method is not used. 34 - * It is used hfsplus_listxattr() instead of generic_listxattr(). 35 - */ 36 - return -EOPNOTSUPP; 37 - } 38 - 39 31 const struct xattr_handler hfsplus_xattr_trusted_handler = { 40 32 .prefix = XATTR_TRUSTED_PREFIX, 41 - .list = hfsplus_trusted_listxattr, 42 33 .get = hfsplus_trusted_getxattr, 43 34 .set = hfsplus_trusted_setxattr, 44 35 };
+6 -15
fs/hfsplus/xattr_user.c
··· 11 11 #include "hfsplus_fs.h" 12 12 #include "xattr.h" 13 13 14 - static int hfsplus_user_getxattr(struct dentry *dentry, const char *name, 15 - void *buffer, size_t size, int type) 14 + static int hfsplus_user_getxattr(const struct xattr_handler *handler, 15 + struct dentry *dentry, const char *name, 16 + void *buffer, size_t size) 16 17 { 17 18 18 19 return hfsplus_getxattr(dentry, name, buffer, size, 19 20 XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN); 20 21 } 21 22 22 - static int hfsplus_user_setxattr(struct dentry *dentry, const char *name, 23 - const void *buffer, size_t size, int flags, int type) 23 + static int hfsplus_user_setxattr(const struct xattr_handler *handler, 24 + struct dentry *dentry, const char *name, 25 + const void *buffer, size_t size, int flags) 24 26 { 25 27 return hfsplus_setxattr(dentry, name, buffer, size, flags, 26 28 XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN); 27 29 } 28 30 29 - static size_t hfsplus_user_listxattr(struct dentry *dentry, char *list, 30 - size_t list_size, const char *name, size_t name_len, int type) 31 - { 32 - /* 33 - * This method is not used. 34 - * It is used hfsplus_listxattr() instead of generic_listxattr(). 35 - */ 36 - return -EOPNOTSUPP; 37 - } 38 - 39 31 const struct xattr_handler hfsplus_xattr_user_handler = { 40 32 .prefix = XATTR_USER_PREFIX, 41 - .list = hfsplus_user_listxattr, 42 33 .get = hfsplus_user_getxattr, 43 34 .set = hfsplus_user_setxattr, 44 35 };
+10 -6
fs/jffs2/security.c
··· 48 48 } 49 49 50 50 /* ---- XATTR Handler for "security.*" ----------------- */ 51 - static int jffs2_security_getxattr(struct dentry *dentry, const char *name, 52 - void *buffer, size_t size, int type) 51 + static int jffs2_security_getxattr(const struct xattr_handler *handler, 52 + struct dentry *dentry, const char *name, 53 + void *buffer, size_t size) 53 54 { 54 55 if (!strcmp(name, "")) 55 56 return -EINVAL; ··· 59 58 name, buffer, size); 60 59 } 61 60 62 - static int jffs2_security_setxattr(struct dentry *dentry, const char *name, 63 - const void *buffer, size_t size, int flags, int type) 61 + static int jffs2_security_setxattr(const struct xattr_handler *handler, 62 + struct dentry *dentry, const char *name, 63 + const void *buffer, size_t size, int flags) 64 64 { 65 65 if (!strcmp(name, "")) 66 66 return -EINVAL; ··· 70 68 name, buffer, size, flags); 71 69 } 72 70 73 - static size_t jffs2_security_listxattr(struct dentry *dentry, char *list, 74 - size_t list_size, const char *name, size_t name_len, int type) 71 + static size_t jffs2_security_listxattr(const struct xattr_handler *handler, 72 + struct dentry *dentry, char *list, 73 + size_t list_size, const char *name, 74 + size_t name_len) 75 75 { 76 76 size_t retlen = XATTR_SECURITY_PREFIX_LEN + name_len + 1; 77 77
+5 -4
fs/jffs2/xattr.c
··· 1001 1001 if (!xhandle) 1002 1002 continue; 1003 1003 if (buffer) { 1004 - rc = xhandle->list(dentry, buffer+len, size-len, 1005 - xd->xname, xd->name_len, xd->flags); 1004 + rc = xhandle->list(xhandle, dentry, buffer + len, 1005 + size - len, xd->xname, 1006 + xd->name_len); 1006 1007 } else { 1007 - rc = xhandle->list(dentry, NULL, 0, xd->xname, 1008 - xd->name_len, xd->flags); 1008 + rc = xhandle->list(xhandle, dentry, NULL, 0, 1009 + xd->xname, xd->name_len); 1009 1010 } 1010 1011 if (rc < 0) 1011 1012 goto out;
+13 -6
fs/jffs2/xattr_trusted.c
··· 16 16 #include <linux/mtd/mtd.h> 17 17 #include "nodelist.h" 18 18 19 - static int jffs2_trusted_getxattr(struct dentry *dentry, const char *name, 20 - void *buffer, size_t size, int type) 19 + static int jffs2_trusted_getxattr(const struct xattr_handler *handler, 20 + struct dentry *dentry, const char *name, 21 + void *buffer, size_t size) 21 22 { 22 23 if (!strcmp(name, "")) 23 24 return -EINVAL; ··· 26 25 name, buffer, size); 27 26 } 28 27 29 - static int jffs2_trusted_setxattr(struct dentry *dentry, const char *name, 30 - const void *buffer, size_t size, int flags, int type) 28 + static int jffs2_trusted_setxattr(const struct xattr_handler *handler, 29 + struct dentry *dentry, const char *name, 30 + const void *buffer, size_t size, int flags) 31 31 { 32 32 if (!strcmp(name, "")) 33 33 return -EINVAL; ··· 36 34 name, buffer, size, flags); 37 35 } 38 36 39 - static size_t jffs2_trusted_listxattr(struct dentry *dentry, char *list, 40 - size_t list_size, const char *name, size_t name_len, int type) 37 + static size_t jffs2_trusted_listxattr(const struct xattr_handler *handler, 38 + struct dentry *dentry, char *list, 39 + size_t list_size, const char *name, 40 + size_t name_len) 41 41 { 42 42 size_t retlen = XATTR_TRUSTED_PREFIX_LEN + name_len + 1; 43 + 44 + if (!capable(CAP_SYS_ADMIN)) 45 + return 0; 43 46 44 47 if (list && retlen<=list_size) { 45 48 strcpy(list, XATTR_TRUSTED_PREFIX);
+10 -6
fs/jffs2/xattr_user.c
··· 16 16 #include <linux/mtd/mtd.h> 17 17 #include "nodelist.h" 18 18 19 - static int jffs2_user_getxattr(struct dentry *dentry, const char *name, 20 - void *buffer, size_t size, int type) 19 + static int jffs2_user_getxattr(const struct xattr_handler *handler, 20 + struct dentry *dentry, const char *name, 21 + void *buffer, size_t size) 21 22 { 22 23 if (!strcmp(name, "")) 23 24 return -EINVAL; ··· 26 25 name, buffer, size); 27 26 } 28 27 29 - static int jffs2_user_setxattr(struct dentry *dentry, const char *name, 30 - const void *buffer, size_t size, int flags, int type) 28 + static int jffs2_user_setxattr(const struct xattr_handler *handler, 29 + struct dentry *dentry, const char *name, 30 + const void *buffer, size_t size, int flags) 31 31 { 32 32 if (!strcmp(name, "")) 33 33 return -EINVAL; ··· 36 34 name, buffer, size, flags); 37 35 } 38 36 39 - static size_t jffs2_user_listxattr(struct dentry *dentry, char *list, 40 - size_t list_size, const char *name, size_t name_len, int type) 37 + static size_t jffs2_user_listxattr(const struct xattr_handler *handler, 38 + struct dentry *dentry, char *list, 39 + size_t list_size, const char *name, 40 + size_t name_len) 41 41 { 42 42 size_t retlen = XATTR_USER_PREFIX_LEN + name_len + 1; 43 43
+20 -14
fs/nfs/nfs4proc.c
··· 6248 6248 6249 6249 #define XATTR_NAME_NFSV4_ACL "system.nfs4_acl" 6250 6250 6251 - static int nfs4_xattr_set_nfs4_acl(struct dentry *dentry, const char *key, 6251 + static int nfs4_xattr_set_nfs4_acl(const struct xattr_handler *handler, 6252 + struct dentry *dentry, const char *key, 6252 6253 const void *buf, size_t buflen, 6253 - int flags, int type) 6254 + int flags) 6254 6255 { 6255 6256 if (strcmp(key, "") != 0) 6256 6257 return -EINVAL; ··· 6259 6258 return nfs4_proc_set_acl(d_inode(dentry), buf, buflen); 6260 6259 } 6261 6260 6262 - static int nfs4_xattr_get_nfs4_acl(struct dentry *dentry, const char *key, 6263 - void *buf, size_t buflen, int type) 6261 + static int nfs4_xattr_get_nfs4_acl(const struct xattr_handler *handler, 6262 + struct dentry *dentry, const char *key, 6263 + void *buf, size_t buflen) 6264 6264 { 6265 6265 if (strcmp(key, "") != 0) 6266 6266 return -EINVAL; ··· 6269 6267 return nfs4_proc_get_acl(d_inode(dentry), buf, buflen); 6270 6268 } 6271 6269 6272 - static size_t nfs4_xattr_list_nfs4_acl(struct dentry *dentry, char *list, 6270 + static size_t nfs4_xattr_list_nfs4_acl(const struct xattr_handler *handler, 6271 + struct dentry *dentry, char *list, 6273 6272 size_t list_len, const char *name, 6274 - size_t name_len, int type) 6273 + size_t name_len) 6275 6274 { 6276 6275 size_t len = sizeof(XATTR_NAME_NFSV4_ACL); 6277 6276 ··· 6290 6287 return server->caps & NFS_CAP_SECURITY_LABEL; 6291 6288 } 6292 6289 6293 - static int nfs4_xattr_set_nfs4_label(struct dentry *dentry, const char *key, 6294 - const void *buf, size_t buflen, 6295 - int flags, int type) 6290 + static int nfs4_xattr_set_nfs4_label(const struct xattr_handler *handler, 6291 + struct dentry *dentry, const char *key, 6292 + const void *buf, size_t buflen, 6293 + int flags) 6296 6294 { 6297 6295 if (security_ismaclabel(key)) 6298 6296 return nfs4_set_security_label(dentry, buf, buflen); ··· 6301 6297 return -EOPNOTSUPP; 6302 6298 } 6303 6299 6304 - static int nfs4_xattr_get_nfs4_label(struct dentry *dentry, const char *key, 6305 - void *buf, size_t buflen, int type) 6300 + static int nfs4_xattr_get_nfs4_label(const struct xattr_handler *handler, 6301 + struct dentry *dentry, const char *key, 6302 + void *buf, size_t buflen) 6306 6303 { 6307 6304 if (security_ismaclabel(key)) 6308 6305 return nfs4_get_security_label(d_inode(dentry), buf, buflen); 6309 6306 return -EOPNOTSUPP; 6310 6307 } 6311 6308 6312 - static size_t nfs4_xattr_list_nfs4_label(struct dentry *dentry, char *list, 6313 - size_t list_len, const char *name, 6314 - size_t name_len, int type) 6309 + static size_t nfs4_xattr_list_nfs4_label(const struct xattr_handler *handler, 6310 + struct dentry *dentry, char *list, 6311 + size_t list_len, const char *name, 6312 + size_t name_len) 6315 6313 { 6316 6314 size_t len = 0; 6317 6315
+27 -18
fs/ocfs2/xattr.c
··· 7229 7229 /* 7230 7230 * 'security' attributes support 7231 7231 */ 7232 - static size_t ocfs2_xattr_security_list(struct dentry *dentry, char *list, 7232 + static size_t ocfs2_xattr_security_list(const struct xattr_handler *handler, 7233 + struct dentry *dentry, char *list, 7233 7234 size_t list_size, const char *name, 7234 - size_t name_len, int type) 7235 + size_t name_len) 7235 7236 { 7236 7237 const size_t prefix_len = XATTR_SECURITY_PREFIX_LEN; 7237 7238 const size_t total_len = prefix_len + name_len + 1; ··· 7245 7244 return total_len; 7246 7245 } 7247 7246 7248 - static int ocfs2_xattr_security_get(struct dentry *dentry, const char *name, 7249 - void *buffer, size_t size, int type) 7247 + static int ocfs2_xattr_security_get(const struct xattr_handler *handler, 7248 + struct dentry *dentry, const char *name, 7249 + void *buffer, size_t size) 7250 7250 { 7251 7251 if (strcmp(name, "") == 0) 7252 7252 return -EINVAL; ··· 7255 7253 name, buffer, size); 7256 7254 } 7257 7255 7258 - static int ocfs2_xattr_security_set(struct dentry *dentry, const char *name, 7259 - const void *value, size_t size, int flags, int type) 7256 + static int ocfs2_xattr_security_set(const struct xattr_handler *handler, 7257 + struct dentry *dentry, const char *name, 7258 + const void *value, size_t size, int flags) 7260 7259 { 7261 7260 if (strcmp(name, "") == 0) 7262 7261 return -EINVAL; ··· 7322 7319 /* 7323 7320 * 'trusted' attributes support 7324 7321 */ 7325 - static size_t ocfs2_xattr_trusted_list(struct dentry *dentry, char *list, 7322 + static size_t ocfs2_xattr_trusted_list(const struct xattr_handler *handler, 7323 + struct dentry *dentry, char *list, 7326 7324 size_t list_size, const char *name, 7327 - size_t name_len, int type) 7325 + size_t name_len) 7328 7326 { 7329 7327 const size_t prefix_len = XATTR_TRUSTED_PREFIX_LEN; 7330 7328 const size_t total_len = prefix_len + name_len + 1; ··· 7341 7337 return total_len; 7342 7338 } 7343 7339 7344 - static int ocfs2_xattr_trusted_get(struct dentry *dentry, const char *name, 7345 - void *buffer, size_t size, int type) 7340 + static int ocfs2_xattr_trusted_get(const struct xattr_handler *handler, 7341 + struct dentry *dentry, const char *name, 7342 + void *buffer, size_t size) 7346 7343 { 7347 7344 if (strcmp(name, "") == 0) 7348 7345 return -EINVAL; ··· 7351 7346 name, buffer, size); 7352 7347 } 7353 7348 7354 - static int ocfs2_xattr_trusted_set(struct dentry *dentry, const char *name, 7355 - const void *value, size_t size, int flags, int type) 7349 + static int ocfs2_xattr_trusted_set(const struct xattr_handler *handler, 7350 + struct dentry *dentry, const char *name, 7351 + const void *value, size_t size, int flags) 7356 7352 { 7357 7353 if (strcmp(name, "") == 0) 7358 7354 return -EINVAL; ··· 7372 7366 /* 7373 7367 * 'user' attributes support 7374 7368 */ 7375 - static size_t ocfs2_xattr_user_list(struct dentry *dentry, char *list, 7369 + static size_t ocfs2_xattr_user_list(const struct xattr_handler *handler, 7370 + struct dentry *dentry, char *list, 7376 7371 size_t list_size, const char *name, 7377 - size_t name_len, int type) 7372 + size_t name_len) 7378 7373 { 7379 7374 const size_t prefix_len = XATTR_USER_PREFIX_LEN; 7380 7375 const size_t total_len = prefix_len + name_len + 1; ··· 7392 7385 return total_len; 7393 7386 } 7394 7387 7395 - static int ocfs2_xattr_user_get(struct dentry *dentry, const char *name, 7396 - void *buffer, size_t size, int type) 7388 + static int ocfs2_xattr_user_get(const struct xattr_handler *handler, 7389 + struct dentry *dentry, const char *name, 7390 + void *buffer, size_t size) 7397 7391 { 7398 7392 struct ocfs2_super *osb = OCFS2_SB(dentry->d_sb); 7399 7393 ··· 7406 7398 buffer, size); 7407 7399 } 7408 7400 7409 - static int ocfs2_xattr_user_set(struct dentry *dentry, const char *name, 7410 - const void *value, size_t size, int flags, int type) 7401 + static int ocfs2_xattr_user_set(const struct xattr_handler *handler, 7402 + struct dentry *dentry, const char *name, 7403 + const void *value, size_t size, int flags) 7411 7404 { 7412 7405 struct ocfs2_super *osb = OCFS2_SB(dentry->d_sb); 7413 7406
+18 -18
fs/posix_acl.c
··· 762 762 EXPORT_SYMBOL (posix_acl_to_xattr); 763 763 764 764 static int 765 - posix_acl_xattr_get(struct dentry *dentry, const char *name, 766 - void *value, size_t size, int type) 765 + posix_acl_xattr_get(const struct xattr_handler *handler, 766 + struct dentry *dentry, const char *name, 767 + void *value, size_t size) 767 768 { 768 769 struct posix_acl *acl; 769 770 int error; 770 771 772 + if (strcmp(name, "") != 0) 773 + return -EINVAL; 771 774 if (!IS_POSIXACL(d_backing_inode(dentry))) 772 775 return -EOPNOTSUPP; 773 776 if (d_is_symlink(dentry)) 774 777 return -EOPNOTSUPP; 775 778 776 - acl = get_acl(d_backing_inode(dentry), type); 779 + acl = get_acl(d_backing_inode(dentry), handler->flags); 777 780 if (IS_ERR(acl)) 778 781 return PTR_ERR(acl); 779 782 if (acl == NULL) ··· 789 786 } 790 787 791 788 static int 792 - posix_acl_xattr_set(struct dentry *dentry, const char *name, 793 - const void *value, size_t size, int flags, int type) 789 + posix_acl_xattr_set(const struct xattr_handler *handler, 790 + struct dentry *dentry, const char *name, 791 + const void *value, size_t size, int flags) 794 792 { 795 793 struct inode *inode = d_backing_inode(dentry); 796 794 struct posix_acl *acl = NULL; 797 795 int ret; 798 796 797 + if (strcmp(name, "") != 0) 798 + return -EINVAL; 799 799 if (!IS_POSIXACL(inode)) 800 800 return -EOPNOTSUPP; 801 801 if (!inode->i_op->set_acl) 802 802 return -EOPNOTSUPP; 803 803 804 - if (type == ACL_TYPE_DEFAULT && !S_ISDIR(inode->i_mode)) 804 + if (handler->flags == ACL_TYPE_DEFAULT && !S_ISDIR(inode->i_mode)) 805 805 return value ? -EACCES : 0; 806 806 if (!inode_owner_or_capable(inode)) 807 807 return -EPERM; ··· 821 815 } 822 816 } 823 817 824 - ret = inode->i_op->set_acl(inode, acl, type); 818 + ret = inode->i_op->set_acl(inode, acl, handler->flags); 825 819 out: 826 820 posix_acl_release(acl); 827 821 return ret; 828 822 } 829 823 830 824 static size_t 831 - posix_acl_xattr_list(struct dentry *dentry, char *list, size_t list_size, 832 - const char *name, size_t name_len, int type) 825 + posix_acl_xattr_list(const struct xattr_handler *handler, 826 + struct dentry *dentry, char *list, size_t list_size, 827 + const char *name, size_t name_len) 833 828 { 834 - const char *xname; 829 + const char *xname = handler->prefix; 835 830 size_t size; 836 831 837 832 if (!IS_POSIXACL(d_backing_inode(dentry))) 838 - return -EOPNOTSUPP; 839 - if (d_is_symlink(dentry)) 840 - return -EOPNOTSUPP; 841 - 842 - if (type == ACL_TYPE_ACCESS) 843 - xname = POSIX_ACL_XATTR_ACCESS; 844 - else 845 - xname = POSIX_ACL_XATTR_DEFAULT; 833 + return 0; 846 834 847 835 size = strlen(xname) + 1; 848 836 if (list && size <= list_size)
+8 -8
fs/reiserfs/xattr.c
··· 778 778 if (!handler || get_inode_sd_version(d_inode(dentry)) == STAT_DATA_V1) 779 779 return -EOPNOTSUPP; 780 780 781 - return handler->get(dentry, name, buffer, size, handler->flags); 781 + return handler->get(handler, dentry, name, buffer, size); 782 782 } 783 783 784 784 /* ··· 797 797 if (!handler || get_inode_sd_version(d_inode(dentry)) == STAT_DATA_V1) 798 798 return -EOPNOTSUPP; 799 799 800 - return handler->set(dentry, name, value, size, flags, handler->flags); 800 + return handler->set(handler, dentry, name, value, size, flags); 801 801 } 802 802 803 803 /* ··· 814 814 if (!handler || get_inode_sd_version(d_inode(dentry)) == STAT_DATA_V1) 815 815 return -EOPNOTSUPP; 816 816 817 - return handler->set(dentry, name, NULL, 0, XATTR_REPLACE, handler->flags); 817 + return handler->set(handler, dentry, name, NULL, 0, XATTR_REPLACE); 818 818 } 819 819 820 820 struct listxattr_buf { ··· 842 842 if (!handler) /* Unsupported xattr name */ 843 843 return 0; 844 844 if (b->buf) { 845 - size = handler->list(b->dentry, b->buf + b->pos, 846 - b->size, name, namelen, 847 - handler->flags); 845 + size = handler->list(handler, b->dentry, 846 + b->buf + b->pos, b->size, name, 847 + namelen); 848 848 if (size > b->size) 849 849 return -ERANGE; 850 850 } else { 851 - size = handler->list(b->dentry, NULL, 0, name, 852 - namelen, handler->flags); 851 + size = handler->list(handler, b->dentry, 852 + NULL, 0, name, namelen); 853 853 } 854 854 855 855 b->pos += size;
+7 -6
fs/reiserfs/xattr_security.c
··· 9 9 #include <linux/uaccess.h> 10 10 11 11 static int 12 - security_get(struct dentry *dentry, const char *name, void *buffer, size_t size, 13 - int handler_flags) 12 + security_get(const struct xattr_handler *handler, struct dentry *dentry, 13 + const char *name, void *buffer, size_t size) 14 14 { 15 15 if (strlen(name) < sizeof(XATTR_SECURITY_PREFIX)) 16 16 return -EINVAL; ··· 22 22 } 23 23 24 24 static int 25 - security_set(struct dentry *dentry, const char *name, const void *buffer, 26 - size_t size, int flags, int handler_flags) 25 + security_set(const struct xattr_handler *handler, struct dentry *dentry, 26 + const char *name, const void *buffer, size_t size, int flags) 27 27 { 28 28 if (strlen(name) < sizeof(XATTR_SECURITY_PREFIX)) 29 29 return -EINVAL; ··· 34 34 return reiserfs_xattr_set(d_inode(dentry), name, buffer, size, flags); 35 35 } 36 36 37 - static size_t security_list(struct dentry *dentry, char *list, size_t list_len, 38 - const char *name, size_t namelen, int handler_flags) 37 + static size_t security_list(const struct xattr_handler *handler, 38 + struct dentry *dentry, char *list, size_t list_len, 39 + const char *name, size_t namelen) 39 40 { 40 41 const size_t len = namelen + 1; 41 42
+7 -6
fs/reiserfs/xattr_trusted.c
··· 8 8 #include <linux/uaccess.h> 9 9 10 10 static int 11 - trusted_get(struct dentry *dentry, const char *name, void *buffer, size_t size, 12 - int handler_flags) 11 + trusted_get(const struct xattr_handler *handler, struct dentry *dentry, 12 + const char *name, void *buffer, size_t size) 13 13 { 14 14 if (strlen(name) < sizeof(XATTR_TRUSTED_PREFIX)) 15 15 return -EINVAL; ··· 21 21 } 22 22 23 23 static int 24 - trusted_set(struct dentry *dentry, const char *name, const void *buffer, 25 - size_t size, int flags, int handler_flags) 24 + trusted_set(const struct xattr_handler *handler, struct dentry *dentry, 25 + const char *name, const void *buffer, size_t size, int flags) 26 26 { 27 27 if (strlen(name) < sizeof(XATTR_TRUSTED_PREFIX)) 28 28 return -EINVAL; ··· 33 33 return reiserfs_xattr_set(d_inode(dentry), name, buffer, size, flags); 34 34 } 35 35 36 - static size_t trusted_list(struct dentry *dentry, char *list, size_t list_size, 37 - const char *name, size_t name_len, int handler_flags) 36 + static size_t trusted_list(const struct xattr_handler *handler, 37 + struct dentry *dentry, char *list, size_t list_size, 38 + const char *name, size_t name_len) 38 39 { 39 40 const size_t len = name_len + 1; 40 41
+7 -6
fs/reiserfs/xattr_user.c
··· 7 7 #include <linux/uaccess.h> 8 8 9 9 static int 10 - user_get(struct dentry *dentry, const char *name, void *buffer, size_t size, 11 - int handler_flags) 10 + user_get(const struct xattr_handler *handler, struct dentry *dentry, 11 + const char *name, void *buffer, size_t size) 12 12 { 13 13 14 14 if (strlen(name) < sizeof(XATTR_USER_PREFIX)) ··· 19 19 } 20 20 21 21 static int 22 - user_set(struct dentry *dentry, const char *name, const void *buffer, 23 - size_t size, int flags, int handler_flags) 22 + user_set(const struct xattr_handler *handler, struct dentry *dentry, 23 + const char *name, const void *buffer, size_t size, int flags) 24 24 { 25 25 if (strlen(name) < sizeof(XATTR_USER_PREFIX)) 26 26 return -EINVAL; ··· 30 30 return reiserfs_xattr_set(d_inode(dentry), name, buffer, size, flags); 31 31 } 32 32 33 - static size_t user_list(struct dentry *dentry, char *list, size_t list_size, 34 - const char *name, size_t name_len, int handler_flags) 33 + static size_t user_list(const struct xattr_handler *handler, 34 + struct dentry *dentry, char *list, size_t list_size, 35 + const char *name, size_t name_len) 35 36 { 36 37 const size_t len = name_len + 1; 37 38
+33 -53
fs/squashfs/xattr.c
··· 68 68 name_size = le16_to_cpu(entry.size); 69 69 handler = squashfs_xattr_handler(le16_to_cpu(entry.type)); 70 70 if (handler) 71 - prefix_size = handler->list(d, buffer, rest, NULL, 72 - name_size, handler->flags); 71 + prefix_size = handler->list(handler, d, buffer, rest, 72 + NULL, name_size); 73 73 if (prefix_size) { 74 74 if (buffer) { 75 75 if (prefix_size + name_size + 1 > rest) { ··· 212 212 } 213 213 214 214 215 - /* 216 - * User namespace support 217 - */ 218 - static size_t squashfs_user_list(struct dentry *d, char *list, size_t list_size, 219 - const char *name, size_t name_len, int type) 215 + static size_t squashfs_xattr_handler_list(const struct xattr_handler *handler, 216 + struct dentry *d, char *list, 217 + size_t list_size, const char *name, 218 + size_t name_len) 220 219 { 221 - if (list && XATTR_USER_PREFIX_LEN <= list_size) 222 - memcpy(list, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN); 223 - return XATTR_USER_PREFIX_LEN; 220 + int len = strlen(handler->prefix); 221 + 222 + if (list && len <= list_size) 223 + memcpy(list, handler->prefix, len); 224 + return len; 224 225 } 225 226 226 - static int squashfs_user_get(struct dentry *d, const char *name, void *buffer, 227 - size_t size, int type) 227 + static int squashfs_xattr_handler_get(const struct xattr_handler *handler, 228 + struct dentry *d, const char *name, 229 + void *buffer, size_t size) 228 230 { 229 231 if (name[0] == '\0') 230 232 return -EINVAL; 231 233 232 - return squashfs_xattr_get(d_inode(d), SQUASHFS_XATTR_USER, name, 234 + return squashfs_xattr_get(d_inode(d), handler->flags, name, 233 235 buffer, size); 234 236 } 235 237 238 + /* 239 + * User namespace support 240 + */ 236 241 static const struct xattr_handler squashfs_xattr_user_handler = { 237 242 .prefix = XATTR_USER_PREFIX, 238 - .list = squashfs_user_list, 239 - .get = squashfs_user_get 243 + .flags = SQUASHFS_XATTR_USER, 244 + .list = squashfs_xattr_handler_list, 245 + .get = squashfs_xattr_handler_get 240 246 }; 241 247 242 248 /* 243 249 * Trusted namespace support 244 250 */ 245 - static size_t squashfs_trusted_list(struct dentry *d, char *list, 246 - size_t list_size, const char *name, size_t name_len, int type) 251 + static size_t squashfs_trusted_xattr_handler_list(const struct xattr_handler *handler, 252 + struct dentry *d, char *list, 253 + size_t list_size, const char *name, 254 + size_t name_len) 247 255 { 248 256 if (!capable(CAP_SYS_ADMIN)) 249 257 return 0; 250 - 251 - if (list && XATTR_TRUSTED_PREFIX_LEN <= list_size) 252 - memcpy(list, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN); 253 - return XATTR_TRUSTED_PREFIX_LEN; 254 - } 255 - 256 - static int squashfs_trusted_get(struct dentry *d, const char *name, 257 - void *buffer, size_t size, int type) 258 - { 259 - if (name[0] == '\0') 260 - return -EINVAL; 261 - 262 - return squashfs_xattr_get(d_inode(d), SQUASHFS_XATTR_TRUSTED, name, 263 - buffer, size); 258 + return squashfs_xattr_handler_list(handler, d, list, list_size, name, 259 + name_len); 264 260 } 265 261 266 262 static const struct xattr_handler squashfs_xattr_trusted_handler = { 267 263 .prefix = XATTR_TRUSTED_PREFIX, 268 - .list = squashfs_trusted_list, 269 - .get = squashfs_trusted_get 264 + .flags = SQUASHFS_XATTR_TRUSTED, 265 + .list = squashfs_trusted_xattr_handler_list, 266 + .get = squashfs_xattr_handler_get 270 267 }; 271 268 272 269 /* 273 270 * Security namespace support 274 271 */ 275 - static size_t squashfs_security_list(struct dentry *d, char *list, 276 - size_t list_size, const char *name, size_t name_len, int type) 277 - { 278 - if (list && XATTR_SECURITY_PREFIX_LEN <= list_size) 279 - memcpy(list, XATTR_SECURITY_PREFIX, XATTR_SECURITY_PREFIX_LEN); 280 - return XATTR_SECURITY_PREFIX_LEN; 281 - } 282 - 283 - static int squashfs_security_get(struct dentry *d, const char *name, 284 - void *buffer, size_t size, int type) 285 - { 286 - if (name[0] == '\0') 287 - return -EINVAL; 288 - 289 - return squashfs_xattr_get(d_inode(d), SQUASHFS_XATTR_SECURITY, name, 290 - buffer, size); 291 - } 292 - 293 272 static const struct xattr_handler squashfs_xattr_security_handler = { 294 273 .prefix = XATTR_SECURITY_PREFIX, 295 - .list = squashfs_security_list, 296 - .get = squashfs_security_get 274 + .flags = SQUASHFS_XATTR_SECURITY, 275 + .list = squashfs_xattr_handler_list, 276 + .get = squashfs_xattr_handler_get 297 277 }; 298 278 299 279 static const struct xattr_handler *squashfs_xattr_handler(int type)
-1
fs/ubifs/super.c
··· 2040 2040 if (c->max_inode_sz > MAX_LFS_FILESIZE) 2041 2041 sb->s_maxbytes = c->max_inode_sz = MAX_LFS_FILESIZE; 2042 2042 sb->s_op = &ubifs_super_operations; 2043 - sb->s_xattr = ubifs_xattr_handlers; 2044 2043 2045 2044 mutex_lock(&c->umount_mutex); 2046 2045 err = mount_ubifs(c);
-1
fs/ubifs/ubifs.h
··· 1470 1470 extern atomic_long_t ubifs_clean_zn_cnt; 1471 1471 extern struct kmem_cache *ubifs_inode_slab; 1472 1472 extern const struct super_operations ubifs_super_operations; 1473 - extern const struct xattr_handler *ubifs_xattr_handlers[]; 1474 1473 extern const struct address_space_operations ubifs_file_address_operations; 1475 1474 extern const struct file_operations ubifs_file_operations; 1476 1475 extern const struct inode_operations ubifs_file_inode_operations;
-40
fs/ubifs/xattr.c
··· 588 588 return err; 589 589 } 590 590 591 - static size_t security_listxattr(struct dentry *d, char *list, size_t list_size, 592 - const char *name, size_t name_len, int flags) 593 - { 594 - const int prefix_len = XATTR_SECURITY_PREFIX_LEN; 595 - const size_t total_len = prefix_len + name_len + 1; 596 - 597 - if (list && total_len <= list_size) { 598 - memcpy(list, XATTR_SECURITY_PREFIX, prefix_len); 599 - memcpy(list + prefix_len, name, name_len); 600 - list[prefix_len + name_len] = '\0'; 601 - } 602 - 603 - return total_len; 604 - } 605 - 606 - static int security_getxattr(struct dentry *d, const char *name, void *buffer, 607 - size_t size, int flags) 608 - { 609 - return ubifs_getxattr(d, name, buffer, size); 610 - } 611 - 612 - static int security_setxattr(struct dentry *d, const char *name, 613 - const void *value, size_t size, int flags, 614 - int handler_flags) 615 - { 616 - return ubifs_setxattr(d, name, value, size, flags); 617 - } 618 - 619 - static const struct xattr_handler ubifs_xattr_security_handler = { 620 - .prefix = XATTR_SECURITY_PREFIX, 621 - .list = security_listxattr, 622 - .get = security_getxattr, 623 - .set = security_setxattr, 624 - }; 625 - 626 - const struct xattr_handler *ubifs_xattr_handlers[] = { 627 - &ubifs_xattr_security_handler, 628 - NULL, 629 - }; 630 - 631 591 static int init_xattrs(struct inode *inode, const struct xattr *xattr_array, 632 592 void *fs_info) 633 593 {
+31 -8
fs/xattr.c
··· 720 720 handler = xattr_resolve_name(dentry->d_sb->s_xattr, &name); 721 721 if (!handler) 722 722 return -EOPNOTSUPP; 723 - return handler->get(dentry, name, buffer, size, handler->flags); 723 + return handler->get(handler, dentry, name, buffer, size); 724 724 } 725 725 726 726 /* ··· 735 735 736 736 if (!buffer) { 737 737 for_each_xattr_handler(handlers, handler) { 738 - size += handler->list(dentry, NULL, 0, NULL, 0, 739 - handler->flags); 738 + size += handler->list(handler, dentry, NULL, 0, 739 + NULL, 0); 740 740 } 741 741 } else { 742 742 char *buf = buffer; 743 743 744 744 for_each_xattr_handler(handlers, handler) { 745 - size = handler->list(dentry, buf, buffer_size, 746 - NULL, 0, handler->flags); 745 + size = handler->list(handler, dentry, buf, buffer_size, 746 + NULL, 0); 747 747 if (size > buffer_size) 748 748 return -ERANGE; 749 749 buf += size; ··· 767 767 handler = xattr_resolve_name(dentry->d_sb->s_xattr, &name); 768 768 if (!handler) 769 769 return -EOPNOTSUPP; 770 - return handler->set(dentry, name, value, size, flags, handler->flags); 770 + return handler->set(handler, dentry, name, value, size, flags); 771 771 } 772 772 773 773 /* ··· 782 782 handler = xattr_resolve_name(dentry->d_sb->s_xattr, &name); 783 783 if (!handler) 784 784 return -EOPNOTSUPP; 785 - return handler->set(dentry, name, NULL, 0, 786 - XATTR_REPLACE, handler->flags); 785 + return handler->set(handler, dentry, name, NULL, 0, XATTR_REPLACE); 787 786 } 788 787 789 788 EXPORT_SYMBOL(generic_getxattr); 790 789 EXPORT_SYMBOL(generic_listxattr); 791 790 EXPORT_SYMBOL(generic_setxattr); 792 791 EXPORT_SYMBOL(generic_removexattr); 792 + 793 + /** 794 + * xattr_full_name - Compute full attribute name from suffix 795 + * 796 + * @handler: handler of the xattr_handler operation 797 + * @name: name passed to the xattr_handler operation 798 + * 799 + * The get and set xattr handler operations are called with the remainder of 800 + * the attribute name after skipping the handler's prefix: for example, "foo" 801 + * is passed to the get operation of a handler with prefix "user." to get 802 + * attribute "user.foo". The full name is still "there" in the name though. 803 + * 804 + * Note: the list xattr handler operation when called from the vfs is passed a 805 + * NULL name; some file systems use this operation internally, with varying 806 + * semantics. 807 + */ 808 + const char *xattr_full_name(const struct xattr_handler *handler, 809 + const char *name) 810 + { 811 + size_t prefix_len = strlen(handler->prefix); 812 + 813 + return name - prefix_len; 814 + } 815 + EXPORT_SYMBOL(xattr_full_name); 793 816 794 817 /* 795 818 * Allocate new xattr and copy in the value; but leave the name to callers.
+6 -4
fs/xfs/xfs_xattr.c
··· 32 32 33 33 34 34 static int 35 - xfs_xattr_get(struct dentry *dentry, const char *name, 36 - void *value, size_t size, int xflags) 35 + xfs_xattr_get(const struct xattr_handler *handler, struct dentry *dentry, 36 + const char *name, void *value, size_t size) 37 37 { 38 + int xflags = handler->flags; 38 39 struct xfs_inode *ip = XFS_I(d_inode(dentry)); 39 40 int error, asize = size; 40 41 ··· 77 76 } 78 77 79 78 static int 80 - xfs_xattr_set(struct dentry *dentry, const char *name, const void *value, 81 - size_t size, int flags, int xflags) 79 + xfs_xattr_set(const struct xattr_handler *handler, struct dentry *dentry, 80 + const char *name, const void *value, size_t size, int flags) 82 81 { 82 + int xflags = handler->flags; 83 83 struct xfs_inode *ip = XFS_I(d_inode(dentry)); 84 84 int error; 85 85
+11 -7
include/linux/xattr.h
··· 21 21 22 22 struct xattr_handler { 23 23 const char *prefix; 24 - int flags; /* fs private flags passed back to the handlers */ 25 - size_t (*list)(struct dentry *dentry, char *list, size_t list_size, 26 - const char *name, size_t name_len, int handler_flags); 27 - int (*get)(struct dentry *dentry, const char *name, void *buffer, 28 - size_t size, int handler_flags); 29 - int (*set)(struct dentry *dentry, const char *name, const void *buffer, 30 - size_t size, int flags, int handler_flags); 24 + int flags; /* fs private flags */ 25 + size_t (*list)(const struct xattr_handler *, struct dentry *dentry, 26 + char *list, size_t list_size, const char *name, 27 + size_t name_len); 28 + int (*get)(const struct xattr_handler *, struct dentry *dentry, 29 + const char *name, void *buffer, size_t size); 30 + int (*set)(const struct xattr_handler *, struct dentry *dentry, 31 + const char *name, const void *buffer, size_t size, 32 + int flags); 31 33 }; 34 + 35 + const char *xattr_full_name(const struct xattr_handler *, const char *); 32 36 33 37 struct xattr { 34 38 const char *name;