Blame view
fs/lockd/svcshare.c
2.4 KB
b24413180 License cleanup: ... |
1 |
// SPDX-License-Identifier: GPL-2.0 |
1da177e4c Linux-2.6.12-rc2 |
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
/* * linux/fs/lockd/svcshare.c * * Management of DOS shares. * * Copyright (C) 1996 Olaf Kirch <okir@monad.swb.de> */ #include <linux/time.h> #include <linux/unistd.h> #include <linux/string.h> #include <linux/slab.h> #include <linux/sunrpc/clnt.h> #include <linux/sunrpc/svc.h> #include <linux/lockd/lockd.h> #include <linux/lockd/share.h> static inline int nlm_cmp_owner(struct nlm_share *share, struct xdr_netobj *oh) { return share->s_owner.len == oh->len && !memcmp(share->s_owner.data, oh->data, oh->len); } |
52921e02a [PATCH] lockd end... |
26 |
__be32 |
1da177e4c Linux-2.6.12-rc2 |
27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
nlmsvc_share_file(struct nlm_host *host, struct nlm_file *file, struct nlm_args *argp) { struct nlm_share *share; struct xdr_netobj *oh = &argp->lock.oh; u8 *ohdata; for (share = file->f_shares; share; share = share->s_next) { if (share->s_host == host && nlm_cmp_owner(share, oh)) goto update; if ((argp->fsm_access & share->s_mode) || (argp->fsm_mode & share->s_access )) return nlm_lck_denied; } |
5cbded585 [PATCH] getting r... |
41 |
share = kmalloc(sizeof(*share) + oh->len, |
1da177e4c Linux-2.6.12-rc2 |
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
GFP_KERNEL); if (share == NULL) return nlm_lck_denied_nolocks; /* Copy owner handle */ ohdata = (u8 *) (share + 1); memcpy(ohdata, oh->data, oh->len); share->s_file = file; share->s_host = host; share->s_owner.data = ohdata; share->s_owner.len = oh->len; share->s_next = file->f_shares; file->f_shares = share; update: share->s_access = argp->fsm_access; share->s_mode = argp->fsm_mode; return nlm_granted; } /* * Delete a share. */ |
52921e02a [PATCH] lockd end... |
66 |
__be32 |
1da177e4c Linux-2.6.12-rc2 |
67 68 69 70 71 |
nlmsvc_unshare_file(struct nlm_host *host, struct nlm_file *file, struct nlm_args *argp) { struct nlm_share *share, **shpp; struct xdr_netobj *oh = &argp->lock.oh; |
93245d11f lockd: fix sparse... |
72 73 |
for (shpp = &file->f_shares; (share = *shpp) != NULL; shpp = &share->s_next) { |
1da177e4c Linux-2.6.12-rc2 |
74 75 76 77 78 79 80 81 82 83 84 85 86 |
if (share->s_host == host && nlm_cmp_owner(share, oh)) { *shpp = share->s_next; kfree(share); return nlm_granted; } } /* X/Open spec says return success even if there was no * corresponding share. */ return nlm_granted; } /* |
f2af793db [PATCH] knfsd: lo... |
87 88 |
* Traverse all shares for a given file, and delete * those owned by the given (type of) host |
1da177e4c Linux-2.6.12-rc2 |
89 |
*/ |
f2af793db [PATCH] knfsd: lo... |
90 91 |
void nlmsvc_traverse_shares(struct nlm_host *host, struct nlm_file *file, nlm_host_match_fn_t match) |
1da177e4c Linux-2.6.12-rc2 |
92 93 94 95 96 |
{ struct nlm_share *share, **shpp; shpp = &file->f_shares; while ((share = *shpp) != NULL) { |
f2af793db [PATCH] knfsd: lo... |
97 98 99 100 |
if (match(share->s_host, host)) { *shpp = share->s_next; kfree(share); continue; |
1da177e4c Linux-2.6.12-rc2 |
101 102 103 |
} shpp = &share->s_next; } |
1da177e4c Linux-2.6.12-rc2 |
104 |
} |