Blame view

fs/jffs2/acl.c 8.99 KB
652ecc20d   KaiGai Kohei   [JFFS2][XATTR] Un...
1
2
  /*
   * JFFS2 -- Journalling Flash File System, Version 2.
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
3
   *
c00c310ea   David Woodhouse   [JFFS2] Tidy up l...
4
   * Copyright © 2006  NEC Corporation
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
5
   *
652ecc20d   KaiGai Kohei   [JFFS2][XATTR] Un...
6
7
8
9
10
   * Created by KaiGai Kohei <kaigai@ak.jp.nec.com>
   *
   * For licensing information, see the file 'LICENCE' in this directory.
   *
   */
c00c310ea   David Woodhouse   [JFFS2] Tidy up l...
11

aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
12
13
14
  #include <linux/kernel.h>
  #include <linux/slab.h>
  #include <linux/fs.h>
914e26379   Al Viro   [PATCH] severing ...
15
  #include <linux/sched.h>
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
16
17
18
19
20
21
22
23
24
25
26
  #include <linux/time.h>
  #include <linux/crc32.h>
  #include <linux/jffs2.h>
  #include <linux/xattr.h>
  #include <linux/posix_acl_xattr.h>
  #include <linux/mtd/mtd.h>
  #include "nodelist.h"
  
  static size_t jffs2_acl_size(int count)
  {
  	if (count <= 4) {
de1f72fab   KaiGai Kohei   [JFFS2][XATTR] re...
27
28
  		return sizeof(struct jffs2_acl_header)
  		       + count * sizeof(struct jffs2_acl_entry_short);
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
29
  	} else {
de1f72fab   KaiGai Kohei   [JFFS2][XATTR] re...
30
31
32
  		return sizeof(struct jffs2_acl_header)
  		       + 4 * sizeof(struct jffs2_acl_entry_short)
  		       + (count - 4) * sizeof(struct jffs2_acl_entry);
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
33
34
35
36
37
38
  	}
  }
  
  static int jffs2_acl_count(size_t size)
  {
  	size_t s;
de1f72fab   KaiGai Kohei   [JFFS2][XATTR] re...
39
  	size -= sizeof(struct jffs2_acl_header);
fc371a25e   Roel Kluin   [JFFS2] jffs2_acl...
40
  	if (size < 4 * sizeof(struct jffs2_acl_entry_short)) {
de1f72fab   KaiGai Kohei   [JFFS2][XATTR] re...
41
  		if (size % sizeof(struct jffs2_acl_entry_short))
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
42
  			return -1;
de1f72fab   KaiGai Kohei   [JFFS2][XATTR] re...
43
  		return size / sizeof(struct jffs2_acl_entry_short);
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
44
  	} else {
fc371a25e   Roel Kluin   [JFFS2] jffs2_acl...
45
  		s = size - 4 * sizeof(struct jffs2_acl_entry_short);
de1f72fab   KaiGai Kohei   [JFFS2][XATTR] re...
46
  		if (s % sizeof(struct jffs2_acl_entry))
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
47
  			return -1;
de1f72fab   KaiGai Kohei   [JFFS2][XATTR] re...
48
  		return s / sizeof(struct jffs2_acl_entry) + 4;
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
49
50
  	}
  }
dea80134d   KaiGai Kohei   [JFFS2][XATTR] re...
51
  static struct posix_acl *jffs2_acl_from_medium(void *value, size_t size)
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
52
  {
dea80134d   KaiGai Kohei   [JFFS2][XATTR] re...
53
54
55
  	void *end = value + size;
  	struct jffs2_acl_header *header = value;
  	struct jffs2_acl_entry *entry;
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
56
57
58
59
60
61
  	struct posix_acl *acl;
  	uint32_t ver;
  	int i, count;
  
  	if (!value)
  		return NULL;
de1f72fab   KaiGai Kohei   [JFFS2][XATTR] re...
62
  	if (size < sizeof(struct jffs2_acl_header))
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
63
  		return ERR_PTR(-EINVAL);
dea80134d   KaiGai Kohei   [JFFS2][XATTR] re...
64
  	ver = je32_to_cpu(header->a_version);
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
65
66
67
68
69
  	if (ver != JFFS2_ACL_VERSION) {
  		JFFS2_WARNING("Invalid ACL version. (=%u)
  ", ver);
  		return ERR_PTR(-EINVAL);
  	}
dea80134d   KaiGai Kohei   [JFFS2][XATTR] re...
70
  	value += sizeof(struct jffs2_acl_header);
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
71
72
73
74
75
76
77
78
79
80
81
  	count = jffs2_acl_count(size);
  	if (count < 0)
  		return ERR_PTR(-EINVAL);
  	if (count == 0)
  		return NULL;
  
  	acl = posix_acl_alloc(count, GFP_KERNEL);
  	if (!acl)
  		return ERR_PTR(-ENOMEM);
  
  	for (i=0; i < count; i++) {
dea80134d   KaiGai Kohei   [JFFS2][XATTR] re...
82
83
  		entry = value;
  		if (value + sizeof(struct jffs2_acl_entry_short) > end)
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
84
85
86
87
88
89
90
91
  			goto fail;
  		acl->a_entries[i].e_tag = je16_to_cpu(entry->e_tag);
  		acl->a_entries[i].e_perm = je16_to_cpu(entry->e_perm);
  		switch (acl->a_entries[i].e_tag) {
  			case ACL_USER_OBJ:
  			case ACL_GROUP_OBJ:
  			case ACL_MASK:
  			case ACL_OTHER:
dea80134d   KaiGai Kohei   [JFFS2][XATTR] re...
92
  				value += sizeof(struct jffs2_acl_entry_short);
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
93
94
95
96
97
  				acl->a_entries[i].e_id = ACL_UNDEFINED_ID;
  				break;
  
  			case ACL_USER:
  			case ACL_GROUP:
dea80134d   KaiGai Kohei   [JFFS2][XATTR] re...
98
99
  				value += sizeof(struct jffs2_acl_entry);
  				if (value > end)
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
  					goto fail;
  				acl->a_entries[i].e_id = je32_to_cpu(entry->e_id);
  				break;
  
  			default:
  				goto fail;
  		}
  	}
  	if (value != end)
  		goto fail;
  	return acl;
   fail:
  	posix_acl_release(acl);
  	return ERR_PTR(-EINVAL);
  }
  
  static void *jffs2_acl_to_medium(const struct posix_acl *acl, size_t *size)
  {
dea80134d   KaiGai Kohei   [JFFS2][XATTR] re...
118
119
120
  	struct jffs2_acl_header *header;
  	struct jffs2_acl_entry *entry;
  	void *e;
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
121
122
123
  	size_t i;
  
  	*size = jffs2_acl_size(acl->a_count);
dea80134d   KaiGai Kohei   [JFFS2][XATTR] re...
124
125
  	header = kmalloc(sizeof(*header) + acl->a_count * sizeof(*entry), GFP_KERNEL);
  	if (!header)
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
126
  		return ERR_PTR(-ENOMEM);
dea80134d   KaiGai Kohei   [JFFS2][XATTR] re...
127
128
  	header->a_version = cpu_to_je32(JFFS2_ACL_VERSION);
  	e = header + 1;
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
129
  	for (i=0; i < acl->a_count; i++) {
dea80134d   KaiGai Kohei   [JFFS2][XATTR] re...
130
  		entry = e;
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
131
132
133
134
135
136
  		entry->e_tag = cpu_to_je16(acl->a_entries[i].e_tag);
  		entry->e_perm = cpu_to_je16(acl->a_entries[i].e_perm);
  		switch(acl->a_entries[i].e_tag) {
  			case ACL_USER:
  			case ACL_GROUP:
  				entry->e_id = cpu_to_je32(acl->a_entries[i].e_id);
de1f72fab   KaiGai Kohei   [JFFS2][XATTR] re...
137
  				e += sizeof(struct jffs2_acl_entry);
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
138
139
140
141
142
143
  				break;
  
  			case ACL_USER_OBJ:
  			case ACL_GROUP_OBJ:
  			case ACL_MASK:
  			case ACL_OTHER:
de1f72fab   KaiGai Kohei   [JFFS2][XATTR] re...
144
  				e += sizeof(struct jffs2_acl_entry_short);
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
145
146
147
148
149
150
  				break;
  
  			default:
  				goto fail;
  		}
  	}
dea80134d   KaiGai Kohei   [JFFS2][XATTR] re...
151
  	return header;
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
152
   fail:
dea80134d   KaiGai Kohei   [JFFS2][XATTR] re...
153
  	kfree(header);
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
154
155
  	return ERR_PTR(-EINVAL);
  }
4e34e719e   Christoph Hellwig   fs: take the ACL ...
156
  struct posix_acl *jffs2_get_acl(struct inode *inode, int type)
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
157
  {
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
158
159
160
  	struct posix_acl *acl;
  	char *value = NULL;
  	int rc, xprefix;
073aaa1b1   Al Viro   helpers for acl c...
161
162
163
  	acl = get_cached_acl(inode, type);
  	if (acl != ACL_NOT_CACHED)
  		return acl;
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
164
165
  	switch (type) {
  	case ACL_TYPE_ACCESS:
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
166
167
168
  		xprefix = JFFS2_XPREFIX_ACL_ACCESS;
  		break;
  	case ACL_TYPE_DEFAULT:
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
169
170
171
  		xprefix = JFFS2_XPREFIX_ACL_DEFAULT;
  		break;
  	default:
073aaa1b1   Al Viro   helpers for acl c...
172
  		BUG();
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
  	}
  	rc = do_jffs2_getxattr(inode, xprefix, "", NULL, 0);
  	if (rc > 0) {
  		value = kmalloc(rc, GFP_KERNEL);
  		if (!value)
  			return ERR_PTR(-ENOMEM);
  		rc = do_jffs2_getxattr(inode, xprefix, "", value, rc);
  	}
  	if (rc > 0) {
  		acl = jffs2_acl_from_medium(value, rc);
  	} else if (rc == -ENODATA || rc == -ENOSYS) {
  		acl = NULL;
  	} else {
  		acl = ERR_PTR(rc);
  	}
  	if (value)
  		kfree(value);
073aaa1b1   Al Viro   helpers for acl c...
190
191
  	if (!IS_ERR(acl))
  		set_cached_acl(inode, type, acl);
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
192
193
  	return acl;
  }
cfc8dc6f6   KaiGai Kohei   [JFFS2] Tidy up f...
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
  static int __jffs2_set_acl(struct inode *inode, int xprefix, struct posix_acl *acl)
  {
  	char *value = NULL;
  	size_t size = 0;
  	int rc;
  
  	if (acl) {
  		value = jffs2_acl_to_medium(acl, &size);
  		if (IS_ERR(value))
  			return PTR_ERR(value);
  	}
  	rc = do_jffs2_setxattr(inode, xprefix, "", value, size, 0);
  	if (!value && rc == -ENODATA)
  		rc = 0;
  	kfree(value);
  
  	return rc;
  }
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
212
213
  static int jffs2_set_acl(struct inode *inode, int type, struct posix_acl *acl)
  {
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
214
215
216
217
218
219
220
221
222
  	int rc, xprefix;
  
  	if (S_ISLNK(inode->i_mode))
  		return -EOPNOTSUPP;
  
  	switch (type) {
  	case ACL_TYPE_ACCESS:
  		xprefix = JFFS2_XPREFIX_ACL_ACCESS;
  		if (acl) {
d6952123b   Al Viro   switch posix_acl_...
223
  			umode_t mode = inode->i_mode;
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
224
225
226
227
  			rc = posix_acl_equiv_mode(acl, &mode);
  			if (rc < 0)
  				return rc;
  			if (inode->i_mode != mode) {
9ed437c50   David Woodhouse   [JFFS2] Fix ACL v...
228
  				struct iattr attr;
1c24d06f8   Jan Kara   jffs2: update cti...
229
  				attr.ia_valid = ATTR_MODE | ATTR_CTIME;
9ed437c50   David Woodhouse   [JFFS2] Fix ACL v...
230
  				attr.ia_mode = mode;
1c24d06f8   Jan Kara   jffs2: update cti...
231
  				attr.ia_ctime = CURRENT_TIME_SEC;
9ed437c50   David Woodhouse   [JFFS2] Fix ACL v...
232
233
234
  				rc = jffs2_do_setattr(inode, &attr);
  				if (rc < 0)
  					return rc;
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
235
236
237
238
239
240
241
242
243
244
245
246
247
  			}
  			if (rc == 0)
  				acl = NULL;
  		}
  		break;
  	case ACL_TYPE_DEFAULT:
  		xprefix = JFFS2_XPREFIX_ACL_DEFAULT;
  		if (!S_ISDIR(inode->i_mode))
  			return acl ? -EACCES : 0;
  		break;
  	default:
  		return -EINVAL;
  	}
cfc8dc6f6   KaiGai Kohei   [JFFS2] Tidy up f...
248
  	rc = __jffs2_set_acl(inode, xprefix, acl);
073aaa1b1   Al Viro   helpers for acl c...
249
250
  	if (!rc)
  		set_cached_acl(inode, type, acl);
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
251
252
  	return rc;
  }
d3fb61207   Al Viro   switch posix_acl_...
253
  int jffs2_init_acl_pre(struct inode *dir_i, struct inode *inode, umode_t *i_mode)
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
254
  {
826cae2f2   Al Viro   kill boilerplates...
255
  	struct posix_acl *acl;
cfc8dc6f6   KaiGai Kohei   [JFFS2] Tidy up f...
256
  	int rc;
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
257

72c04902d   Al Viro   Get "no acls for ...
258
  	cache_no_acl(inode);
cfc8dc6f6   KaiGai Kohei   [JFFS2] Tidy up f...
259
260
261
262
263
264
265
266
267
  
  	if (S_ISLNK(*i_mode))
  		return 0;	/* Symlink always has no-ACL */
  
  	acl = jffs2_get_acl(dir_i, ACL_TYPE_DEFAULT);
  	if (IS_ERR(acl))
  		return PTR_ERR(acl);
  
  	if (!acl) {
ce3b0f8d5   Al Viro   New helper - curr...
268
  		*i_mode &= ~current_umask();
cfc8dc6f6   KaiGai Kohei   [JFFS2] Tidy up f...
269
270
  	} else {
  		if (S_ISDIR(*i_mode))
073aaa1b1   Al Viro   helpers for acl c...
271
  			set_cached_acl(inode, ACL_TYPE_DEFAULT, acl);
9ed437c50   David Woodhouse   [JFFS2] Fix ACL v...
272

826cae2f2   Al Viro   kill boilerplates...
273
274
  		rc = posix_acl_create(&acl, GFP_KERNEL, i_mode);
  		if (rc < 0)
cfc8dc6f6   KaiGai Kohei   [JFFS2] Tidy up f...
275
276
  			return rc;
  		if (rc > 0)
826cae2f2   Al Viro   kill boilerplates...
277
  			set_cached_acl(inode, ACL_TYPE_ACCESS, acl);
cfc8dc6f6   KaiGai Kohei   [JFFS2] Tidy up f...
278

826cae2f2   Al Viro   kill boilerplates...
279
  		posix_acl_release(acl);
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
280
  	}
cfc8dc6f6   KaiGai Kohei   [JFFS2] Tidy up f...
281
282
283
284
285
  	return 0;
  }
  
  int jffs2_init_acl_post(struct inode *inode)
  {
cfc8dc6f6   KaiGai Kohei   [JFFS2] Tidy up f...
286
  	int rc;
290c263bf   Al Viro   switch jffs2 to i...
287
288
  	if (inode->i_default_acl) {
  		rc = __jffs2_set_acl(inode, JFFS2_XPREFIX_ACL_DEFAULT, inode->i_default_acl);
cfc8dc6f6   KaiGai Kohei   [JFFS2] Tidy up f...
289
290
291
  		if (rc)
  			return rc;
  	}
290c263bf   Al Viro   switch jffs2 to i...
292
293
  	if (inode->i_acl) {
  		rc = __jffs2_set_acl(inode, JFFS2_XPREFIX_ACL_ACCESS, inode->i_acl);
cfc8dc6f6   KaiGai Kohei   [JFFS2] Tidy up f...
294
295
296
  		if (rc)
  			return rc;
  	}
8d6ea587d   David Woodhouse   [JFFS2] Prevent r...
297
  	return 0;
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
298
  }
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
299
300
  int jffs2_acl_chmod(struct inode *inode)
  {
bc26ab5f6   Al Viro   kill boilerplate ...
301
  	struct posix_acl *acl;
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
302
303
304
305
306
307
308
  	int rc;
  
  	if (S_ISLNK(inode->i_mode))
  		return -EOPNOTSUPP;
  	acl = jffs2_get_acl(inode, ACL_TYPE_ACCESS);
  	if (IS_ERR(acl) || !acl)
  		return PTR_ERR(acl);
bc26ab5f6   Al Viro   kill boilerplate ...
309
310
311
312
  	rc = posix_acl_chmod(&acl, GFP_KERNEL, inode->i_mode);
  	if (rc)
  		return rc;
  	rc = jffs2_set_acl(inode, ACL_TYPE_ACCESS, acl);
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
313
  	posix_acl_release(acl);
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
314
315
  	return rc;
  }
431547b3c   Christoph Hellwig   sanitize xattr ha...
316
317
  static size_t jffs2_acl_access_listxattr(struct dentry *dentry, char *list,
  		size_t list_size, const char *name, size_t name_len, int type)
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
318
319
320
321
322
323
324
  {
  	const int retlen = sizeof(POSIX_ACL_XATTR_ACCESS);
  
  	if (list && retlen <= list_size)
  		strcpy(list, POSIX_ACL_XATTR_ACCESS);
  	return retlen;
  }
431547b3c   Christoph Hellwig   sanitize xattr ha...
325
326
  static size_t jffs2_acl_default_listxattr(struct dentry *dentry, char *list,
  		size_t list_size, const char *name, size_t name_len, int type)
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
327
328
329
330
331
332
333
  {
  	const int retlen = sizeof(POSIX_ACL_XATTR_DEFAULT);
  
  	if (list && retlen <= list_size)
  		strcpy(list, POSIX_ACL_XATTR_DEFAULT);
  	return retlen;
  }
431547b3c   Christoph Hellwig   sanitize xattr ha...
334
335
  static int jffs2_acl_getxattr(struct dentry *dentry, const char *name,
  		void *buffer, size_t size, int type)
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
336
337
338
  {
  	struct posix_acl *acl;
  	int rc;
431547b3c   Christoph Hellwig   sanitize xattr ha...
339
340
341
342
  	if (name[0] != '\0')
  		return -EINVAL;
  
  	acl = jffs2_get_acl(dentry->d_inode, type);
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
343
344
345
346
347
348
349
350
351
  	if (IS_ERR(acl))
  		return PTR_ERR(acl);
  	if (!acl)
  		return -ENODATA;
  	rc = posix_acl_to_xattr(acl, buffer, size);
  	posix_acl_release(acl);
  
  	return rc;
  }
431547b3c   Christoph Hellwig   sanitize xattr ha...
352
353
  static int jffs2_acl_setxattr(struct dentry *dentry, const char *name,
  		const void *value, size_t size, int flags, int type)
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
354
355
356
  {
  	struct posix_acl *acl;
  	int rc;
431547b3c   Christoph Hellwig   sanitize xattr ha...
357
358
  	if (name[0] != '\0')
  		return -EINVAL;
2e1496707   Serge E. Hallyn   userns: rename is...
359
  	if (!inode_owner_or_capable(dentry->d_inode))
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
360
361
362
363
364
365
366
367
368
369
370
371
372
373
  		return -EPERM;
  
  	if (value) {
  		acl = posix_acl_from_xattr(value, size);
  		if (IS_ERR(acl))
  			return PTR_ERR(acl);
  		if (acl) {
  			rc = posix_acl_valid(acl);
  			if (rc)
  				goto out;
  		}
  	} else {
  		acl = NULL;
  	}
431547b3c   Christoph Hellwig   sanitize xattr ha...
374
  	rc = jffs2_set_acl(dentry->d_inode, type, acl);
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
375
376
377
378
   out:
  	posix_acl_release(acl);
  	return rc;
  }
365f0cb9d   Stephen Hemminger   jffs2: constify x...
379
  const struct xattr_handler jffs2_acl_access_xattr_handler = {
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
380
  	.prefix	= POSIX_ACL_XATTR_ACCESS,
431547b3c   Christoph Hellwig   sanitize xattr ha...
381
  	.flags	= ACL_TYPE_DEFAULT,
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
382
  	.list	= jffs2_acl_access_listxattr,
431547b3c   Christoph Hellwig   sanitize xattr ha...
383
384
  	.get	= jffs2_acl_getxattr,
  	.set	= jffs2_acl_setxattr,
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
385
  };
365f0cb9d   Stephen Hemminger   jffs2: constify x...
386
  const struct xattr_handler jffs2_acl_default_xattr_handler = {
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
387
  	.prefix	= POSIX_ACL_XATTR_DEFAULT,
431547b3c   Christoph Hellwig   sanitize xattr ha...
388
  	.flags	= ACL_TYPE_DEFAULT,
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
389
  	.list	= jffs2_acl_default_listxattr,
431547b3c   Christoph Hellwig   sanitize xattr ha...
390
391
  	.get	= jffs2_acl_getxattr,
  	.set	= jffs2_acl_setxattr,
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
392
  };