1 /* $NetBSD: puffs_priv.h,v 1.42 2010/01/12 18:42:39 pooka Exp $ */ 2 3 /* 4 * Copyright (c) 2006, 2007, 2008 Antti Kantee. All Rights Reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 16 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 21 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 */ 27 28 #ifndef _PUFFS_PRIVATE_H_ 29 #define _PUFFS_PRIVATE_H_ 30 31 #include <sys/types.h> 32 #include <fs/puffs/puffs_msgif.h> 33 34 #include <puffs.h> 35 #include <ucontext.h> 36 37 #ifdef PUFFS_WITH_THREADS 38 #include <pthread.h> 39 40 extern pthread_mutex_t pu_lock; 41 #define PU_LOCK() pthread_mutex_lock(&pu_lock) 42 #define PU_UNLOCK() pthread_mutex_unlock(&pu_lock) 43 #else 44 #define PU_LOCK() 45 #define PU_UNLOCK() 46 #endif 47 48 #define PU_CMAP(pu, c) (pu->pu_cmap ? pu->pu_cmap(pu,c) : (struct puffs_node*)c) 49 50 struct puffs_framectrl { 51 puffs_framev_readframe_fn rfb; 52 puffs_framev_writeframe_fn wfb; 53 puffs_framev_cmpframe_fn cmpfb; 54 puffs_framev_gotframe_fn gotfb; 55 puffs_framev_fdnotify_fn fdnotfn; 56 }; 57 58 struct puffs_fctrl_io { 59 struct puffs_framectrl *fctrl; 60 61 int io_fd; 62 int stat; 63 64 int rwait; 65 int wwait; 66 67 struct puffs_framebuf *cur_in; 68 69 TAILQ_HEAD(, puffs_framebuf) snd_qing; /* queueing to be sent */ 70 TAILQ_HEAD(, puffs_framebuf) res_qing; /* q'ing for rescue */ 71 LIST_HEAD(, puffs_fbevent) ev_qing; /* q'ing for events */ 72 73 LIST_ENTRY(puffs_fctrl_io) fio_entries; 74 }; 75 #define FIO_WR 0x01 76 #define FIO_WRGONE 0x02 77 #define FIO_RDGONE 0x04 78 #define FIO_DEAD 0x08 79 #define FIO_ENABLE_R 0x10 80 #define FIO_ENABLE_W 0x20 81 82 #define FIO_EN_WRITE(fio) \ 83 (!(fio->stat & FIO_WR) \ 84 && ((!TAILQ_EMPTY(&fio->snd_qing) \ 85 && (fio->stat & FIO_ENABLE_W)) \ 86 || fio->wwait)) 87 88 #define FIO_RM_WRITE(fio) \ 89 ((fio->stat & FIO_WR) \ 90 && (((TAILQ_EMPTY(&fio->snd_qing) \ 91 || (fio->stat & FIO_ENABLE_W) == 0)) \ 92 && (fio->wwait == 0))) 93 94 95 /* 96 * usermount: describes one file system instance 97 */ 98 struct puffs_usermount { 99 struct puffs_ops pu_ops; 100 101 int pu_fd; 102 size_t pu_maxreqlen; 103 104 uint32_t pu_flags; 105 int pu_cc_stackshift; 106 107 ucontext_t pu_mainctx; 108 #define PUFFS_CCMAXSTORE 32 109 int pu_cc_nstored; 110 111 int pu_kq; 112 int pu_state; 113 #define PU_STATEMASK 0x00ff 114 #define PU_INLOOP 0x0100 115 #define PU_ASYNCFD 0x0200 116 #define PU_HASKQ 0x0400 117 #define PU_PUFFSDAEMON 0x0800 118 #define PU_MAINRESTORE 0x1000 119 #define PU_DONEXIT 0x2000 120 #define PU_SETSTATE(pu, s) (pu->pu_state = (s) | (pu->pu_state & ~PU_STATEMASK)) 121 #define PU_SETSFLAG(pu, s) (pu->pu_state |= (s)) 122 #define PU_CLRSFLAG(pu, s) \ 123 (pu->pu_state = ((pu->pu_state &= ~(s)) | (pu->pu_state & PU_STATEMASK))) 124 int pu_dpipe[2]; 125 126 struct puffs_node *pu_pn_root; 127 128 LIST_HEAD(, puffs_node) pu_pnodelst; 129 130 LIST_HEAD(, puffs_cc) pu_ccmagazin; 131 TAILQ_HEAD(, puffs_cc) pu_lazyctx; 132 TAILQ_HEAD(, puffs_cc) pu_sched; 133 134 pu_cmap_fn pu_cmap; 135 136 pu_pathbuild_fn pu_pathbuild; 137 pu_pathtransform_fn pu_pathtransform; 138 pu_pathcmp_fn pu_pathcmp; 139 pu_pathfree_fn pu_pathfree; 140 pu_namemod_fn pu_namemod; 141 142 pu_errnotify_fn pu_errnotify; 143 144 pu_prepost_fn pu_oppre; 145 pu_prepost_fn pu_oppost; 146 147 struct puffs_framectrl pu_framectrl[2]; 148 #define PU_FRAMECTRL_FS 0 149 #define PU_FRAMECTRL_USER 1 150 LIST_HEAD(, puffs_fctrl_io) pu_ios; 151 LIST_HEAD(, puffs_fctrl_io) pu_ios_rmlist; 152 struct kevent *pu_evs; 153 size_t pu_nevs; 154 155 puffs_ml_loop_fn pu_ml_lfn; 156 struct timespec pu_ml_timeout; 157 struct timespec *pu_ml_timep; 158 159 struct puffs_kargs *pu_kargp; 160 161 uint64_t pu_nextreq; 162 void *pu_privdata; 163 }; 164 165 /* call context */ 166 167 struct puffs_cc; 168 typedef void (*puffs_ccfunc)(struct puffs_cc *); 169 170 struct puffs_cc { 171 struct puffs_usermount *pcc_pu; 172 struct puffs_framebuf *pcc_pb; 173 174 /* real cc */ 175 union { 176 struct { 177 ucontext_t uc; /* "continue" */ 178 ucontext_t uc_ret; /* "yield" */ 179 } real; 180 struct { 181 puffs_ccfunc func; 182 void *farg; 183 } fake; 184 } pcc_u; 185 186 pid_t pcc_pid; 187 lwpid_t pcc_lid; 188 189 int pcc_flags; 190 191 TAILQ_ENTRY(puffs_cc) pcc_schedent; 192 LIST_ENTRY(puffs_cc) pcc_rope; 193 }; 194 #define pcc_uc pcc_u.real.uc 195 #define pcc_uc_ret pcc_u.real.uc_ret 196 #define pcc_func pcc_u.fake.func 197 #define pcc_farg pcc_u.fake.farg 198 #define PCC_DONE 0x01 199 #define PCC_BORROWED 0x02 200 #define PCC_HASCALLER 0x04 201 #define PCC_MLCONT 0x08 202 203 struct puffs_newinfo { 204 void **pni_cookie; 205 enum vtype *pni_vtype; 206 voff_t *pni_size; 207 dev_t *pni_rdev; 208 }; 209 210 #define PUFFS_MAKEKCRED(to, from) \ 211 /*LINTED: tnilxnaht, the cast is ok */ \ 212 const struct puffs_kcred *to = (const void *)from 213 #define PUFFS_MAKECRED(to, from) \ 214 /*LINTED: tnilxnaht, the cast is ok */ \ 215 const struct puffs_cred *to = (const void *)from 216 #define PUFFS_KCREDTOCRED(to, from) \ 217 /*LINTED: tnilxnaht, the cast is ok */ \ 218 to = (void *)from 219 220 __BEGIN_DECLS 221 222 void puffs__framev_input(struct puffs_usermount *, struct puffs_framectrl *, 223 struct puffs_fctrl_io *); 224 int puffs__framev_output(struct puffs_usermount *, struct puffs_framectrl*, 225 struct puffs_fctrl_io *); 226 void puffs__framev_exit(struct puffs_usermount *); 227 void puffs__framev_readclose(struct puffs_usermount *, 228 struct puffs_fctrl_io *, int); 229 void puffs__framev_writeclose(struct puffs_usermount *, 230 struct puffs_fctrl_io *, int); 231 void puffs__framev_notify(struct puffs_fctrl_io *, int); 232 void *puffs__framebuf_getdataptr(struct puffs_framebuf *); 233 int puffs__framev_addfd_ctrl(struct puffs_usermount *, int, int, 234 struct puffs_framectrl *); 235 void puffs__framebuf_moveinfo(struct puffs_framebuf *, 236 struct puffs_framebuf *); 237 238 void puffs__theloop(struct puffs_cc *); 239 void puffs__ml_dispatch(struct puffs_usermount *, struct puffs_framebuf *); 240 241 int puffs__cc_create(struct puffs_usermount *, puffs_ccfunc, 242 struct puffs_cc **); 243 void puffs__cc_cont(struct puffs_cc *); 244 void puffs__cc_destroy(struct puffs_cc *, int); 245 void puffs__cc_setcaller(struct puffs_cc *, pid_t, lwpid_t); 246 void puffs__goto(struct puffs_cc *); 247 int puffs__cc_savemain(struct puffs_usermount *); 248 int puffs__cc_restoremain(struct puffs_usermount *); 249 void puffs__cc_exit(struct puffs_usermount *); 250 251 int puffs__fsframe_read(struct puffs_usermount *, struct puffs_framebuf *, 252 int, int *); 253 int puffs__fsframe_write(struct puffs_usermount *, struct puffs_framebuf *, 254 int, int *); 255 int puffs__fsframe_cmp(struct puffs_usermount *, struct puffs_framebuf *, 256 struct puffs_framebuf *, int *); 257 void puffs__fsframe_gotframe(struct puffs_usermount *, 258 struct puffs_framebuf *); 259 260 uint64_t puffs__nextreq(struct puffs_usermount *pu); 261 262 __END_DECLS 263 264 #endif /* _PUFFS_PRIVATE_H_ */ 265