xref: /openbmc/linux/fs/afs/xattr.c (revision 9a87ffc99ec8eb8d35eed7c4f816d75f5cc9662e)
1b4d0d230SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
2d3e3b7eaSDavid Howells /* Extended attribute handling for AFS.  We use xattrs to get and set metadata
3d3e3b7eaSDavid Howells  * instead of providing pioctl().
4d3e3b7eaSDavid Howells  *
5d3e3b7eaSDavid Howells  * Copyright (C) 2017 Red Hat, Inc. All Rights Reserved.
6d3e3b7eaSDavid Howells  * Written by David Howells (dhowells@redhat.com)
7d3e3b7eaSDavid Howells  */
8d3e3b7eaSDavid Howells 
9d3e3b7eaSDavid Howells #include <linux/slab.h>
10d3e3b7eaSDavid Howells #include <linux/fs.h>
11d3e3b7eaSDavid Howells #include <linux/xattr.h>
12d3e3b7eaSDavid Howells #include "internal.h"
13d3e3b7eaSDavid Howells 
14d3e3b7eaSDavid Howells /*
15e49c7b2fSDavid Howells  * Deal with the result of a successful fetch ACL operation.
16e49c7b2fSDavid Howells  */
afs_acl_success(struct afs_operation * op)17e49c7b2fSDavid Howells static void afs_acl_success(struct afs_operation *op)
18e49c7b2fSDavid Howells {
19e49c7b2fSDavid Howells 	afs_vnode_commit_status(op, &op->file[0]);
20e49c7b2fSDavid Howells }
21e49c7b2fSDavid Howells 
afs_acl_put(struct afs_operation * op)22e49c7b2fSDavid Howells static void afs_acl_put(struct afs_operation *op)
23e49c7b2fSDavid Howells {
24e49c7b2fSDavid Howells 	kfree(op->acl);
25e49c7b2fSDavid Howells }
26e49c7b2fSDavid Howells 
27e49c7b2fSDavid Howells static const struct afs_operation_ops afs_fetch_acl_operation = {
28e49c7b2fSDavid Howells 	.issue_afs_rpc	= afs_fs_fetch_acl,
29e49c7b2fSDavid Howells 	.success	= afs_acl_success,
30e49c7b2fSDavid Howells 	.put		= afs_acl_put,
31e49c7b2fSDavid Howells };
32e49c7b2fSDavid Howells 
33e49c7b2fSDavid Howells /*
34260f082bSDavid Howells  * Get a file's ACL.
35260f082bSDavid Howells  */
afs_xattr_get_acl(const struct xattr_handler * handler,struct dentry * dentry,struct inode * inode,const char * name,void * buffer,size_t size)36260f082bSDavid Howells static int afs_xattr_get_acl(const struct xattr_handler *handler,
37260f082bSDavid Howells 			     struct dentry *dentry,
38260f082bSDavid Howells 			     struct inode *inode, const char *name,
39260f082bSDavid Howells 			     void *buffer, size_t size)
40260f082bSDavid Howells {
41e49c7b2fSDavid Howells 	struct afs_operation *op;
42260f082bSDavid Howells 	struct afs_vnode *vnode = AFS_FS_I(inode);
43260f082bSDavid Howells 	struct afs_acl *acl = NULL;
44e49c7b2fSDavid Howells 	int ret;
45a58823acSDavid Howells 
46e49c7b2fSDavid Howells 	op = afs_alloc_operation(NULL, vnode->volume);
47e49c7b2fSDavid Howells 	if (IS_ERR(op))
48e49c7b2fSDavid Howells 		return -ENOMEM;
49260f082bSDavid Howells 
50e49c7b2fSDavid Howells 	afs_op_set_vnode(op, 0, vnode);
51e49c7b2fSDavid Howells 	op->ops = &afs_fetch_acl_operation;
52260f082bSDavid Howells 
53e49c7b2fSDavid Howells 	afs_begin_vnode_operation(op);
54e49c7b2fSDavid Howells 	afs_wait_for_operation(op);
55e49c7b2fSDavid Howells 	acl = op->acl;
56e49c7b2fSDavid Howells 	op->acl = NULL;
57e49c7b2fSDavid Howells 	ret = afs_put_operation(op);
58260f082bSDavid Howells 
59260f082bSDavid Howells 	if (ret == 0) {
60260f082bSDavid Howells 		ret = acl->size;
61260f082bSDavid Howells 		if (size > 0) {
62cc1dd5c8SDavid Howells 			if (acl->size <= size)
63260f082bSDavid Howells 				memcpy(buffer, acl->data, acl->size);
64cc1dd5c8SDavid Howells 			else
65248c944eSDan Carpenter 				ret = -ERANGE;
66260f082bSDavid Howells 		}
67260f082bSDavid Howells 	}
68260f082bSDavid Howells 
69e49c7b2fSDavid Howells 	kfree(acl);
70260f082bSDavid Howells 	return ret;
71260f082bSDavid Howells }
72260f082bSDavid Howells 
afs_make_acl(struct afs_operation * op,const void * buffer,size_t size)73e49c7b2fSDavid Howells static bool afs_make_acl(struct afs_operation *op,
74e49c7b2fSDavid Howells 			 const void *buffer, size_t size)
75e49c7b2fSDavid Howells {
76e49c7b2fSDavid Howells 	struct afs_acl *acl;
77e49c7b2fSDavid Howells 
78e49c7b2fSDavid Howells 	acl = kmalloc(sizeof(*acl) + size, GFP_KERNEL);
79e49c7b2fSDavid Howells 	if (!acl) {
80e49c7b2fSDavid Howells 		afs_op_nomem(op);
81e49c7b2fSDavid Howells 		return false;
82e49c7b2fSDavid Howells 	}
83e49c7b2fSDavid Howells 
84e49c7b2fSDavid Howells 	acl->size = size;
85e49c7b2fSDavid Howells 	memcpy(acl->data, buffer, size);
86e49c7b2fSDavid Howells 	op->acl = acl;
87e49c7b2fSDavid Howells 	return true;
88e49c7b2fSDavid Howells }
89e49c7b2fSDavid Howells 
90e49c7b2fSDavid Howells static const struct afs_operation_ops afs_store_acl_operation = {
91e49c7b2fSDavid Howells 	.issue_afs_rpc	= afs_fs_store_acl,
92e49c7b2fSDavid Howells 	.success	= afs_acl_success,
93e49c7b2fSDavid Howells 	.put		= afs_acl_put,
94e49c7b2fSDavid Howells };
95e49c7b2fSDavid Howells 
96b10494afSJoe Gorse /*
97b10494afSJoe Gorse  * Set a file's AFS3 ACL.
98b10494afSJoe Gorse  */
afs_xattr_set_acl(const struct xattr_handler * handler,struct mnt_idmap * idmap,struct dentry * dentry,struct inode * inode,const char * name,const void * buffer,size_t size,int flags)99b10494afSJoe Gorse static int afs_xattr_set_acl(const struct xattr_handler *handler,
100*39f60c1cSChristian Brauner 			     struct mnt_idmap *idmap,
101b10494afSJoe Gorse                              struct dentry *dentry,
102b10494afSJoe Gorse                              struct inode *inode, const char *name,
103b10494afSJoe Gorse                              const void *buffer, size_t size, int flags)
104b10494afSJoe Gorse {
105e49c7b2fSDavid Howells 	struct afs_operation *op;
106b10494afSJoe Gorse 	struct afs_vnode *vnode = AFS_FS_I(inode);
107b10494afSJoe Gorse 
108b10494afSJoe Gorse 	if (flags == XATTR_CREATE)
109b10494afSJoe Gorse 		return -EINVAL;
110b10494afSJoe Gorse 
111e49c7b2fSDavid Howells 	op = afs_alloc_operation(NULL, vnode->volume);
112e49c7b2fSDavid Howells 	if (IS_ERR(op))
113e49c7b2fSDavid Howells 		return -ENOMEM;
114b10494afSJoe Gorse 
115e49c7b2fSDavid Howells 	afs_op_set_vnode(op, 0, vnode);
116e49c7b2fSDavid Howells 	if (!afs_make_acl(op, buffer, size))
117e49c7b2fSDavid Howells 		return afs_put_operation(op);
118a58823acSDavid Howells 
119e49c7b2fSDavid Howells 	op->ops = &afs_store_acl_operation;
120e49c7b2fSDavid Howells 	return afs_do_sync_operation(op);
121b10494afSJoe Gorse }
122b10494afSJoe Gorse 
123260f082bSDavid Howells static const struct xattr_handler afs_xattr_afs_acl_handler = {
124260f082bSDavid Howells 	.name   = "afs.acl",
125260f082bSDavid Howells 	.get    = afs_xattr_get_acl,
126b10494afSJoe Gorse 	.set    = afs_xattr_set_acl,
127260f082bSDavid Howells };
128260f082bSDavid Howells 
129e49c7b2fSDavid Howells static const struct afs_operation_ops yfs_fetch_opaque_acl_operation = {
130e49c7b2fSDavid Howells 	.issue_yfs_rpc	= yfs_fs_fetch_opaque_acl,
131e49c7b2fSDavid Howells 	.success	= afs_acl_success,
132e49c7b2fSDavid Howells 	/* Don't free op->yacl in .put here */
133e49c7b2fSDavid Howells };
134e49c7b2fSDavid Howells 
135260f082bSDavid Howells /*
136ae46578bSDavid Howells  * Get a file's YFS ACL.
137ae46578bSDavid Howells  */
afs_xattr_get_yfs(const struct xattr_handler * handler,struct dentry * dentry,struct inode * inode,const char * name,void * buffer,size_t size)138ae46578bSDavid Howells static int afs_xattr_get_yfs(const struct xattr_handler *handler,
139ae46578bSDavid Howells 			     struct dentry *dentry,
140ae46578bSDavid Howells 			     struct inode *inode, const char *name,
141ae46578bSDavid Howells 			     void *buffer, size_t size)
142ae46578bSDavid Howells {
143e49c7b2fSDavid Howells 	struct afs_operation *op;
144ae46578bSDavid Howells 	struct afs_vnode *vnode = AFS_FS_I(inode);
145ae46578bSDavid Howells 	struct yfs_acl *yacl = NULL;
146ae46578bSDavid Howells 	char buf[16], *data;
147773e0c40SDavid Howells 	int which = 0, dsize, ret = -ENOMEM;
148ae46578bSDavid Howells 
149ae46578bSDavid Howells 	if (strcmp(name, "acl") == 0)
150ae46578bSDavid Howells 		which = 0;
151ae46578bSDavid Howells 	else if (strcmp(name, "acl_inherited") == 0)
152ae46578bSDavid Howells 		which = 1;
153ae46578bSDavid Howells 	else if (strcmp(name, "acl_num_cleaned") == 0)
154ae46578bSDavid Howells 		which = 2;
155ae46578bSDavid Howells 	else if (strcmp(name, "vol_acl") == 0)
156ae46578bSDavid Howells 		which = 3;
157ae46578bSDavid Howells 	else
158ae46578bSDavid Howells 		return -EOPNOTSUPP;
159ae46578bSDavid Howells 
160773e0c40SDavid Howells 	yacl = kzalloc(sizeof(struct yfs_acl), GFP_KERNEL);
161773e0c40SDavid Howells 	if (!yacl)
162773e0c40SDavid Howells 		goto error;
163773e0c40SDavid Howells 
164ae46578bSDavid Howells 	if (which == 0)
165773e0c40SDavid Howells 		yacl->flags |= YFS_ACL_WANT_ACL;
166ae46578bSDavid Howells 	else if (which == 3)
167773e0c40SDavid Howells 		yacl->flags |= YFS_ACL_WANT_VOL_ACL;
168ae46578bSDavid Howells 
169e49c7b2fSDavid Howells 	op = afs_alloc_operation(NULL, vnode->volume);
170e49c7b2fSDavid Howells 	if (IS_ERR(op))
171a58823acSDavid Howells 		goto error_yacl;
172a58823acSDavid Howells 
173e49c7b2fSDavid Howells 	afs_op_set_vnode(op, 0, vnode);
174e49c7b2fSDavid Howells 	op->yacl = yacl;
175e49c7b2fSDavid Howells 	op->ops = &yfs_fetch_opaque_acl_operation;
176ae46578bSDavid Howells 
177e49c7b2fSDavid Howells 	afs_begin_vnode_operation(op);
178e49c7b2fSDavid Howells 	afs_wait_for_operation(op);
179e49c7b2fSDavid Howells 	ret = afs_put_operation(op);
180a58823acSDavid Howells 
181e49c7b2fSDavid Howells 	if (ret == 0) {
182ae46578bSDavid Howells 		switch (which) {
183ae46578bSDavid Howells 		case 0:
184ae46578bSDavid Howells 			data = yacl->acl->data;
185ae46578bSDavid Howells 			dsize = yacl->acl->size;
186ae46578bSDavid Howells 			break;
187ae46578bSDavid Howells 		case 1:
188ae46578bSDavid Howells 			data = buf;
1892e2fae99SMark Salyzyn 			dsize = scnprintf(buf, sizeof(buf), "%u", yacl->inherit_flag);
190ae46578bSDavid Howells 			break;
191ae46578bSDavid Howells 		case 2:
192ae46578bSDavid Howells 			data = buf;
1932e2fae99SMark Salyzyn 			dsize = scnprintf(buf, sizeof(buf), "%u", yacl->num_cleaned);
194ae46578bSDavid Howells 			break;
195ae46578bSDavid Howells 		case 3:
196ae46578bSDavid Howells 			data = yacl->vol_acl->data;
197ae46578bSDavid Howells 			dsize = yacl->vol_acl->size;
198ae46578bSDavid Howells 			break;
199ae46578bSDavid Howells 		default:
200ae46578bSDavid Howells 			ret = -EOPNOTSUPP;
201e49c7b2fSDavid Howells 			goto error_yacl;
202ae46578bSDavid Howells 		}
203ae46578bSDavid Howells 
204ae46578bSDavid Howells 		ret = dsize;
205ae46578bSDavid Howells 		if (size > 0) {
206e49c7b2fSDavid Howells 			if (dsize <= size)
207ae46578bSDavid Howells 				memcpy(buffer, data, dsize);
208e49c7b2fSDavid Howells 			else
209e49c7b2fSDavid Howells 				ret = -ERANGE;
210e49c7b2fSDavid Howells 		}
21164fcbb61SDavid Howells 	} else if (ret == -ENOTSUPP) {
21264fcbb61SDavid Howells 		ret = -ENODATA;
213ae46578bSDavid Howells 	}
214ae46578bSDavid Howells 
215773e0c40SDavid Howells error_yacl:
216773e0c40SDavid Howells 	yfs_free_opaque_acl(yacl);
217773e0c40SDavid Howells error:
218ae46578bSDavid Howells 	return ret;
219ae46578bSDavid Howells }
220ae46578bSDavid Howells 
221e49c7b2fSDavid Howells static const struct afs_operation_ops yfs_store_opaque_acl2_operation = {
222e49c7b2fSDavid Howells 	.issue_yfs_rpc	= yfs_fs_store_opaque_acl2,
223e49c7b2fSDavid Howells 	.success	= afs_acl_success,
224f4c79144SDavid Howells 	.put		= afs_acl_put,
225e49c7b2fSDavid Howells };
226e49c7b2fSDavid Howells 
227f5e45463SDavid Howells /*
228f5e45463SDavid Howells  * Set a file's YFS ACL.
229f5e45463SDavid Howells  */
afs_xattr_set_yfs(const struct xattr_handler * handler,struct mnt_idmap * idmap,struct dentry * dentry,struct inode * inode,const char * name,const void * buffer,size_t size,int flags)230f5e45463SDavid Howells static int afs_xattr_set_yfs(const struct xattr_handler *handler,
231*39f60c1cSChristian Brauner 			     struct mnt_idmap *idmap,
232f5e45463SDavid Howells                              struct dentry *dentry,
233f5e45463SDavid Howells                              struct inode *inode, const char *name,
234f5e45463SDavid Howells                              const void *buffer, size_t size, int flags)
235f5e45463SDavid Howells {
236e49c7b2fSDavid Howells 	struct afs_operation *op;
237f5e45463SDavid Howells 	struct afs_vnode *vnode = AFS_FS_I(inode);
23864fcbb61SDavid Howells 	int ret;
239f5e45463SDavid Howells 
240f5e45463SDavid Howells 	if (flags == XATTR_CREATE ||
241f5e45463SDavid Howells 	    strcmp(name, "acl") != 0)
242f5e45463SDavid Howells 		return -EINVAL;
243f5e45463SDavid Howells 
244e49c7b2fSDavid Howells 	op = afs_alloc_operation(NULL, vnode->volume);
245e49c7b2fSDavid Howells 	if (IS_ERR(op))
246e49c7b2fSDavid Howells 		return -ENOMEM;
247f5e45463SDavid Howells 
248e49c7b2fSDavid Howells 	afs_op_set_vnode(op, 0, vnode);
249e49c7b2fSDavid Howells 	if (!afs_make_acl(op, buffer, size))
250e49c7b2fSDavid Howells 		return afs_put_operation(op);
251f5e45463SDavid Howells 
252e49c7b2fSDavid Howells 	op->ops = &yfs_store_opaque_acl2_operation;
25364fcbb61SDavid Howells 	ret = afs_do_sync_operation(op);
25464fcbb61SDavid Howells 	if (ret == -ENOTSUPP)
25564fcbb61SDavid Howells 		ret = -ENODATA;
25664fcbb61SDavid Howells 	return ret;
257f5e45463SDavid Howells }
258f5e45463SDavid Howells 
259ae46578bSDavid Howells static const struct xattr_handler afs_xattr_yfs_handler = {
260ae46578bSDavid Howells 	.prefix	= "afs.yfs.",
261ae46578bSDavid Howells 	.get	= afs_xattr_get_yfs,
262f5e45463SDavid Howells 	.set	= afs_xattr_set_yfs,
263ae46578bSDavid Howells };
264ae46578bSDavid Howells 
265ae46578bSDavid Howells /*
266d3e3b7eaSDavid Howells  * Get the name of the cell on which a file resides.
267d3e3b7eaSDavid Howells  */
afs_xattr_get_cell(const struct xattr_handler * handler,struct dentry * dentry,struct inode * inode,const char * name,void * buffer,size_t size)268d3e3b7eaSDavid Howells static int afs_xattr_get_cell(const struct xattr_handler *handler,
269d3e3b7eaSDavid Howells 			      struct dentry *dentry,
270d3e3b7eaSDavid Howells 			      struct inode *inode, const char *name,
271d3e3b7eaSDavid Howells 			      void *buffer, size_t size)
272d3e3b7eaSDavid Howells {
273d3e3b7eaSDavid Howells 	struct afs_vnode *vnode = AFS_FS_I(inode);
274d3e3b7eaSDavid Howells 	struct afs_cell *cell = vnode->volume->cell;
275d3e3b7eaSDavid Howells 	size_t namelen;
276d3e3b7eaSDavid Howells 
277989782dcSDavid Howells 	namelen = cell->name_len;
278d3e3b7eaSDavid Howells 	if (size == 0)
279d3e3b7eaSDavid Howells 		return namelen;
280d3e3b7eaSDavid Howells 	if (namelen > size)
281d3e3b7eaSDavid Howells 		return -ERANGE;
282c73aa410SDavid Howells 	memcpy(buffer, cell->name, namelen);
283d3e3b7eaSDavid Howells 	return namelen;
284d3e3b7eaSDavid Howells }
285d3e3b7eaSDavid Howells 
286d3e3b7eaSDavid Howells static const struct xattr_handler afs_xattr_afs_cell_handler = {
287d3e3b7eaSDavid Howells 	.name	= "afs.cell",
288d3e3b7eaSDavid Howells 	.get	= afs_xattr_get_cell,
289d3e3b7eaSDavid Howells };
290d3e3b7eaSDavid Howells 
291d3e3b7eaSDavid Howells /*
292d3e3b7eaSDavid Howells  * Get the volume ID, vnode ID and vnode uniquifier of a file as a sequence of
293d3e3b7eaSDavid Howells  * hex numbers separated by colons.
294d3e3b7eaSDavid Howells  */
afs_xattr_get_fid(const struct xattr_handler * handler,struct dentry * dentry,struct inode * inode,const char * name,void * buffer,size_t size)295d3e3b7eaSDavid Howells static int afs_xattr_get_fid(const struct xattr_handler *handler,
296d3e3b7eaSDavid Howells 			     struct dentry *dentry,
297d3e3b7eaSDavid Howells 			     struct inode *inode, const char *name,
298d3e3b7eaSDavid Howells 			     void *buffer, size_t size)
299d3e3b7eaSDavid Howells {
300d3e3b7eaSDavid Howells 	struct afs_vnode *vnode = AFS_FS_I(inode);
301a2f611a3SDavid Howells 	char text[16 + 1 + 24 + 1 + 8 + 1];
302d3e3b7eaSDavid Howells 	size_t len;
303d3e3b7eaSDavid Howells 
304a2f611a3SDavid Howells 	/* The volume ID is 64-bit, the vnode ID is 96-bit and the
305a2f611a3SDavid Howells 	 * uniquifier is 32-bit.
306a2f611a3SDavid Howells 	 */
3072e2fae99SMark Salyzyn 	len = scnprintf(text, sizeof(text), "%llx:", vnode->fid.vid);
308a2f611a3SDavid Howells 	if (vnode->fid.vnode_hi)
3092e2fae99SMark Salyzyn 		len += scnprintf(text + len, sizeof(text) - len, "%x%016llx",
310a2f611a3SDavid Howells 				vnode->fid.vnode_hi, vnode->fid.vnode);
311a2f611a3SDavid Howells 	else
3122e2fae99SMark Salyzyn 		len += scnprintf(text + len, sizeof(text) - len, "%llx",
3132e2fae99SMark Salyzyn 				 vnode->fid.vnode);
3142e2fae99SMark Salyzyn 	len += scnprintf(text + len, sizeof(text) - len, ":%x",
3152e2fae99SMark Salyzyn 			 vnode->fid.unique);
316a2f611a3SDavid Howells 
317d3e3b7eaSDavid Howells 	if (size == 0)
318d3e3b7eaSDavid Howells 		return len;
319d3e3b7eaSDavid Howells 	if (len > size)
320d3e3b7eaSDavid Howells 		return -ERANGE;
321d3e3b7eaSDavid Howells 	memcpy(buffer, text, len);
322d3e3b7eaSDavid Howells 	return len;
323d3e3b7eaSDavid Howells }
324d3e3b7eaSDavid Howells 
325d3e3b7eaSDavid Howells static const struct xattr_handler afs_xattr_afs_fid_handler = {
326d3e3b7eaSDavid Howells 	.name	= "afs.fid",
327d3e3b7eaSDavid Howells 	.get	= afs_xattr_get_fid,
328d3e3b7eaSDavid Howells };
329d3e3b7eaSDavid Howells 
330d3e3b7eaSDavid Howells /*
331d3e3b7eaSDavid Howells  * Get the name of the volume on which a file resides.
332d3e3b7eaSDavid Howells  */
afs_xattr_get_volume(const struct xattr_handler * handler,struct dentry * dentry,struct inode * inode,const char * name,void * buffer,size_t size)333d3e3b7eaSDavid Howells static int afs_xattr_get_volume(const struct xattr_handler *handler,
334d3e3b7eaSDavid Howells 			      struct dentry *dentry,
335d3e3b7eaSDavid Howells 			      struct inode *inode, const char *name,
336d3e3b7eaSDavid Howells 			      void *buffer, size_t size)
337d3e3b7eaSDavid Howells {
338d3e3b7eaSDavid Howells 	struct afs_vnode *vnode = AFS_FS_I(inode);
339d2ddc776SDavid Howells 	const char *volname = vnode->volume->name;
340d3e3b7eaSDavid Howells 	size_t namelen;
341d3e3b7eaSDavid Howells 
342d3e3b7eaSDavid Howells 	namelen = strlen(volname);
343d3e3b7eaSDavid Howells 	if (size == 0)
344d3e3b7eaSDavid Howells 		return namelen;
345d3e3b7eaSDavid Howells 	if (namelen > size)
346d3e3b7eaSDavid Howells 		return -ERANGE;
347c73aa410SDavid Howells 	memcpy(buffer, volname, namelen);
348d3e3b7eaSDavid Howells 	return namelen;
349d3e3b7eaSDavid Howells }
350d3e3b7eaSDavid Howells 
351d3e3b7eaSDavid Howells static const struct xattr_handler afs_xattr_afs_volume_handler = {
352d3e3b7eaSDavid Howells 	.name	= "afs.volume",
353d3e3b7eaSDavid Howells 	.get	= afs_xattr_get_volume,
354d3e3b7eaSDavid Howells };
355d3e3b7eaSDavid Howells 
356d3e3b7eaSDavid Howells const struct xattr_handler *afs_xattr_handlers[] = {
357260f082bSDavid Howells 	&afs_xattr_afs_acl_handler,
358d3e3b7eaSDavid Howells 	&afs_xattr_afs_cell_handler,
359d3e3b7eaSDavid Howells 	&afs_xattr_afs_fid_handler,
360d3e3b7eaSDavid Howells 	&afs_xattr_afs_volume_handler,
361ae46578bSDavid Howells 	&afs_xattr_yfs_handler,		/* afs.yfs. prefix */
362d3e3b7eaSDavid Howells 	NULL
363d3e3b7eaSDavid Howells };
364