puffs_subr.c revision 1.22.2.14 1 1.22.2.14 ad /* $NetBSD: puffs_subr.c,v 1.22.2.14 2007/10/12 17:03:17 ad Exp $ */
2 1.1 pooka
3 1.1 pooka /*
4 1.22.2.12 ad * Copyright (c) 2006, 2007 Antti Kantee. All Rights Reserved.
5 1.1 pooka *
6 1.1 pooka * Development of this software was supported by the
7 1.22.2.12 ad * Ulla Tuominen Foundation and the Finnish Cultural Foundation.
8 1.1 pooka *
9 1.1 pooka * Redistribution and use in source and binary forms, with or without
10 1.1 pooka * modification, are permitted provided that the following conditions
11 1.1 pooka * are met:
12 1.1 pooka * 1. Redistributions of source code must retain the above copyright
13 1.1 pooka * notice, this list of conditions and the following disclaimer.
14 1.1 pooka * 2. Redistributions in binary form must reproduce the above copyright
15 1.1 pooka * notice, this list of conditions and the following disclaimer in the
16 1.1 pooka * documentation and/or other materials provided with the distribution.
17 1.1 pooka *
18 1.1 pooka * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
19 1.1 pooka * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 1.1 pooka * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 1.1 pooka * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22 1.1 pooka * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 1.1 pooka * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24 1.1 pooka * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 1.1 pooka * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 1.1 pooka * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 1.1 pooka * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 1.1 pooka * SUCH DAMAGE.
29 1.1 pooka */
30 1.1 pooka
31 1.1 pooka #include <sys/cdefs.h>
32 1.22.2.14 ad __KERNEL_RCSID(0, "$NetBSD: puffs_subr.c,v 1.22.2.14 2007/10/12 17:03:17 ad Exp $");
33 1.1 pooka
34 1.1 pooka #include <sys/param.h>
35 1.1 pooka #include <sys/malloc.h>
36 1.1 pooka #include <sys/mount.h>
37 1.22.2.5 ad #include <sys/namei.h>
38 1.22.2.5 ad #include <sys/poll.h>
39 1.22.2.3 ad #include <sys/proc.h>
40 1.1 pooka
41 1.1 pooka #include <fs/puffs/puffs_msgif.h>
42 1.1 pooka #include <fs/puffs/puffs_sys.h>
43 1.1 pooka
44 1.19 pooka #ifdef PUFFSDEBUG
45 1.10 pooka int puffsdebug;
46 1.10 pooka #endif
47 1.10 pooka
48 1.1 pooka void
49 1.22.2.8 ad puffs_makecn(struct puffs_kcn *pkcn, struct puffs_kcred *pkcr,
50 1.22.2.8 ad struct puffs_kcid *pkcid, const struct componentname *cn, int full)
51 1.1 pooka {
52 1.1 pooka
53 1.12 pooka pkcn->pkcn_nameiop = cn->cn_nameiop;
54 1.12 pooka pkcn->pkcn_flags = cn->cn_flags;
55 1.22.2.8 ad puffs_cidcvt(pkcid, cn->cn_lwp);
56 1.1 pooka
57 1.22.2.8 ad if (full) {
58 1.22.2.8 ad (void)strcpy(pkcn->pkcn_name, cn->cn_nameptr);
59 1.22.2.8 ad } else {
60 1.22.2.8 ad (void)memcpy(pkcn->pkcn_name, cn->cn_nameptr, cn->cn_namelen);
61 1.22.2.8 ad pkcn->pkcn_name[cn->cn_namelen] = '\0';
62 1.22.2.8 ad }
63 1.12 pooka pkcn->pkcn_namelen = cn->cn_namelen;
64 1.22.2.8 ad pkcn->pkcn_consume = 0;
65 1.22.2.8 ad
66 1.22.2.8 ad puffs_credcvt(pkcr, cn->cn_cred);
67 1.1 pooka }
68 1.1 pooka
69 1.1 pooka /*
70 1.22.2.8 ad * Convert given credentials to struct puffs_kcred for userspace.
71 1.1 pooka */
72 1.1 pooka void
73 1.22.2.8 ad puffs_credcvt(struct puffs_kcred *pkcr, const kauth_cred_t cred)
74 1.1 pooka {
75 1.1 pooka
76 1.22.2.8 ad memset(pkcr, 0, sizeof(struct puffs_kcred));
77 1.1 pooka
78 1.1 pooka if (cred == NOCRED || cred == FSCRED) {
79 1.22.2.8 ad pkcr->pkcr_type = PUFFCRED_TYPE_INTERNAL;
80 1.1 pooka if (cred == NOCRED)
81 1.22.2.8 ad pkcr->pkcr_internal = PUFFCRED_CRED_NOCRED;
82 1.1 pooka if (cred == FSCRED)
83 1.22.2.8 ad pkcr->pkcr_internal = PUFFCRED_CRED_FSCRED;
84 1.1 pooka } else {
85 1.22.2.8 ad pkcr->pkcr_type = PUFFCRED_TYPE_UUC;
86 1.22.2.8 ad kauth_cred_to_uucred(&pkcr->pkcr_uuc, cred);
87 1.1 pooka }
88 1.1 pooka }
89 1.1 pooka
90 1.22.2.8 ad void
91 1.22.2.8 ad puffs_cidcvt(struct puffs_kcid *pkcid, const struct lwp *l)
92 1.1 pooka {
93 1.1 pooka
94 1.22.2.8 ad if (l) {
95 1.22.2.8 ad pkcid->pkcid_type = PUFFCID_TYPE_REAL;
96 1.22.2.8 ad pkcid->pkcid_pid = l->l_proc->p_pid;
97 1.22.2.8 ad pkcid->pkcid_lwpid = l->l_lid;
98 1.22.2.8 ad } else {
99 1.22.2.8 ad pkcid->pkcid_type = PUFFCID_TYPE_FAKE;
100 1.22.2.8 ad pkcid->pkcid_pid = 0;
101 1.22.2.8 ad pkcid->pkcid_lwpid = 0;
102 1.22.2.8 ad }
103 1.1 pooka }
104 1.7 pooka
105 1.11 pooka void
106 1.22.2.12 ad puffs_parkdone_asyncbioread(struct puffs_mount *pmp,
107 1.22.2.12 ad struct puffs_req *preq, void *arg)
108 1.11 pooka {
109 1.22.2.14 ad struct puffs_vnmsg_read *read_msg = (void *)preq;
110 1.22.2.4 ad struct buf *bp = arg;
111 1.22.2.4 ad size_t moved;
112 1.22.2.4 ad
113 1.22.2.12 ad bp->b_error = checkerr(pmp, preq->preq_rv, __func__);
114 1.22.2.9 ad if (bp->b_error == 0) {
115 1.22.2.14 ad moved = bp->b_bcount - read_msg->pvnr_resid;
116 1.22.2.14 ad bp->b_resid = read_msg->pvnr_resid;
117 1.22.2.9 ad
118 1.22.2.14 ad memcpy(bp->b_data, read_msg->pvnr_data, moved);
119 1.22.2.9 ad }
120 1.22 pooka
121 1.22.2.9 ad biodone(bp);
122 1.22 pooka }
123 1.22.2.5 ad
124 1.22.2.10 ad /* XXX: userspace can leak kernel resources */
125 1.22.2.5 ad void
126 1.22.2.12 ad puffs_parkdone_poll(struct puffs_mount *pmp, struct puffs_req *preq, void *arg)
127 1.22.2.5 ad {
128 1.22.2.14 ad struct puffs_vnmsg_poll *poll_msg = (void *)preq;
129 1.22.2.5 ad struct puffs_node *pn = arg;
130 1.22.2.12 ad int revents, error;
131 1.22.2.5 ad
132 1.22.2.12 ad error = checkerr(pmp, preq->preq_rv, __func__);
133 1.22.2.12 ad if (error)
134 1.22.2.14 ad revents = poll_msg->pvnr_events;
135 1.22.2.5 ad else
136 1.22.2.5 ad revents = POLLERR;
137 1.22.2.5 ad
138 1.22.2.5 ad mutex_enter(&pn->pn_mtx);
139 1.22.2.5 ad pn->pn_revents |= revents;
140 1.22.2.5 ad mutex_exit(&pn->pn_mtx);
141 1.22.2.5 ad
142 1.22.2.5 ad selnotify(&pn->pn_sel, 0);
143 1.22.2.5 ad
144 1.22.2.5 ad puffs_releasenode(pn);
145 1.22.2.5 ad }
146 1.22.2.5 ad
147 1.22.2.5 ad void
148 1.22.2.5 ad puffs_mp_reference(struct puffs_mount *pmp)
149 1.22.2.5 ad {
150 1.22.2.5 ad
151 1.22.2.5 ad KASSERT(mutex_owned(&pmp->pmp_lock));
152 1.22.2.5 ad pmp->pmp_refcount++;
153 1.22.2.5 ad }
154 1.22.2.5 ad
155 1.22.2.5 ad void
156 1.22.2.5 ad puffs_mp_release(struct puffs_mount *pmp)
157 1.22.2.5 ad {
158 1.22.2.5 ad
159 1.22.2.5 ad KASSERT(mutex_owned(&pmp->pmp_lock));
160 1.22.2.5 ad if (--pmp->pmp_refcount == 0)
161 1.22.2.5 ad cv_broadcast(&pmp->pmp_refcount_cv);
162 1.22.2.5 ad }
163 1.22.2.12 ad
164 1.22.2.12 ad void
165 1.22.2.12 ad puffs_gop_size(struct vnode *vp, off_t size, off_t *eobp,
166 1.22.2.12 ad int flags)
167 1.22.2.12 ad {
168 1.22.2.12 ad
169 1.22.2.12 ad *eobp = size;
170 1.22.2.12 ad }
171 1.22.2.12 ad
172 1.22.2.12 ad void
173 1.22.2.12 ad puffs_gop_markupdate(struct vnode *vp, int flags)
174 1.22.2.12 ad {
175 1.22.2.12 ad int uflags = 0;
176 1.22.2.12 ad
177 1.22.2.12 ad if (flags & GOP_UPDATE_ACCESSED)
178 1.22.2.12 ad uflags |= PUFFS_UPDATEATIME;
179 1.22.2.12 ad if (flags & GOP_UPDATE_MODIFIED)
180 1.22.2.12 ad uflags |= PUFFS_UPDATEMTIME;
181 1.22.2.12 ad
182 1.22.2.12 ad puffs_updatenode(vp, uflags);
183 1.22.2.12 ad }
184