Blame view

fs/ocfs2/acl.c 11.3 KB
929fb014e   Tiger Yang   ocfs2: add POSIX ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  /* -*- mode: c; c-basic-offset: 8; -*-
   * vim: noexpandtab sw=8 ts=8 sts=0:
   *
   * acl.c
   *
   * Copyright (C) 2004, 2008 Oracle.  All rights reserved.
   *
   * CREDITS:
   * Lots of code in this file is copy from linux/fs/ext3/acl.c.
   * Copyright (C) 2001-2003 Andreas Gruenbacher, <agruen@suse.de>
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public
   * License version 2 as published by the Free Software Foundation.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * General Public License for more details.
   */
  
  #include <linux/init.h>
  #include <linux/module.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
24
  #include <linux/slab.h>
929fb014e   Tiger Yang   ocfs2: add POSIX ...
25
  #include <linux/string.h>
929fb014e   Tiger Yang   ocfs2: add POSIX ...
26
27
28
29
30
31
  #include <cluster/masklog.h>
  
  #include "ocfs2.h"
  #include "alloc.h"
  #include "dlmglue.h"
  #include "file.h"
fcefd25ac   Mark Fasheh   ocfs2: set i_mode...
32
33
  #include "inode.h"
  #include "journal.h"
929fb014e   Tiger Yang   ocfs2: add POSIX ...
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
  #include "ocfs2_fs.h"
  
  #include "xattr.h"
  #include "acl.h"
  
  /*
   * Convert from xattr value to acl struct.
   */
  static struct posix_acl *ocfs2_acl_from_xattr(const void *value, size_t size)
  {
  	int n, count;
  	struct posix_acl *acl;
  
  	if (!value)
  		return NULL;
  	if (size < sizeof(struct posix_acl_entry))
  		return ERR_PTR(-EINVAL);
  
  	count = size / sizeof(struct posix_acl_entry);
  	if (count < 0)
  		return ERR_PTR(-EINVAL);
  	if (count == 0)
  		return NULL;
  
  	acl = posix_acl_alloc(count, GFP_NOFS);
  	if (!acl)
  		return ERR_PTR(-ENOMEM);
  	for (n = 0; n < count; n++) {
  		struct ocfs2_acl_entry *entry =
  			(struct ocfs2_acl_entry *)value;
  
  		acl->a_entries[n].e_tag  = le16_to_cpu(entry->e_tag);
  		acl->a_entries[n].e_perm = le16_to_cpu(entry->e_perm);
  		acl->a_entries[n].e_id   = le32_to_cpu(entry->e_id);
  		value += sizeof(struct posix_acl_entry);
  
  	}
  	return acl;
  }
  
  /*
   * Convert acl struct to xattr value.
   */
  static void *ocfs2_acl_to_xattr(const struct posix_acl *acl, size_t *size)
  {
  	struct ocfs2_acl_entry *entry = NULL;
  	char *ocfs2_acl;
  	size_t n;
  
  	*size = acl->a_count * sizeof(struct posix_acl_entry);
  
  	ocfs2_acl = kmalloc(*size, GFP_NOFS);
  	if (!ocfs2_acl)
  		return ERR_PTR(-ENOMEM);
  
  	entry = (struct ocfs2_acl_entry *)ocfs2_acl;
  	for (n = 0; n < acl->a_count; n++, entry++) {
  		entry->e_tag  = cpu_to_le16(acl->a_entries[n].e_tag);
  		entry->e_perm = cpu_to_le16(acl->a_entries[n].e_perm);
  		entry->e_id   = cpu_to_le32(acl->a_entries[n].e_id);
  	}
  	return ocfs2_acl;
  }
  
  static struct posix_acl *ocfs2_get_acl_nolock(struct inode *inode,
  					      int type,
  					      struct buffer_head *di_bh)
  {
929fb014e   Tiger Yang   ocfs2: add POSIX ...
102
103
104
105
  	int name_index;
  	char *value = NULL;
  	struct posix_acl *acl;
  	int retval;
929fb014e   Tiger Yang   ocfs2: add POSIX ...
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
  	switch (type) {
  	case ACL_TYPE_ACCESS:
  		name_index = OCFS2_XATTR_INDEX_POSIX_ACL_ACCESS;
  		break;
  	case ACL_TYPE_DEFAULT:
  		name_index = OCFS2_XATTR_INDEX_POSIX_ACL_DEFAULT;
  		break;
  	default:
  		return ERR_PTR(-EINVAL);
  	}
  
  	retval = ocfs2_xattr_get_nolock(inode, di_bh, name_index, "", NULL, 0);
  	if (retval > 0) {
  		value = kmalloc(retval, GFP_NOFS);
  		if (!value)
  			return ERR_PTR(-ENOMEM);
  		retval = ocfs2_xattr_get_nolock(inode, di_bh, name_index,
  						"", value, retval);
  	}
  
  	if (retval > 0)
  		acl = ocfs2_acl_from_xattr(value, retval);
  	else if (retval == -ENODATA || retval == 0)
  		acl = NULL;
  	else
  		acl = ERR_PTR(retval);
  
  	kfree(value);
  
  	return acl;
  }
  
  
  /*
   * Get posix acl.
   */
  static struct posix_acl *ocfs2_get_acl(struct inode *inode, int type)
  {
  	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
  	struct buffer_head *di_bh = NULL;
  	struct posix_acl *acl;
  	int ret;
  
  	if (!(osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL))
  		return NULL;
  
  	ret = ocfs2_inode_lock(inode, &di_bh, 0);
  	if (ret < 0) {
  		mlog_errno(ret);
  		acl = ERR_PTR(ret);
  		return acl;
  	}
  
  	acl = ocfs2_get_acl_nolock(inode, type, di_bh);
  
  	ocfs2_inode_unlock(inode, 0);
  
  	brelse(di_bh);
  
  	return acl;
  }
  
  /*
fcefd25ac   Mark Fasheh   ocfs2: set i_mode...
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
   * Helper function to set i_mode in memory and disk. Some call paths
   * will not have di_bh or a journal handle to pass, in which case it
   * will create it's own.
   */
  static int ocfs2_acl_set_mode(struct inode *inode, struct buffer_head *di_bh,
  			      handle_t *handle, umode_t new_mode)
  {
  	int ret, commit_handle = 0;
  	struct ocfs2_dinode *di;
  
  	if (di_bh == NULL) {
  		ret = ocfs2_read_inode_block(inode, &di_bh);
  		if (ret) {
  			mlog_errno(ret);
  			goto out;
  		}
  	} else
  		get_bh(di_bh);
  
  	if (handle == NULL) {
  		handle = ocfs2_start_trans(OCFS2_SB(inode->i_sb),
  					   OCFS2_INODE_UPDATE_CREDITS);
  		if (IS_ERR(handle)) {
  			ret = PTR_ERR(handle);
  			mlog_errno(ret);
  			goto out_brelse;
  		}
  
  		commit_handle = 1;
  	}
  
  	di = (struct ocfs2_dinode *)di_bh->b_data;
  	ret = ocfs2_journal_access_di(handle, INODE_CACHE(inode), di_bh,
  				      OCFS2_JOURNAL_ACCESS_WRITE);
  	if (ret) {
  		mlog_errno(ret);
  		goto out_commit;
  	}
  
  	inode->i_mode = new_mode;
12828061c   Tao Ma   ocfs2: update cti...
209
  	inode->i_ctime = CURRENT_TIME;
fcefd25ac   Mark Fasheh   ocfs2: set i_mode...
210
  	di->i_mode = cpu_to_le16(inode->i_mode);
12828061c   Tao Ma   ocfs2: update cti...
211
212
  	di->i_ctime = cpu_to_le64(inode->i_ctime.tv_sec);
  	di->i_ctime_nsec = cpu_to_le32(inode->i_ctime.tv_nsec);
fcefd25ac   Mark Fasheh   ocfs2: set i_mode...
213
214
215
216
217
218
219
220
221
222
223
224
225
  
  	ocfs2_journal_dirty(handle, di_bh);
  
  out_commit:
  	if (commit_handle)
  		ocfs2_commit_trans(OCFS2_SB(inode->i_sb), handle);
  out_brelse:
  	brelse(di_bh);
  out:
  	return ret;
  }
  
  /*
929fb014e   Tiger Yang   ocfs2: add POSIX ...
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
   * Set the access or default ACL of an inode.
   */
  static int ocfs2_set_acl(handle_t *handle,
  			 struct inode *inode,
  			 struct buffer_head *di_bh,
  			 int type,
  			 struct posix_acl *acl,
  			 struct ocfs2_alloc_context *meta_ac,
  			 struct ocfs2_alloc_context *data_ac)
  {
  	int name_index;
  	void *value = NULL;
  	size_t size = 0;
  	int ret;
  
  	if (S_ISLNK(inode->i_mode))
  		return -EOPNOTSUPP;
  
  	switch (type) {
  	case ACL_TYPE_ACCESS:
  		name_index = OCFS2_XATTR_INDEX_POSIX_ACL_ACCESS;
  		if (acl) {
d6952123b   Al Viro   switch posix_acl_...
248
  			umode_t mode = inode->i_mode;
929fb014e   Tiger Yang   ocfs2: add POSIX ...
249
250
251
252
  			ret = posix_acl_equiv_mode(acl, &mode);
  			if (ret < 0)
  				return ret;
  			else {
929fb014e   Tiger Yang   ocfs2: add POSIX ...
253
254
  				if (ret == 0)
  					acl = NULL;
fcefd25ac   Mark Fasheh   ocfs2: set i_mode...
255
256
257
258
259
  
  				ret = ocfs2_acl_set_mode(inode, di_bh,
  							 handle, mode);
  				if (ret)
  					return ret;
929fb014e   Tiger Yang   ocfs2: add POSIX ...
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
  			}
  		}
  		break;
  	case ACL_TYPE_DEFAULT:
  		name_index = OCFS2_XATTR_INDEX_POSIX_ACL_DEFAULT;
  		if (!S_ISDIR(inode->i_mode))
  			return acl ? -EACCES : 0;
  		break;
  	default:
  		return -EINVAL;
  	}
  
  	if (acl) {
  		value = ocfs2_acl_to_xattr(acl, &size);
  		if (IS_ERR(value))
  			return (int)PTR_ERR(value);
  	}
  
  	if (handle)
  		ret = ocfs2_xattr_set_handle(handle, inode, di_bh, name_index,
  					     "", value, size, 0,
  					     meta_ac, data_ac);
  	else
  		ret = ocfs2_xattr_set(inode, name_index, "", value, size, 0);
  
  	kfree(value);
  
  	return ret;
  }
4e34e719e   Christoph Hellwig   fs: take the ACL ...
289
  struct posix_acl *ocfs2_iop_get_acl(struct inode *inode, int type)
23fc2702b   Tiger Yang   ocfs2: add ocfs2_...
290
  {
b74c79e99   Nick Piggin   fs: provide rcu-w...
291
  	struct ocfs2_super *osb;
845b6cf34   Jiaju Zhang   Fix the nested PR...
292
293
294
  	struct buffer_head *di_bh = NULL;
  	struct posix_acl *acl;
  	int ret = -EAGAIN;
b74c79e99   Nick Piggin   fs: provide rcu-w...
295
  	osb = OCFS2_SB(inode->i_sb);
845b6cf34   Jiaju Zhang   Fix the nested PR...
296
  	if (!(osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL))
4e34e719e   Christoph Hellwig   fs: take the ACL ...
297
  		return NULL;
23fc2702b   Tiger Yang   ocfs2: add ocfs2_...
298

845b6cf34   Jiaju Zhang   Fix the nested PR...
299
  	ret = ocfs2_read_inode_block(inode, &di_bh);
4e34e719e   Christoph Hellwig   fs: take the ACL ...
300
301
  	if (ret < 0)
  		return ERR_PTR(ret);
845b6cf34   Jiaju Zhang   Fix the nested PR...
302

4e34e719e   Christoph Hellwig   fs: take the ACL ...
303
  	acl = ocfs2_get_acl_nolock(inode, type, di_bh);
845b6cf34   Jiaju Zhang   Fix the nested PR...
304
305
  
  	brelse(di_bh);
4e34e719e   Christoph Hellwig   fs: take the ACL ...
306
  	return acl;
23fc2702b   Tiger Yang   ocfs2: add ocfs2_...
307
  }
060bc66dd   Tiger Yang   ocfs2: add ocfs2_...
308
309
310
  int ocfs2_acl_chmod(struct inode *inode)
  {
  	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
bc26ab5f6   Al Viro   kill boilerplate ...
311
  	struct posix_acl *acl;
060bc66dd   Tiger Yang   ocfs2: add ocfs2_...
312
313
314
315
316
317
318
319
320
321
322
  	int ret;
  
  	if (S_ISLNK(inode->i_mode))
  		return -EOPNOTSUPP;
  
  	if (!(osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL))
  		return 0;
  
  	acl = ocfs2_get_acl(inode, ACL_TYPE_ACCESS);
  	if (IS_ERR(acl) || !acl)
  		return PTR_ERR(acl);
bc26ab5f6   Al Viro   kill boilerplate ...
323
324
325
326
327
  	ret = posix_acl_chmod(&acl, GFP_KERNEL, inode->i_mode);
  	if (ret)
  		return ret;
  	ret = ocfs2_set_acl(NULL, inode, NULL, ACL_TYPE_ACCESS,
  			    acl, NULL, NULL);
060bc66dd   Tiger Yang   ocfs2: add ocfs2_...
328
  	posix_acl_release(acl);
060bc66dd   Tiger Yang   ocfs2: add ocfs2_...
329
330
  	return ret;
  }
89c38bd0a   Tiger Yang   ocfs2: add ocfs2_...
331
332
333
334
335
336
337
338
339
340
341
342
343
344
  /*
   * Initialize the ACLs of a new inode. If parent directory has default ACL,
   * then clone to new inode. Called from ocfs2_mknod.
   */
  int ocfs2_init_acl(handle_t *handle,
  		   struct inode *inode,
  		   struct inode *dir,
  		   struct buffer_head *di_bh,
  		   struct buffer_head *dir_bh,
  		   struct ocfs2_alloc_context *meta_ac,
  		   struct ocfs2_alloc_context *data_ac)
  {
  	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
  	struct posix_acl *acl = NULL;
6eda3dd33   Tiger Yang   ocfs2: do not ove...
345
  	int ret = 0, ret2;
d3fb61207   Al Viro   switch posix_acl_...
346
  	umode_t mode;
89c38bd0a   Tiger Yang   ocfs2: add ocfs2_...
347
348
349
350
351
352
353
354
  
  	if (!S_ISLNK(inode->i_mode)) {
  		if (osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL) {
  			acl = ocfs2_get_acl_nolock(dir, ACL_TYPE_DEFAULT,
  						   dir_bh);
  			if (IS_ERR(acl))
  				return PTR_ERR(acl);
  		}
fcefd25ac   Mark Fasheh   ocfs2: set i_mode...
355
356
357
358
359
360
361
362
  		if (!acl) {
  			mode = inode->i_mode & ~current_umask();
  			ret = ocfs2_acl_set_mode(inode, di_bh, handle, mode);
  			if (ret) {
  				mlog_errno(ret);
  				goto cleanup;
  			}
  		}
89c38bd0a   Tiger Yang   ocfs2: add ocfs2_...
363
364
  	}
  	if ((osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL) && acl) {
89c38bd0a   Tiger Yang   ocfs2: add ocfs2_...
365
366
367
368
369
370
371
  		if (S_ISDIR(inode->i_mode)) {
  			ret = ocfs2_set_acl(handle, inode, di_bh,
  					    ACL_TYPE_DEFAULT, acl,
  					    meta_ac, data_ac);
  			if (ret)
  				goto cleanup;
  		}
89c38bd0a   Tiger Yang   ocfs2: add ocfs2_...
372
  		mode = inode->i_mode;
826cae2f2   Al Viro   kill boilerplates...
373
374
375
376
377
378
379
380
381
382
383
384
385
386
  		ret = posix_acl_create(&acl, GFP_NOFS, &mode);
  		if (ret < 0)
  			return ret;
  
  		ret2 = ocfs2_acl_set_mode(inode, di_bh, handle, mode);
  		if (ret2) {
  			mlog_errno(ret2);
  			ret = ret2;
  			goto cleanup;
  		}
  		if (ret > 0) {
  			ret = ocfs2_set_acl(handle, inode,
  					    di_bh, ACL_TYPE_ACCESS,
  					    acl, meta_ac, data_ac);
89c38bd0a   Tiger Yang   ocfs2: add ocfs2_...
387
  		}
89c38bd0a   Tiger Yang   ocfs2: add ocfs2_...
388
389
390
391
392
  	}
  cleanup:
  	posix_acl_release(acl);
  	return ret;
  }
431547b3c   Christoph Hellwig   sanitize xattr ha...
393
  static size_t ocfs2_xattr_list_acl_access(struct dentry *dentry,
929fb014e   Tiger Yang   ocfs2: add POSIX ...
394
395
396
  					  char *list,
  					  size_t list_len,
  					  const char *name,
431547b3c   Christoph Hellwig   sanitize xattr ha...
397
398
  					  size_t name_len,
  					  int type)
929fb014e   Tiger Yang   ocfs2: add POSIX ...
399
  {
431547b3c   Christoph Hellwig   sanitize xattr ha...
400
  	struct ocfs2_super *osb = OCFS2_SB(dentry->d_sb);
929fb014e   Tiger Yang   ocfs2: add POSIX ...
401
402
403
404
405
406
407
408
409
  	const size_t size = sizeof(POSIX_ACL_XATTR_ACCESS);
  
  	if (!(osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL))
  		return 0;
  
  	if (list && size <= list_len)
  		memcpy(list, POSIX_ACL_XATTR_ACCESS, size);
  	return size;
  }
431547b3c   Christoph Hellwig   sanitize xattr ha...
410
  static size_t ocfs2_xattr_list_acl_default(struct dentry *dentry,
929fb014e   Tiger Yang   ocfs2: add POSIX ...
411
412
413
  					   char *list,
  					   size_t list_len,
  					   const char *name,
431547b3c   Christoph Hellwig   sanitize xattr ha...
414
415
  					   size_t name_len,
  					   int type)
929fb014e   Tiger Yang   ocfs2: add POSIX ...
416
  {
431547b3c   Christoph Hellwig   sanitize xattr ha...
417
  	struct ocfs2_super *osb = OCFS2_SB(dentry->d_sb);
929fb014e   Tiger Yang   ocfs2: add POSIX ...
418
419
420
421
422
423
424
425
426
  	const size_t size = sizeof(POSIX_ACL_XATTR_DEFAULT);
  
  	if (!(osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL))
  		return 0;
  
  	if (list && size <= list_len)
  		memcpy(list, POSIX_ACL_XATTR_DEFAULT, size);
  	return size;
  }
431547b3c   Christoph Hellwig   sanitize xattr ha...
427
428
  static int ocfs2_xattr_get_acl(struct dentry *dentry, const char *name,
  		void *buffer, size_t size, int type)
929fb014e   Tiger Yang   ocfs2: add POSIX ...
429
  {
431547b3c   Christoph Hellwig   sanitize xattr ha...
430
  	struct ocfs2_super *osb = OCFS2_SB(dentry->d_sb);
929fb014e   Tiger Yang   ocfs2: add POSIX ...
431
432
  	struct posix_acl *acl;
  	int ret;
431547b3c   Christoph Hellwig   sanitize xattr ha...
433
434
  	if (strcmp(name, "") != 0)
  		return -EINVAL;
929fb014e   Tiger Yang   ocfs2: add POSIX ...
435
436
  	if (!(osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL))
  		return -EOPNOTSUPP;
431547b3c   Christoph Hellwig   sanitize xattr ha...
437
  	acl = ocfs2_get_acl(dentry->d_inode, type);
929fb014e   Tiger Yang   ocfs2: add POSIX ...
438
439
440
441
442
443
444
445
446
  	if (IS_ERR(acl))
  		return PTR_ERR(acl);
  	if (acl == NULL)
  		return -ENODATA;
  	ret = posix_acl_to_xattr(acl, buffer, size);
  	posix_acl_release(acl);
  
  	return ret;
  }
431547b3c   Christoph Hellwig   sanitize xattr ha...
447
448
  static int ocfs2_xattr_set_acl(struct dentry *dentry, const char *name,
  		const void *value, size_t size, int flags, int type)
929fb014e   Tiger Yang   ocfs2: add POSIX ...
449
  {
431547b3c   Christoph Hellwig   sanitize xattr ha...
450
  	struct inode *inode = dentry->d_inode;
929fb014e   Tiger Yang   ocfs2: add POSIX ...
451
452
453
  	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
  	struct posix_acl *acl;
  	int ret = 0;
431547b3c   Christoph Hellwig   sanitize xattr ha...
454
455
  	if (strcmp(name, "") != 0)
  		return -EINVAL;
929fb014e   Tiger Yang   ocfs2: add POSIX ...
456
457
  	if (!(osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL))
  		return -EOPNOTSUPP;
2e1496707   Serge E. Hallyn   userns: rename is...
458
  	if (!inode_owner_or_capable(inode))
929fb014e   Tiger Yang   ocfs2: add POSIX ...
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
  		return -EPERM;
  
  	if (value) {
  		acl = posix_acl_from_xattr(value, size);
  		if (IS_ERR(acl))
  			return PTR_ERR(acl);
  		else if (acl) {
  			ret = posix_acl_valid(acl);
  			if (ret)
  				goto cleanup;
  		}
  	} else
  		acl = NULL;
  
  	ret = ocfs2_set_acl(NULL, inode, NULL, type, acl, NULL, NULL);
  
  cleanup:
  	posix_acl_release(acl);
  	return ret;
  }
537d81ca7   Stephen Hemminger   ocfs: constify xa...
479
  const struct xattr_handler ocfs2_xattr_acl_access_handler = {
929fb014e   Tiger Yang   ocfs2: add POSIX ...
480
  	.prefix	= POSIX_ACL_XATTR_ACCESS,
431547b3c   Christoph Hellwig   sanitize xattr ha...
481
  	.flags	= ACL_TYPE_ACCESS,
929fb014e   Tiger Yang   ocfs2: add POSIX ...
482
  	.list	= ocfs2_xattr_list_acl_access,
431547b3c   Christoph Hellwig   sanitize xattr ha...
483
484
  	.get	= ocfs2_xattr_get_acl,
  	.set	= ocfs2_xattr_set_acl,
929fb014e   Tiger Yang   ocfs2: add POSIX ...
485
  };
537d81ca7   Stephen Hemminger   ocfs: constify xa...
486
  const struct xattr_handler ocfs2_xattr_acl_default_handler = {
929fb014e   Tiger Yang   ocfs2: add POSIX ...
487
  	.prefix	= POSIX_ACL_XATTR_DEFAULT,
431547b3c   Christoph Hellwig   sanitize xattr ha...
488
  	.flags	= ACL_TYPE_DEFAULT,
929fb014e   Tiger Yang   ocfs2: add POSIX ...
489
  	.list	= ocfs2_xattr_list_acl_default,
431547b3c   Christoph Hellwig   sanitize xattr ha...
490
491
  	.get	= ocfs2_xattr_get_acl,
  	.set	= ocfs2_xattr_set_acl,
929fb014e   Tiger Yang   ocfs2: add POSIX ...
492
  };