13 #include <linux/slab.h>
15 #include <linux/ctype.h>
16 #include <linux/sched.h>
33 if (PTR_ERR(key) != -
ENOKEY) {
34 _leave(
" = %ld", PTR_ERR(key));
43 _leave(
" = {%x} [auth]", key_serial(key));
59 for (loop = permits->
count - 1; loop >= 0; loop--)
67 static void afs_dispose_of_permits(
struct rcu_head *
rcu)
87 struct inode *auth_inode;
97 if (IS_ERR(auth_inode))
98 return ERR_CAST(auth_inode);
101 auth_vnode = AFS_FS_I(auth_inode);
102 _leave(
" = {%x}", auth_vnode->
fid.vnode);
137 vnode->
fid.vid, vnode->
fid.vnode, key_serial(key), acl_order);
139 auth_vnode = afs_get_auth_inode(vnode, key);
140 if (IS_ERR(auth_vnode)) {
141 _leave(
" [get error %ld]", PTR_ERR(auth_vnode));
150 sizeof(
struct afs_fid)) != 0) {
158 if (auth_vnode->
acl_order - acl_order > 0) {
165 auth_vnode->
status.anon_access = vnode->
status.anon_access;
166 if (key == vnode->
volume->cell->anonymous_key)
169 xpermits = auth_vnode->
permits;
175 count = xpermits->
count;
177 for (loop = count; loop > 0; loop--) {
178 if (permit->
key == key) {
180 vnode->
status.caller_access;
187 permits =
kmalloc(
sizeof(*permits) +
sizeof(*permit) * (count + 1),
196 _debug(
"key %x access %x",
197 key_serial(key), vnode->
status.caller_access);
200 permits->
count = count + 1;
217 static int afs_check_permit(
struct afs_vnode *vnode,
struct key *key,
227 vnode->
fid.vid, vnode->
fid.vnode, key_serial(key));
229 auth_vnode = afs_get_auth_inode(vnode, key);
230 if (IS_ERR(auth_vnode)) {
232 _leave(
" = %ld", PTR_ERR(auth_vnode));
233 return PTR_ERR(auth_vnode);
239 if (key == auth_vnode->
volume->cell->anonymous_key) {
241 *_access = auth_vnode->
status.anon_access;
249 for (loop = permits->
count; loop > 0; loop--) {
250 if (permit->
key == key) {
265 _debug(
"no valid permit");
275 *_access = vnode->
status.caller_access;
279 _leave(
" = 0 [access %x]", *_access);
290 struct afs_vnode *vnode = AFS_FS_I(inode);
298 _enter(
"{{%x:%u},%lx},%x,",
299 vnode->
fid.vid, vnode->
fid.vnode, vnode->
flags, mask);
303 _leave(
" = %ld [key]", PTR_ERR(key));
317 ret = afs_check_permit(vnode, key, &
access);
322 _debug(
"REQ %x ACC %x on %s",
328 goto permission_denied;
331 goto permission_denied;
336 goto permission_denied;
342 goto permission_denied;
345 goto permission_denied;
348 goto permission_denied;