version 1.51, 2007/09/27 21:14:50 |
version 1.70.10.1, 2010/03/11 15:04:14 |
Line 54 extern const struct vnodeopv_desc puffs_ |
|
Line 54 extern const struct vnodeopv_desc puffs_ |
|
|
|
extern struct pool puffs_pnpool; |
extern struct pool puffs_pnpool; |
|
|
#define PUFFS_SIZEOPREQ_UIO_IN 1 |
|
#define PUFFS_SIZEOPREQ_UIO_OUT 2 |
|
#define PUFFS_SIZEOPREQ_BUF_IN 3 |
|
#define PUFFS_SIZEOPREQ_BUF_OUT 4 |
|
|
|
#define PUFFS_SIZEOP_UIO(a) \ |
|
(((a)==PUFFS_SIZEOPREQ_UIO_IN)||(a)==PUFFS_SIZEOPREQ_UIO_OUT) |
|
#define PUFFS_SIZEOP_BUF(a) \ |
|
(((a)==PUFFS_SIZEOPREQ_BUF_IN)||(a)==PUFFS_SIZEOPREQ_BUF_OUT) |
|
|
|
/* XXX: alignment-optimization */ |
|
struct puffs_sizepark { |
|
uint64_t pkso_reqid; |
|
uint8_t pkso_reqtype; |
|
|
|
struct uio *pkso_uio; |
|
void *pkso_copybuf; |
|
size_t pkso_bufsize; |
|
|
|
TAILQ_ENTRY(puffs_sizepark) pkso_entries; |
|
}; |
|
|
|
#ifdef DEBUG |
#ifdef DEBUG |
#ifndef PUFFSDEBUG |
#ifndef PUFFSDEBUG |
#define PUFFSDEBUG |
#define PUFFSDEBUG |
Line 96 extern int puffsdebug; /* puffs_subr.c * |
|
Line 74 extern int puffsdebug; /* puffs_subr.c * |
|
#define VPTOPP(vp) ((struct puffs_node *)(vp)->v_data) |
#define VPTOPP(vp) ((struct puffs_node *)(vp)->v_data) |
#define VPTOPNC(vp) (((struct puffs_node *)(vp)->v_data)->pn_cookie) |
#define VPTOPNC(vp) (((struct puffs_node *)(vp)->v_data)->pn_cookie) |
#define VPTOPUFFSMP(vp) ((struct puffs_mount*)((struct puffs_node*)vp->v_data)) |
#define VPTOPUFFSMP(vp) ((struct puffs_mount*)((struct puffs_node*)vp->v_data)) |
#define FPTOPMP(fp) (((struct puffs_instance *)fp->f_data)->pi_pmp) |
|
#define FPTOPI(fp) ((struct puffs_instance *)fp->f_data) |
|
|
|
/* we don't pass the kernel overlay to userspace */ |
/* we don't pass the kernel overlay to userspace */ |
#define PUFFS_TOFHSIZE(s) ((s)==0 ? (s) : (s)+4) |
#define PUFFS_TOFHSIZE(s) ((s)==0 ? (s) : (s)+4) |
Line 117 extern int puffsdebug; /* puffs_subr.c * |
|
Line 93 extern int puffsdebug; /* puffs_subr.c * |
|
#define PUFFS_WCACHEINFO(pmp) 0 |
#define PUFFS_WCACHEINFO(pmp) 0 |
|
|
struct puffs_newcookie { |
struct puffs_newcookie { |
void *pnc_cookie; |
puffs_cookie_t pnc_cookie; |
|
|
LIST_ENTRY(puffs_newcookie) pnc_entries; |
LIST_ENTRY(puffs_newcookie) pnc_entries; |
}; |
}; |
|
|
TAILQ_HEAD(puffs_wq, puffs_park); |
enum puffs_sopreqtype { |
|
PUFFS_SOPREQSYS_EXIT, |
|
PUFFS_SOPREQ_FLUSH, |
|
PUFFS_SOPREQ_UNMOUNT, |
|
}; |
|
|
|
struct puffs_sopreq { |
|
union { |
|
struct puffs_req preq; |
|
struct puffs_flush pf; |
|
} psopr_u; |
|
|
|
enum puffs_sopreqtype psopr_sopreq; |
|
TAILQ_ENTRY(puffs_sopreq) psopr_entries; |
|
}; |
|
#define psopr_preq psopr_u.preq |
|
#define psopr_pf psopr_u.pf |
|
|
|
TAILQ_HEAD(puffs_wq, puffs_msgpark); |
LIST_HEAD(puffs_node_hashlist, puffs_node); |
LIST_HEAD(puffs_node_hashlist, puffs_node); |
struct puffs_mount { |
struct puffs_mount { |
kmutex_t pmp_lock; |
kmutex_t pmp_lock; |
Line 131 struct puffs_mount { |
|
Line 125 struct puffs_mount { |
|
#define pmp_flags pmp_args.pa_flags |
#define pmp_flags pmp_args.pa_flags |
#define pmp_vnopmask pmp_args.pa_vnopmask |
#define pmp_vnopmask pmp_args.pa_vnopmask |
|
|
struct puffs_wq pmp_req_touser; |
struct puffs_wq pmp_msg_touser; |
int pmp_req_touser_count; |
int pmp_msg_touser_count; |
kcondvar_t pmp_req_waiter_cv; |
kcondvar_t pmp_msg_waiter_cv; |
size_t pmp_req_maxsize; |
size_t pmp_msg_maxsize; |
|
|
struct puffs_wq pmp_req_replywait; |
struct puffs_wq pmp_msg_replywait; |
TAILQ_HEAD(, puffs_sizepark) pmp_req_sizepark; |
|
|
|
struct puffs_node_hashlist *pmp_pnodehash; |
struct puffs_node_hashlist *pmp_pnodehash; |
int pmp_npnodehash; |
int pmp_npnodehash; |
Line 147 struct puffs_mount { |
|
Line 140 struct puffs_mount { |
|
struct mount *pmp_mp; |
struct mount *pmp_mp; |
|
|
struct vnode *pmp_root; |
struct vnode *pmp_root; |
void *pmp_root_cookie; |
puffs_cookie_t pmp_root_cookie; |
enum vtype pmp_root_vtype; |
enum vtype pmp_root_vtype; |
vsize_t pmp_root_vsize; |
vsize_t pmp_root_vsize; |
dev_t pmp_root_rdev; |
dev_t pmp_root_rdev; |
|
|
struct selinfo *pmp_sel; /* in puffs_instance */ |
struct putter_instance *pmp_pi; |
|
|
unsigned int pmp_refcount; |
unsigned int pmp_refcount; |
kcondvar_t pmp_refcount_cv; |
kcondvar_t pmp_refcount_cv; |
Line 163 struct puffs_mount { |
|
Line 156 struct puffs_mount { |
|
uint8_t pmp_status; |
uint8_t pmp_status; |
uint8_t pmp_suspend; |
uint8_t pmp_suspend; |
|
|
uint64_t pmp_nextreq; |
uint8_t *pmp_curput; |
|
size_t pmp_curres; |
|
void *pmp_curopaq; |
|
|
|
uint64_t pmp_nextmsgid; |
|
|
|
kmutex_t pmp_sopmtx; |
|
kcondvar_t pmp_sopcv; |
|
int pmp_sopthrcount; |
|
TAILQ_HEAD(, puffs_sopreq) pmp_sopreqs; |
}; |
}; |
|
|
#define PUFFSTAT_BEFOREINIT 0 |
#define PUFFSTAT_BEFOREINIT 0 |
Line 173 struct puffs_mount { |
|
Line 175 struct puffs_mount { |
|
|
|
|
|
#define PNODE_NOREFS 0x01 /* no backend reference */ |
#define PNODE_NOREFS 0x01 /* no backend reference */ |
#define PNODE_DYING 0x02 /* NOREF + inactive */ |
#define PNODE_DYING 0x02 /* NOREFS + inactive */ |
#define PNODE_SUSPEND 0x04 /* issue all operations as FAF */ |
#define PNODE_FAF 0x04 /* issue all operations as FAF */ |
#define PNODE_DOINACT 0x08 /* if inactive-on-demand, call inactive */ |
#define PNODE_DOINACT 0x08 /* if inactive-on-demand, call inactive */ |
|
|
#define PNODE_METACACHE_ATIME 0x10 /* cache atime metadata */ |
#define PNODE_METACACHE_ATIME 0x10 /* cache atime metadata */ |
Line 189 struct puffs_node { |
|
Line 191 struct puffs_node { |
|
kmutex_t pn_mtx; |
kmutex_t pn_mtx; |
int pn_refcount; |
int pn_refcount; |
|
|
void *pn_cookie; /* userspace pnode cookie */ |
puffs_cookie_t pn_cookie; /* userspace pnode cookie */ |
struct vnode *pn_vp; /* backpointer to vnode */ |
struct vnode *pn_vp; /* backpointer to vnode */ |
uint32_t pn_stat; /* node status */ |
uint32_t pn_stat; /* node status */ |
|
|
Line 207 struct puffs_node { |
|
Line 209 struct puffs_node { |
|
LIST_ENTRY(puffs_node) pn_hashent; |
LIST_ENTRY(puffs_node) pn_hashent; |
}; |
}; |
|
|
typedef void (*parkdone_fn)(struct puffs_req *, void *); |
typedef void (*parkdone_fn)(struct puffs_mount *, struct puffs_req *, void *); |
|
|
void puffs_transport_init(void); |
|
void puffs_transport_destroy(void); |
|
|
|
|
struct puffs_msgpark; |
void puffs_msgif_init(void); |
void puffs_msgif_init(void); |
void puffs_msgif_destroy(void); |
void puffs_msgif_destroy(void); |
void *puffs_park_alloc(int); |
int puffs_msgmem_alloc(size_t, struct puffs_msgpark **, void **, int); |
void puffs_park_release(void *, int); |
void puffs_msgmem_release(struct puffs_msgpark *); |
|
|
|
void puffs_sop_thread(void *); |
|
|
|
void puffs_msg_setfaf(struct puffs_msgpark *); |
|
void puffs_msg_setdelta(struct puffs_msgpark *, size_t); |
|
void puffs_msg_setinfo(struct puffs_msgpark *, int, int, puffs_cookie_t); |
|
void puffs_msg_setcall(struct puffs_msgpark *, parkdone_fn, void *); |
|
|
|
void puffs_msg_enqueue(struct puffs_mount *, struct puffs_msgpark *); |
|
int puffs_msg_wait(struct puffs_mount *, struct puffs_msgpark *); |
|
int puffs_msg_wait2(struct puffs_mount *, struct puffs_msgpark *, |
|
struct puffs_node *, struct puffs_node *); |
|
|
int puffs_vfstouser(struct puffs_mount *, int, void *, size_t); |
void puffs_msg_sendresp(struct puffs_mount *, struct puffs_req *, int); |
void puffs_suspendtouser(struct puffs_mount *, int); |
|
int puffs_vntouser(struct puffs_mount *, int, void *, size_t, size_t, |
|
struct vnode *, struct vnode *); |
|
int puffs_vntouser_req(struct puffs_mount *, int, void *, size_t, size_t, |
|
uint64_t, struct vnode *, struct vnode *); |
|
void puffs_vntouser_call(struct puffs_mount *, int, void *, size_t, size_t, |
|
parkdone_fn, void *, struct vnode *, struct vnode*); |
|
void puffs_vntouser_faf(struct puffs_mount *, int, void *, size_t, |
|
struct vnode *); |
|
void puffs_cacheop(struct puffs_mount *, struct puffs_park *, |
|
struct puffs_cacheinfo *, size_t, void *); |
|
struct puffs_park *puffs_cacheop_alloc(void); |
|
void puffs_errnotify(struct puffs_mount *, uint8_t, int, void *); |
|
|
|
int puffs_getvnode(struct mount *, void *, enum vtype, voff_t, dev_t, |
int puffs_getvnode(struct mount *, puffs_cookie_t, enum vtype, |
struct vnode **); |
voff_t, dev_t, struct vnode **); |
int puffs_newnode(struct mount *, struct vnode *, struct vnode **, |
int puffs_newnode(struct mount *, struct vnode *, struct vnode **, |
void *, struct componentname *, enum vtype, dev_t); |
puffs_cookie_t, struct componentname *, |
|
enum vtype, dev_t); |
void puffs_putvnode(struct vnode *); |
void puffs_putvnode(struct vnode *); |
|
|
void puffs_releasenode(struct puffs_node *); |
void puffs_releasenode(struct puffs_node *); |
void puffs_referencenode(struct puffs_node *); |
void puffs_referencenode(struct puffs_node *); |
|
|
int puffs_cookie2vnode(struct puffs_mount *, void *, int, int, |
#define PUFFS_NOSUCHCOOKIE (-1) |
|
int puffs_cookie2vnode(struct puffs_mount *, puffs_cookie_t, int, int, |
struct vnode **); |
struct vnode **); |
void puffs_makecn(struct puffs_kcn *, struct puffs_kcred *, |
void puffs_makecn(struct puffs_kcn *, struct puffs_kcred *, |
struct puffs_kcid *, const struct componentname *, int); |
const struct componentname *, int); |
void puffs_credcvt(struct puffs_kcred *, kauth_cred_t); |
void puffs_credcvt(struct puffs_kcred *, kauth_cred_t); |
void puffs_cidcvt(struct puffs_kcid *, const struct lwp *); |
|
|
|
void puffs_parkdone_asyncbioread(struct puffs_req *, void *); |
void puffs_parkdone_asyncbioread(struct puffs_mount *, |
void puffs_parkdone_poll(struct puffs_req *, void *); |
struct puffs_req *, void *); |
|
void puffs_parkdone_asyncbiowrite(struct puffs_mount *, |
|
struct puffs_req *, void *); |
|
void puffs_parkdone_poll(struct puffs_mount *, struct puffs_req *, void *); |
|
|
void puffs_mp_reference(struct puffs_mount *); |
void puffs_mp_reference(struct puffs_mount *); |
void puffs_mp_release(struct puffs_mount *); |
void puffs_mp_release(struct puffs_mount *); |
|
|
void puffs_updatenode(struct vnode *, int); |
void puffs_gop_size(struct vnode *, off_t, off_t *, int); |
|
void puffs_gop_markupdate(struct vnode *, int); |
|
|
|
void puffs_senderr(struct puffs_mount *, int, int, const char *, |
|
puffs_cookie_t); |
|
|
|
void puffs_updatenode(struct puffs_node *, int, voff_t); |
#define PUFFS_UPDATEATIME 0x01 |
#define PUFFS_UPDATEATIME 0x01 |
#define PUFFS_UPDATECTIME 0x02 |
#define PUFFS_UPDATECTIME 0x02 |
#define PUFFS_UPDATEMTIME 0x04 |
#define PUFFS_UPDATEMTIME 0x04 |
#define PUFFS_UPDATESIZE 0x08 |
#define PUFFS_UPDATESIZE 0x08 |
|
|
int puffs_setpmp(pid_t, int, struct puffs_mount *); |
void puffs_userdead(struct puffs_mount *); |
void puffs_nukebypmp(struct puffs_mount *); |
|
|
|
uint64_t puffs_getreqid(struct puffs_mount *); |
|
void puffs_userdead(struct puffs_mount *); |
|
|
|
/* get/put called by ioctl handler */ |
|
int puffs_getop(struct puffs_mount *, struct puffs_reqh_get *, int); |
|
int puffs_putop(struct puffs_mount *, struct puffs_reqh_put *); |
|
|
|
extern int (**puffs_vnodeop_p)(void *); |
extern int (**puffs_vnodeop_p)(void *); |
|
|
MALLOC_DECLARE(M_PUFFS); |
/* for putter */ |
|
int puffs_msgif_getout(void *, size_t, int, uint8_t **, size_t *, void **); |
|
void puffs_msgif_releaseout(void *, void *, int); |
|
int puffs_msgif_dispatch(void *, struct putter_hdr *); |
|
size_t puffs_msgif_waitcount(void *); |
|
int puffs_msgif_close(void *); |
|
|
|
static __inline int |
|
checkerr(struct puffs_mount *pmp, int error, const char *str) |
|
{ |
|
|
|
if (error < 0 || error > ELAST) { |
|
puffs_senderr(pmp, PUFFS_ERR_ERROR, error, str, NULL); |
|
error = EPROTO; |
|
} |
|
|
|
return error; |
|
} |
|
|
|
#define PUFFS_MSG_VARS(type, a) \ |
|
struct puffs_##type##msg_##a *a##_msg; \ |
|
struct puffs_msgpark *park_##a = NULL |
|
|
|
#define PUFFS_MSG_ALLOC(type, a) \ |
|
puffs_msgmem_alloc(sizeof(struct puffs_##type##msg_##a), \ |
|
&park_##a, (void *)& a##_msg, 1) |
|
|
|
#define PUFFS_MSG_RELEASE(a) \ |
|
do { \ |
|
if (park_##a) puffs_msgmem_release(park_##a); \ |
|
} while (/*CONSTCOND*/0) |
|
|
|
#define PUFFS_MSG_ENQUEUEWAIT(pmp, park, var) \ |
|
do { \ |
|
puffs_msg_enqueue(pmp, park); \ |
|
var = puffs_msg_wait(pmp, park); \ |
|
} while (/*CONSTCOND*/0) |
|
|
|
#define PUFFS_MSG_ENQUEUEWAIT2(pmp, park, vp1, vp2, var) \ |
|
do { \ |
|
puffs_msg_enqueue(pmp, park); \ |
|
var = puffs_msg_wait2(pmp, park, vp1, vp2); \ |
|
} while (/*CONSTCOND*/0) |
|
|
#endif /* _PUFFS_SYS_H_ */ |
#endif /* _PUFFS_SYS_H_ */ |