Blame view
fs/generic_acl.c
3.84 KB
f0c8bd164 [PATCH] Generic i... |
1 |
/* |
f0c8bd164 [PATCH] Generic i... |
2 3 4 |
* (C) 2005 Andreas Gruenbacher <agruen@suse.de> * * This file is released under the GPL. |
1c7c474c3 make generic_acl ... |
5 6 |
* * Generic ACL support for in-memory filesystems. |
f0c8bd164 [PATCH] Generic i... |
7 8 9 |
*/ #include <linux/sched.h> |
5a0e3ad6a include cleanup: ... |
10 |
#include <linux/gfp.h> |
f0c8bd164 [PATCH] Generic i... |
11 12 |
#include <linux/fs.h> #include <linux/generic_acl.h> |
1c7c474c3 make generic_acl ... |
13 14 |
#include <linux/posix_acl.h> #include <linux/posix_acl_xattr.h> |
f0c8bd164 [PATCH] Generic i... |
15 |
|
1c7c474c3 make generic_acl ... |
16 17 18 19 |
static size_t generic_acl_list(struct dentry *dentry, char *list, size_t list_size, const char *name, size_t name_len, int type) |
f0c8bd164 [PATCH] Generic i... |
20 21 |
{ struct posix_acl *acl; |
1c7c474c3 make generic_acl ... |
22 |
const char *xname; |
f0c8bd164 [PATCH] Generic i... |
23 |
size_t size; |
1c7c474c3 make generic_acl ... |
24 |
acl = get_cached_acl(dentry->d_inode, type); |
f0c8bd164 [PATCH] Generic i... |
25 26 27 |
if (!acl) return 0; posix_acl_release(acl); |
1c7c474c3 make generic_acl ... |
28 29 30 31 32 33 34 35 36 |
switch (type) { case ACL_TYPE_ACCESS: xname = POSIX_ACL_XATTR_ACCESS; break; case ACL_TYPE_DEFAULT: xname = POSIX_ACL_XATTR_DEFAULT; break; default: return 0; |
f0c8bd164 [PATCH] Generic i... |
37 |
} |
1c7c474c3 make generic_acl ... |
38 |
size = strlen(xname) + 1; |
f0c8bd164 [PATCH] Generic i... |
39 |
if (list && size <= list_size) |
1c7c474c3 make generic_acl ... |
40 |
memcpy(list, xname, size); |
f0c8bd164 [PATCH] Generic i... |
41 42 |
return size; } |
1c7c474c3 make generic_acl ... |
43 44 45 |
static int generic_acl_get(struct dentry *dentry, const char *name, void *buffer, size_t size, int type) |
f0c8bd164 [PATCH] Generic i... |
46 47 48 |
{ struct posix_acl *acl; int error; |
1c7c474c3 make generic_acl ... |
49 50 51 52 |
if (strcmp(name, "") != 0) return -EINVAL; acl = get_cached_acl(dentry->d_inode, type); |
f0c8bd164 [PATCH] Generic i... |
53 54 55 56 57 58 59 |
if (!acl) return -ENODATA; error = posix_acl_to_xattr(acl, buffer, size); posix_acl_release(acl); return error; } |
1c7c474c3 make generic_acl ... |
60 61 62 |
static int generic_acl_set(struct dentry *dentry, const char *name, const void *value, size_t size, int flags, int type) |
f0c8bd164 [PATCH] Generic i... |
63 |
{ |
1c7c474c3 make generic_acl ... |
64 |
struct inode *inode = dentry->d_inode; |
f0c8bd164 [PATCH] Generic i... |
65 66 |
struct posix_acl *acl = NULL; int error; |
1c7c474c3 make generic_acl ... |
67 68 |
if (strcmp(name, "") != 0) return -EINVAL; |
f0c8bd164 [PATCH] Generic i... |
69 70 |
if (S_ISLNK(inode->i_mode)) return -EOPNOTSUPP; |
2e1496707 userns: rename is... |
71 |
if (!inode_owner_or_capable(inode)) |
f0c8bd164 [PATCH] Generic i... |
72 73 74 75 76 77 78 |
return -EPERM; if (value) { acl = posix_acl_from_xattr(value, size); if (IS_ERR(acl)) return PTR_ERR(acl); } if (acl) { |
f0c8bd164 [PATCH] Generic i... |
79 80 81 |
error = posix_acl_valid(acl); if (error) goto failed; |
1c7c474c3 make generic_acl ... |
82 83 |
switch (type) { case ACL_TYPE_ACCESS: |
d6952123b switch posix_acl_... |
84 |
error = posix_acl_equiv_mode(acl, &inode->i_mode); |
1c7c474c3 make generic_acl ... |
85 86 |
if (error < 0) goto failed; |
dad5eb6da vfs: update ctime... |
87 |
inode->i_ctime = CURRENT_TIME; |
1c7c474c3 make generic_acl ... |
88 89 90 91 92 93 94 95 96 97 98 |
if (error == 0) { posix_acl_release(acl); acl = NULL; } break; case ACL_TYPE_DEFAULT: if (!S_ISDIR(inode->i_mode)) { error = -EINVAL; goto failed; } break; |
f0c8bd164 [PATCH] Generic i... |
99 100 |
} } |
1c7c474c3 make generic_acl ... |
101 |
set_cached_acl(inode, type, acl); |
f0c8bd164 [PATCH] Generic i... |
102 103 104 105 106 107 108 109 |
error = 0; failed: posix_acl_release(acl); return error; } /** * generic_acl_init - Take care of acl inheritance at @inode create time |
f0c8bd164 [PATCH] Generic i... |
110 111 112 113 114 |
* * Files created inside a directory with a default ACL inherit the * directory's default ACL. */ int |
1c7c474c3 make generic_acl ... |
115 |
generic_acl_init(struct inode *inode, struct inode *dir) |
f0c8bd164 [PATCH] Generic i... |
116 117 |
{ struct posix_acl *acl = NULL; |
f0c8bd164 [PATCH] Generic i... |
118 |
int error; |
f0c8bd164 [PATCH] Generic i... |
119 |
if (!S_ISLNK(inode->i_mode)) |
1c7c474c3 make generic_acl ... |
120 |
acl = get_cached_acl(dir, ACL_TYPE_DEFAULT); |
f0c8bd164 [PATCH] Generic i... |
121 |
if (acl) { |
95203befa generic_acl: no n... |
122 123 |
if (S_ISDIR(inode->i_mode)) set_cached_acl(inode, ACL_TYPE_DEFAULT, acl); |
d3fb61207 switch posix_acl_... |
124 |
error = posix_acl_create(&acl, GFP_KERNEL, &inode->i_mode); |
826cae2f2 kill boilerplates... |
125 126 |
if (error < 0) return error; |
826cae2f2 kill boilerplates... |
127 128 |
if (error > 0) set_cached_acl(inode, ACL_TYPE_ACCESS, acl); |
d3fb61207 switch posix_acl_... |
129 130 |
} else { inode->i_mode &= ~current_umask(); |
f0c8bd164 [PATCH] Generic i... |
131 132 |
} error = 0; |
f0c8bd164 [PATCH] Generic i... |
133 134 135 136 137 138 |
posix_acl_release(acl); return error; } /** * generic_acl_chmod - change the access acl of @inode upon chmod() |
f0c8bd164 [PATCH] Generic i... |
139 140 141 142 143 |
* * A chmod also changes the permissions of the owner, group/mask, and * other ACL entries. */ int |
1c7c474c3 make generic_acl ... |
144 |
generic_acl_chmod(struct inode *inode) |
f0c8bd164 [PATCH] Generic i... |
145 |
{ |
bc26ab5f6 kill boilerplate ... |
146 |
struct posix_acl *acl; |
f0c8bd164 [PATCH] Generic i... |
147 148 149 150 |
int error = 0; if (S_ISLNK(inode->i_mode)) return -EOPNOTSUPP; |
1c7c474c3 make generic_acl ... |
151 |
acl = get_cached_acl(inode, ACL_TYPE_ACCESS); |
f0c8bd164 [PATCH] Generic i... |
152 |
if (acl) { |
bc26ab5f6 kill boilerplate ... |
153 154 155 156 |
error = posix_acl_chmod(&acl, GFP_KERNEL, inode->i_mode); if (error) return error; set_cached_acl(inode, ACL_TYPE_ACCESS, acl); |
f0c8bd164 [PATCH] Generic i... |
157 |
posix_acl_release(acl); |
f0c8bd164 [PATCH] Generic i... |
158 159 160 |
} return error; } |
1c7c474c3 make generic_acl ... |
161 |
|
bb4354538 fs: xattr_handler... |
162 |
const struct xattr_handler generic_acl_access_handler = { |
1c7c474c3 make generic_acl ... |
163 164 165 166 167 168 |
.prefix = POSIX_ACL_XATTR_ACCESS, .flags = ACL_TYPE_ACCESS, .list = generic_acl_list, .get = generic_acl_get, .set = generic_acl_set, }; |
bb4354538 fs: xattr_handler... |
169 |
const struct xattr_handler generic_acl_default_handler = { |
1c7c474c3 make generic_acl ... |
170 171 172 173 174 175 |
.prefix = POSIX_ACL_XATTR_DEFAULT, .flags = ACL_TYPE_DEFAULT, .list = generic_acl_list, .get = generic_acl_get, .set = generic_acl_set, }; |