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_msgif.h,v rcsdiff: /ftp/cvs/cvsroot/src/sys/fs/puffs/puffs_msgif.h,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.50 retrieving revision 1.50.2.2 diff -u -p -r1.50 -r1.50.2.2 --- src/sys/fs/puffs/puffs_msgif.h 2007/08/23 14:36:46 1.50 +++ src/sys/fs/puffs/puffs_msgif.h 2008/01/09 01:55:47 1.50.2.2 @@ -1,7 +1,7 @@ -/* $NetBSD: puffs_msgif.h,v 1.50 2007/08/23 14:36:46 pooka Exp $ */ +/* $NetBSD: puffs_msgif.h,v 1.50.2.2 2008/01/09 01:55:47 matt Exp $ */ /* - * Copyright (c) 2005, 2006 Antti Kantee. All Rights Reserved. + * Copyright (c) 2005, 2006, 2007 Antti Kantee. All Rights Reserved. * * Development of this software was supported by the * Google Summer of Code program and the Ulla Tuominen Foundation. @@ -42,14 +42,21 @@ #include #include +#include + #include -#define PUFFSOP_VFS 1 -#define PUFFSOP_VN 2 -#define PUFFSOP_CACHE 3 -#define PUFFSOPFLAG_FAF 0x10 /* fire-and-forget */ +#define PUFFSOP_VFS 0x01 /* kernel-> */ +#define PUFFSOP_VN 0x02 /* kernel-> */ +#define PUFFSOP_CACHE 0x03 /* only kernel-> */ +#define PUFFSOP_ERROR 0x04 /* only kernel-> */ +#define PUFFSOP_FLUSH 0x05 /* ->kernel */ +#define PUFFSOP_SUSPEND 0x06 /* ->kernel */ + +#define PUFFSOPFLAG_FAF 0x10 /* fire-and-forget */ +#define PUFFSOPFLAG_ISRESPONSE 0x20 /* req is actually a resp */ -#define PUFFSOP_OPCMASK 0x03 +#define PUFFSOP_OPCMASK 0x07 #define PUFFSOP_OPCLASS(a) ((a) & PUFFSOP_OPCMASK) #define PUFFSOP_WANTREPLY(a) (((a) & PUFFSOPFLAG_FAF) == 0) @@ -84,8 +91,18 @@ enum { }; #define PUFFS_VN_MAX PUFFS_VN_SETEXTATTR +/* + * These signal invalid parameters the file system returned. + */ +enum { + PUFFS_ERR_MAKENODE, PUFFS_ERR_LOOKUP, PUFFS_ERR_READDIR, + PUFFS_ERR_READLINK, PUFFS_ERR_READ, PUFFS_ERR_WRITE, + PUFFS_ERR_VPTOFH, PUFFS_ERR_ERROR +}; +#define PUFFS_ERR_MAX PUFFS_ERR_VPTOFH + #define PUFFSDEVELVERS 0x80000000 -#define PUFFSVERSION 17 +#define PUFFSVERSION 26 #define PUFFSNAMESIZE 32 #define PUFFS_TYPEPREFIX "puffs|" @@ -96,9 +113,10 @@ enum { struct puffs_kargs { unsigned int pa_vers; int pa_fd; + uint32_t pa_flags; - size_t pa_maxreqlen; + size_t pa_maxmsglen; int pa_nhashbuckets; size_t pa_fhsize; @@ -110,7 +128,7 @@ struct puffs_kargs { dev_t pa_root_rdev; struct statvfs pa_svfsb; - + char pa_typename[_VFS_NAMELEN]; char pa_mntfromname[_VFS_MNAMELEN]; @@ -134,126 +152,30 @@ struct puffs_kargs { #define PUFFS_FHSIZE_MAX 1020 /* XXX: FHANDLE_SIZE_MAX - 4 */ -/* - * This is the device minor number for the cloning device. Make it - * a high number "just in case", even though we don't want to open - * any specific devices currently. - */ -#define PUFFS_CLONER 0x7ffff +struct puffs_req { + struct putter_hdr preq_pth; -struct puffs_reqh_get { - void *phg_buf; /* user buffer */ - size_t phg_buflen; /* user buffer length */ + uint64_t preq_id; + void *preq_cookie; - int phg_nops; /* max ops user wants / number delivered */ - int phg_more; /* advisory: more ops available? */ -}; + uint16_t preq_opclass; + uint16_t preq_optype; + int preq_rv; -struct puffs_reqh_put { - int php_nops; /* ops available / ops handled */ + uint32_t preq_setbacks; - /* these describe the first request */ - uint64_t php_id; /* request id */ - void *php_buf; /* user buffer address */ - size_t php_buflen; /* user buffer length, hdr NOT incl. */ -}; + /* Who is making the call? Eventually host id is also needed. */ + pid_t preq_pid; + lwpid_t preq_lid; -/* - * The requests work as follows: - * - * + GETOP: When fetching operations from the kernel, the user server - * supplies a flat buffer into which operations are written. - * The number of operations written to the buffer is - * MIN(prhg_nops, requests waiting, space in buffer). - * - * Operations follow each other and each one is described - * by the puffs_req structure, which is immediately followed - * by the aligned request data buffer in preq_buf. The next - * puffs_req can be found at preq + preq_buflen. - * - * Visually, the server should expect: - * - * |<-- preq_buflen -->| - * --------------------------------------------------------------- - * |hdr| buffer |align|hdr| buffer |hdr| .... |buffer| | - * --------------------------------------------------------------- - * ^ start ^ unaligned ^ aligned ^ always aligned - * - * The server is allowed to modify the contents of the buffers. - * Since the headers are the same size for both get and put, it - * is possible to handle all operations simply by doing in-place - * modification. Where more input is expected that what was put - * out, the kernel leaves a hole in the buffer. This hole size - * is derived from the operational semantics known by the vnode - * layer. The hole size is included in preq_buflen. The - * amount of relevant information in the buffer is call-specific - * and can be deduced by the server from the call type. - * - * + PUTOP: When returning the results of an operation to the kernel, the - * user server is allowed to input results in a scatter-gather - * fashion. Each request is made up of a header and the buffer. - * The header describes the *NEXT* request for copyin, *NOT* the - * current one. The first request is described in puffs_reqh_put - * and the last one is left uninterpreted. This is to halve the - * amount of copyin's required. - * - * Fans of my ascii art, rejoice: - * /-------------------->| preq_buflen | - * ---^---------------------------------------------------------- - * |hdr|buffer| empty spaces |hdr| buffer | | - * --v-----------------------^-v--------------------------------- - * \------- preq_buf -----/ \------- preq_buf .... - * - * This scheme also allows for better in-place modification of the - * request buffer when handling requests. The vision is that - * operations which can be immediately satisfied will be edited - * in-place while ones which can't will be left blank. Also, - * requests from async operations which have been satisfied - * meanwhile can be included. - * - * The total number of operations is given by the ioctl control - * structure puffs_reqh. The values in the header in the final - * are not used. - */ -struct puffs_req { - uint64_t preq_id; /* get: cur, put: next */ - - union u { - struct { - uint8_t opclass; /* cur */ - uint8_t optype; /* cur */ - - /* - * preq_cookie is the node cookie associated with - * the request. It always maps 1:1 to a vnode - * and could map to a userspace struct puffs_node. - * The cookie usually describes the first - * vnode argument of the VOP_POP() in question. - */ - - void *cookie; /* cur */ - } out; - struct { - int rv; /* cur */ - int setbacks; /* cur */ - void *buf; /* next */ - } in; - } u; - - size_t preq_buflen; /* get: cur, put: next */ /* * the following helper pads the struct size to md alignment * multiple (should size_t not cut it). it makes sure that * whatever comes after this struct is aligned */ + size_t preq_buflen; uint8_t preq_buf[0] __aligned(ALIGNBYTES+1); }; -#define preq_opclass u.out.opclass -#define preq_optype u.out.optype -#define preq_cookie u.out.cookie -#define preq_rv u.in.rv -#define preq_setbacks u.in.setbacks -#define preq_nextbuf u.in.buf #define PUFFS_SETBACK_INACT_N1 0x01 /* set VOP_INACTIVE for node 1 */ #define PUFFS_SETBACK_INACT_N2 0x02 /* set VOP_INACTIVE for node 2 */ @@ -262,18 +184,6 @@ struct puffs_req { #define PUFFS_SETBACK_MASK 0x0f /* - * Some operations have unknown size requirements. So as the first - * stab at handling it, do an extra bounce between the kernel and - * userspace. - */ -struct puffs_sizeop { - uint64_t pso_reqid; - - uint8_t *pso_userbuf; - size_t pso_bufsize; -}; - -/* * Flush operation. This can be used to invalidate: * 1) name cache for one node * 2) name cache for all children @@ -288,11 +198,13 @@ struct puffs_sizeop { /* XXX: needs restructuring */ struct puffs_flush { - void *pf_cookie; + struct puffs_req pf_req; - int pf_op; - off_t pf_start; - off_t pf_end; + void *pf_cookie; + + int pf_op; + off_t pf_start; + off_t pf_end; }; #define PUFFS_INVAL_NAMECACHE_NODE 0 #define PUFFS_INVAL_NAMECACHE_DIR 1 @@ -300,20 +212,8 @@ struct puffs_flush { #define PUFFS_INVAL_PAGECACHE_NODE_RANGE 3 #define PUFFS_FLUSH_PAGECACHE_NODE_RANGE 4 - -/* - * Available ioctl operations - */ -#define PUFFSGETOP _IOWR('p', 1, struct puffs_reqh_get) -#define PUFFSPUTOP _IOWR('p', 2, struct puffs_reqh_put) -#define PUFFSSIZEOP _IOWR('p', 3, struct puffs_sizeop) -#define PUFFSFLUSHOP _IOW ('p', 4, struct puffs_flush) -#if 0 -#define PUFFSFLUSHMULTIOP _IOW ('p', 5, struct puffs_flushmulti) -#endif -#define PUFFSSUSPENDOP _IO ('p', 6) -#define PUFFSREQSIZEOP _IOR ('p', 7, size_t) - +/* keep this for now */ +#define PUFFSREQSIZEOP _IOR ('p', 1, size_t) /* * Credentials for an operation. Can be either struct uucred for @@ -335,19 +235,10 @@ struct puffs_kcred { * 2*MAXPHYS is the max size the system will attempt to copy, * else treated as garbage */ -#define PUFFS_REQ_MAXSIZE 2*MAXPHYS -#define PUFFS_REQSTRUCT_MAX 4096 /* XXX: approxkludge */ +#define PUFFS_MSG_MAXSIZE 2*MAXPHYS +#define PUFFS_MSGSTRUCT_MAX 4096 /* XXX: approxkludge */ -#define PUFFS_TOMOVE(a,b) (MIN((a), b->pmp_req_maxsize - PUFFS_REQSTRUCT_MAX)) - -/* caller id */ -struct puffs_kcid { - int pkcid_type; - pid_t pkcid_pid; - lwpid_t pkcid_lwpid; -}; -#define PUFFCID_TYPE_REAL 1 -#define PUFFCID_TYPE_FAKE 2 +#define PUFFS_TOMOVE(a,b) (MIN((a), b->pmp_msg_maxsize - PUFFS_MSGSTRUCT_MAX)) /* puffs struct componentname built by kernel */ struct puffs_kcn { @@ -375,29 +266,26 @@ struct puffs_kcn { /* * aux structures for vfs operations. */ -struct puffs_vfsreq_unmount { +struct puffs_vfsmsg_unmount { struct puffs_req pvfsr_pr; int pvfsr_flags; - struct puffs_kcid pvfsr_cid; }; -struct puffs_vfsreq_statvfs { +struct puffs_vfsmsg_statvfs { struct puffs_req pvfsr_pr; struct statvfs pvfsr_sb; - struct puffs_kcid pvfsr_cid; }; -struct puffs_vfsreq_sync { +struct puffs_vfsmsg_sync { struct puffs_req pvfsr_pr; struct puffs_kcred pvfsr_cred; - struct puffs_kcid pvfsr_cid; int pvfsr_waitfor; }; -struct puffs_vfsreq_fhtonode { +struct puffs_vfsmsg_fhtonode { struct puffs_req pvfsr_pr; void *pvfsr_fhcookie; /* IN */ @@ -410,7 +298,7 @@ struct puffs_vfsreq_fhtonode { __aligned(ALIGNBYTES+1); }; -struct puffs_vfsreq_nodetofh { +struct puffs_vfsmsg_nodetofh { struct puffs_req pvfsr_pr; void *pvfsr_fhcookie; /* OUT */ @@ -420,7 +308,7 @@ struct puffs_vfsreq_nodetofh { __aligned(ALIGNBYTES+1); }; -struct puffs_vfsreq_suspend { +struct puffs_vfsmsg_suspend { struct puffs_req pvfsr_pr; int pvfsr_status; @@ -434,12 +322,11 @@ struct puffs_vfsreq_suspend { * aux structures for vnode operations. */ -struct puffs_vnreq_lookup { +struct puffs_vnmsg_lookup { struct puffs_req pvn_pr; struct puffs_kcn pvnr_cn; /* OUT */ struct puffs_kcred pvnr_cn_cred; /* OUT */ - struct puffs_kcid pvnr_cn_cid; /* OUT */ void *pvnr_newnode; /* IN */ enum vtype pvnr_vtype; /* IN */ @@ -447,65 +334,59 @@ struct puffs_vnreq_lookup { dev_t pvnr_rdev; /* IN */ }; -struct puffs_vnreq_create { +struct puffs_vnmsg_create { struct puffs_req pvn_pr; struct puffs_kcn pvnr_cn; /* OUT */ struct puffs_kcred pvnr_cn_cred; /* OUT */ - struct puffs_kcid pvnr_cn_cid; /* OUT */ struct vattr pvnr_va; /* OUT */ void *pvnr_newnode; /* IN */ }; -struct puffs_vnreq_mknod { +struct puffs_vnmsg_mknod { struct puffs_req pvn_pr; struct puffs_kcn pvnr_cn; /* OUT */ struct puffs_kcred pvnr_cn_cred; /* OUT */ - struct puffs_kcid pvnr_cn_cid; /* OUT */ struct vattr pvnr_va; /* OUT */ void *pvnr_newnode; /* IN */ }; -struct puffs_vnreq_open { +struct puffs_vnmsg_open { struct puffs_req pvn_pr; struct puffs_kcred pvnr_cred; /* OUT */ - struct puffs_kcid pvnr_cid; /* OUT */ int pvnr_mode; /* OUT */ }; -struct puffs_vnreq_close { +struct puffs_vnmsg_close { struct puffs_req pvn_pr; struct puffs_kcred pvnr_cred; /* OUT */ - struct puffs_kcid pvnr_cid; /* OUT */ int pvnr_fflag; /* OUT */ }; -struct puffs_vnreq_access { +struct puffs_vnmsg_access { struct puffs_req pvn_pr; struct puffs_kcred pvnr_cred; /* OUT */ - struct puffs_kcid pvnr_cid; /* OUT */ int pvnr_mode; /* OUT */ }; -#define puffs_vnreq_setattr puffs_vnreq_setgetattr -#define puffs_vnreq_getattr puffs_vnreq_setgetattr -struct puffs_vnreq_setgetattr { +#define puffs_vnmsg_setattr puffs_vnmsg_setgetattr +#define puffs_vnmsg_getattr puffs_vnmsg_setgetattr +struct puffs_vnmsg_setgetattr { struct puffs_req pvn_pr; struct puffs_kcred pvnr_cred; /* OUT */ - struct puffs_kcid pvnr_cid; /* OUT */ struct vattr pvnr_va; /* IN/OUT (op depend) */ }; -#define puffs_vnreq_read puffs_vnreq_readwrite -#define puffs_vnreq_write puffs_vnreq_readwrite -struct puffs_vnreq_readwrite { +#define puffs_vnmsg_read puffs_vnmsg_rw +#define puffs_vnmsg_write puffs_vnmsg_rw +struct puffs_vnmsg_rw { struct puffs_req pvn_pr; struct puffs_kcred pvnr_cred; /* OUT */ @@ -516,9 +397,9 @@ struct puffs_vnreq_readwrite { uint8_t pvnr_data[0]; /* IN/OUT (wr/rd) */ }; -#define puffs_vnreq_ioctl puffs_vnreq_fcnioctl -#define puffs_vnreq_fcntl puffs_vnreq_fcnioctl -struct puffs_vnreq_fcnioctl { +#define puffs_vnmsg_ioctl puffs_vnreq_fcnioctl +#define puffs_vnmsg_fcntl puffs_vnreq_fcnioctl +struct puffs_vnmsg_fcnioctl { struct puffs_req pvn_pr; struct puffs_kcred pvnr_cred; @@ -531,24 +412,22 @@ struct puffs_vnreq_fcnioctl { int pvnr_copyback; }; -struct puffs_vnreq_poll { +struct puffs_vnmsg_poll { struct puffs_req pvn_pr; int pvnr_events; /* IN/OUT */ - struct puffs_kcid pvnr_cid; /* OUT */ }; -struct puffs_vnreq_fsync { +struct puffs_vnmsg_fsync { struct puffs_req pvn_pr; struct puffs_kcred pvnr_cred; /* OUT */ - struct puffs_kcid pvnr_cid; /* OUT */ off_t pvnr_offlo; /* OUT */ off_t pvnr_offhi; /* OUT */ int pvnr_flags; /* OUT */ }; -struct puffs_vnreq_seek { +struct puffs_vnmsg_seek { struct puffs_req pvn_pr; struct puffs_kcred pvnr_cred; /* OUT */ @@ -556,75 +435,68 @@ struct puffs_vnreq_seek { off_t pvnr_newoff; /* OUT */ }; -struct puffs_vnreq_remove { +struct puffs_vnmsg_remove { struct puffs_req pvn_pr; struct puffs_kcn pvnr_cn; /* OUT */ struct puffs_kcred pvnr_cn_cred; /* OUT */ - struct puffs_kcid pvnr_cn_cid; /* OUT */ void *pvnr_cookie_targ; /* OUT */ }; -struct puffs_vnreq_mkdir { +struct puffs_vnmsg_mkdir { struct puffs_req pvn_pr; struct puffs_kcn pvnr_cn; /* OUT */ struct puffs_kcred pvnr_cn_cred; /* OUT */ - struct puffs_kcid pvnr_cn_cid; /* OUT */ struct vattr pvnr_va; /* OUT */ void *pvnr_newnode; /* IN */ }; -struct puffs_vnreq_rmdir { +struct puffs_vnmsg_rmdir { struct puffs_req pvn_pr; struct puffs_kcn pvnr_cn; /* OUT */ struct puffs_kcred pvnr_cn_cred; /* OUT */ - struct puffs_kcid pvnr_cn_cid; /* OUT */ void *pvnr_cookie_targ; /* OUT */ }; -struct puffs_vnreq_link { +struct puffs_vnmsg_link { struct puffs_req pvn_pr; struct puffs_kcn pvnr_cn; /* OUT */ struct puffs_kcred pvnr_cn_cred; /* OUT */ - struct puffs_kcid pvnr_cn_cid; /* OUT */ void *pvnr_cookie_targ; /* OUT */ }; -struct puffs_vnreq_rename { +struct puffs_vnmsg_rename { struct puffs_req pvn_pr; struct puffs_kcn pvnr_cn_src; /* OUT */ struct puffs_kcred pvnr_cn_src_cred; /* OUT */ - struct puffs_kcid pvnr_cn_src_cid; /* OUT */ struct puffs_kcn pvnr_cn_targ; /* OUT */ struct puffs_kcred pvnr_cn_targ_cred; /* OUT */ - struct puffs_kcid pvnr_cn_targ_cid; /* OUT */ void *pvnr_cookie_src; /* OUT */ void *pvnr_cookie_targ; /* OUT */ void *pvnr_cookie_targdir; /* OUT */ }; -struct puffs_vnreq_symlink { +struct puffs_vnmsg_symlink { struct puffs_req pvn_pr; struct puffs_kcn pvnr_cn; /* OUT */ struct puffs_kcred pvnr_cn_cred; /* OUT */ - struct puffs_kcid pvnr_cn_cid; /* OUT */ struct vattr pvnr_va; /* OUT */ void *pvnr_newnode; /* IN */ char pvnr_link[MAXPATHLEN]; /* OUT */ }; -struct puffs_vnreq_readdir { +struct puffs_vnmsg_readdir { struct puffs_req pvn_pr; struct puffs_kcred pvnr_cred; /* OUT */ @@ -638,7 +510,7 @@ struct puffs_vnreq_readdir { __aligned(ALIGNBYTES+1); }; -struct puffs_vnreq_readlink { +struct puffs_vnmsg_readlink { struct puffs_req pvn_pr; struct puffs_kcred pvnr_cred; /* OUT */ @@ -646,32 +518,28 @@ struct puffs_vnreq_readlink { char pvnr_link[MAXPATHLEN]; /* IN, XXX */ }; -struct puffs_vnreq_reclaim { +struct puffs_vnmsg_reclaim { struct puffs_req pvn_pr; - - struct puffs_kcid pvnr_cid; /* OUT */ }; -struct puffs_vnreq_inactive { +struct puffs_vnmsg_inactive { struct puffs_req pvn_pr; - - struct puffs_kcid pvnr_cid; /* OUT */ }; -struct puffs_vnreq_print { +struct puffs_vnmsg_print { struct puffs_req pvn_pr; /* empty */ }; -struct puffs_vnreq_pathconf { +struct puffs_vnmsg_pathconf { struct puffs_req pvn_pr; int pvnr_name; /* OUT */ int pvnr_retval; /* IN */ }; -struct puffs_vnreq_advlock { +struct puffs_vnmsg_advlock { struct puffs_req pvn_pr; struct flock pvnr_fl; /* OUT */ @@ -680,12 +548,11 @@ struct puffs_vnreq_advlock { int pvnr_flags; /* OUT */ }; -struct puffs_vnreq_mmap { +struct puffs_vnmsg_mmap { struct puffs_req pvn_pr; vm_prot_t pvnr_prot; /* OUT */ struct puffs_kcred pvnr_cred; /* OUT */ - struct puffs_kcid pvnr_cid; /* OUT */ }; @@ -709,23 +576,14 @@ struct puffs_cacheinfo { #define PCACHE_TYPE_READ 0 #define PCACHE_TYPE_WRITE 1 -/* notyet */ -#if 0 -struct puffs_vnreq_kqfilter { }; -struct puffs_vnreq_islocked { }; -#endif -struct puffs_vnreq_getextattr { }; -struct puffs_vnreq_setextattr { }; -struct puffs_vnreq_listextattr { }; - -#ifdef _KERNEL -#define PUFFS_VFSREQ(a) \ - struct puffs_vfsreq_##a a##_arg; \ - memset(&a##_arg, 0, sizeof(struct puffs_vfsreq_##a)) - -#define PUFFS_VNREQ(a) \ - struct puffs_vnreq_##a a##_arg; \ - memset(&a##_arg, 0, sizeof(struct puffs_vnreq_##a)) -#endif +/* + * Error notification. Always outgoing, no response, no remorse. + */ +struct puffs_error { + struct puffs_req perr_pr; + + int perr_error; + char perr_str[256]; +}; #endif /* _FS_PUFFS_PUFFS_MSGIF_H_ */