4 * (C) 2005 Andreas Gruenbacher <agruen@suse.de>
6 * This file is released under the GPL.
10 #include <linux/shmem_fs.h>
11 #include <linux/xattr.h>
12 #include <linux/generic_acl.h>
15 * shmem_get_acl - generic_acl_operations->getacl() operation
17 static struct posix_acl
*
18 shmem_get_acl(struct inode
*inode
, int type
)
20 struct posix_acl
*acl
= NULL
;
22 spin_lock(&inode
->i_lock
);
25 acl
= posix_acl_dup(inode
->i_acl
);
28 case ACL_TYPE_DEFAULT
:
29 acl
= posix_acl_dup(inode
->i_default_acl
);
32 spin_unlock(&inode
->i_lock
);
38 * shmem_set_acl - generic_acl_operations->setacl() operation
41 shmem_set_acl(struct inode
*inode
, int type
, struct posix_acl
*acl
)
43 struct posix_acl
*free
= NULL
;
45 spin_lock(&inode
->i_lock
);
49 inode
->i_acl
= posix_acl_dup(acl
);
52 case ACL_TYPE_DEFAULT
:
53 free
= inode
->i_default_acl
;
54 inode
->i_default_acl
= posix_acl_dup(acl
);
57 spin_unlock(&inode
->i_lock
);
58 posix_acl_release(free
);
61 struct generic_acl_operations shmem_acl_ops
= {
62 .getacl
= shmem_get_acl
,
63 .setacl
= shmem_set_acl
,
67 shmem_xattr_list_acl(struct dentry
*dentry
, char *list
, size_t list_size
,
68 const char *name
, size_t name_len
, int type
)
70 return generic_acl_list(dentry
->d_inode
, &shmem_acl_ops
,
71 type
, list
, list_size
);
75 shmem_xattr_get_acl(struct dentry
*dentry
, const char *name
, void *buffer
,
76 size_t size
, int type
)
78 if (strcmp(name
, "") != 0)
80 return generic_acl_get(dentry
->d_inode
, &shmem_acl_ops
, type
,
85 shmem_xattr_set_acl(struct dentry
*dentry
, const char *name
, const void *value
,
86 size_t size
, int flags
, int type
)
88 if (strcmp(name
, "") != 0)
90 return generic_acl_set(dentry
->d_inode
, &shmem_acl_ops
, type
,
94 struct xattr_handler shmem_xattr_acl_access_handler
= {
95 .prefix
= POSIX_ACL_XATTR_ACCESS
,
96 .flags
= ACL_TYPE_ACCESS
,
97 .list
= shmem_xattr_list_acl
,
98 .get
= shmem_xattr_get_acl
,
99 .set
= shmem_xattr_set_acl
,
102 struct xattr_handler shmem_xattr_acl_default_handler
= {
103 .prefix
= POSIX_ACL_XATTR_DEFAULT
,
104 .flags
= ACL_TYPE_DEFAULT
,
105 .list
= shmem_xattr_list_acl
,
106 .get
= shmem_xattr_get_acl
,
107 .set
= shmem_xattr_set_acl
,
111 * shmem_acl_init - Inizialize the acl(s) of a new inode
114 shmem_acl_init(struct inode
*inode
, struct inode
*dir
)
116 return generic_acl_init(inode
, dir
, &shmem_acl_ops
);
120 * shmem_check_acl - check_acl() callback for generic_permission()
123 shmem_check_acl(struct inode
*inode
, int mask
)
125 struct posix_acl
*acl
= shmem_get_acl(inode
, ACL_TYPE_ACCESS
);
128 int error
= posix_acl_permission(inode
, acl
, mask
);
129 posix_acl_release(acl
);