Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/sys/fs/puffs/puffs_sys.h,v rcsdiff: /ftp/cvs/cvsroot/src/sys/fs/puffs/puffs_sys.h,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.61 retrieving revision 1.77 diff -u -p -r1.61 -r1.77 --- src/sys/fs/puffs/puffs_sys.h 2007/11/12 17:42:13 1.61 +++ src/sys/fs/puffs/puffs_sys.h 2011/01/11 14:04:54 1.77 @@ -1,4 +1,4 @@ -/* $NetBSD: puffs_sys.h,v 1.61 2007/11/12 17:42:13 pooka Exp $ */ +/* $NetBSD: puffs_sys.h,v 1.77 2011/01/11 14:04:54 kefren Exp $ */ /* * Copyright (c) 2005, 2006 Antti Kantee. All Rights Reserved. @@ -93,11 +93,29 @@ extern int puffsdebug; /* puffs_subr.c * #define PUFFS_WCACHEINFO(pmp) 0 struct puffs_newcookie { - void *pnc_cookie; + puffs_cookie_t pnc_cookie; LIST_ENTRY(puffs_newcookie) pnc_entries; }; +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); struct puffs_mount { @@ -122,7 +140,7 @@ struct puffs_mount { struct mount *pmp_mp; struct vnode *pmp_root; - void *pmp_root_cookie; + puffs_cookie_t pmp_root_cookie; enum vtype pmp_root_vtype; vsize_t pmp_root_vsize; dev_t pmp_root_rdev; @@ -143,6 +161,12 @@ struct puffs_mount { void *pmp_curopaq; uint64_t pmp_nextmsgid; + + kmutex_t pmp_sopmtx; + kcondvar_t pmp_sopcv; + int pmp_sopthrcount; + TAILQ_HEAD(, puffs_sopreq) pmp_sopreqs; + bool pmp_docompat; }; #define PUFFSTAT_BEFOREINIT 0 @@ -152,8 +176,8 @@ struct puffs_mount { #define PNODE_NOREFS 0x01 /* no backend reference */ -#define PNODE_DYING 0x02 /* NOREF + inactive */ -#define PNODE_SUSPEND 0x04 /* issue all operations as FAF */ +#define PNODE_DYING 0x02 /* NOREFS + inactive */ +#define PNODE_FAF 0x04 /* issue all operations as FAF */ #define PNODE_DOINACT 0x08 /* if inactive-on-demand, call inactive */ #define PNODE_METACACHE_ATIME 0x10 /* cache atime metadata */ @@ -168,7 +192,7 @@ struct puffs_node { kmutex_t pn_mtx; int pn_refcount; - void *pn_cookie; /* userspace pnode cookie */ + puffs_cookie_t pn_cookie; /* userspace pnode cookie */ struct vnode *pn_vp; /* backpointer to vnode */ uint32_t pn_stat; /* node status */ @@ -183,6 +207,8 @@ struct puffs_node { voff_t pn_serversize; + struct lockf * pn_lockf; + LIST_ENTRY(puffs_node) pn_hashent; }; @@ -193,36 +219,42 @@ void puffs_msgif_init(void); void puffs_msgif_destroy(void); int puffs_msgmem_alloc(size_t, struct puffs_msgpark **, 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_msg_vfs(struct puffs_mount *, struct puffs_msgpark *, int); -int puffs_msg_vn(struct puffs_mount *, struct puffs_msgpark *, int, size_t, - struct vnode *, struct vnode *); -void puffs_msg_vncall(struct puffs_mount *, struct puffs_msgpark *, int, - size_t, parkdone_fn, void *, struct vnode *); -int puffs_msg_raw(struct puffs_mount *, struct puffs_msgpark *); -void puffs_msg_errnotify(struct puffs_mount *, uint8_t, int, - const char *, void *); +void puffs_msg_sendresp(struct puffs_mount *, struct puffs_req *, int); -int puffs_getvnode(struct mount *, void *, enum vtype, voff_t, dev_t, - struct vnode **); +int puffs_getvnode(struct mount *, puffs_cookie_t, enum vtype, + voff_t, dev_t, 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_releasenode(struct puffs_node *); void puffs_referencenode(struct puffs_node *); #define PUFFS_NOSUCHCOOKIE (-1) -int puffs_cookie2vnode(struct puffs_mount *, void *, int, int, +int puffs_cookie2vnode(struct puffs_mount *, puffs_cookie_t, int, int, struct vnode **); 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_cidcvt(struct puffs_kcid *, const struct lwp *); void puffs_parkdone_asyncbioread(struct puffs_mount *, 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 *); @@ -231,7 +263,13 @@ void puffs_mp_release(struct puffs_mount void puffs_gop_size(struct vnode *, off_t, off_t *, int); void puffs_gop_markupdate(struct vnode *, int); -void puffs_updatenode(struct vnode *, int); +void puffs_senderr(struct puffs_mount *, int, int, const char *, + puffs_cookie_t); + +bool puffs_compat_outgoing(struct puffs_req *, struct puffs_req**, ssize_t*); +void puffs_compat_incoming(struct puffs_req *, struct puffs_req *); + +void puffs_updatenode(struct puffs_node *, int, voff_t); #define PUFFS_UPDATEATIME 0x01 #define PUFFS_UPDATECTIME 0x02 #define PUFFS_UPDATEMTIME 0x04 @@ -241,8 +279,7 @@ void puffs_userdead(struct puffs_mount * 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 *); @@ -254,7 +291,7 @@ checkerr(struct puffs_mount *pmp, int er { if (error < 0 || error > ELAST) { - puffs_msg_errnotify(pmp, PUFFS_ERR_ERROR, error, str, NULL); + puffs_senderr(pmp, PUFFS_ERR_ERROR, error, str, NULL); error = EPROTO; } @@ -267,11 +304,23 @@ checkerr(struct puffs_mount *pmp, int er #define PUFFS_MSG_ALLOC(type, a) \ puffs_msgmem_alloc(sizeof(struct puffs_##type##msg_##a), \ - &park_##a, (void **)& a##_msg, 1) + &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_ */