version 1.47, 2007/07/30 09:04:58 |
version 1.47.4.8, 2007/12/09 19:38:10 |
|
|
/* $NetBSD$ */ |
/* $NetBSD$ */ |
|
|
/* |
/* |
* 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 |
* Development of this software was supported by the |
* Google Summer of Code program and the Ulla Tuominen Foundation. |
* Google Summer of Code program and the Ulla Tuominen Foundation. |
|
|
* SUCH DAMAGE. |
* SUCH DAMAGE. |
*/ |
*/ |
|
|
#ifndef _PUFFS_MSGIF_H_ |
#ifndef _FS_PUFFS_PUFFS_MSGIF_H_ |
#define _PUFFS_MSGIF_H_ |
#define _FS_PUFFS_PUFFS_MSGIF_H_ |
|
|
#include <sys/param.h> |
#include <sys/param.h> |
#include <sys/time.h> |
#include <sys/time.h> |
|
|
#include <sys/dirent.h> |
#include <sys/dirent.h> |
#include <sys/fcntl.h> |
#include <sys/fcntl.h> |
|
|
|
#include <dev/putter/putter.h> |
|
|
#include <uvm/uvm_prot.h> |
#include <uvm/uvm_prot.h> |
|
|
#define PUFFSOP_VFS 1 |
#define PUFFSOP_VFS 0x01 /* kernel-> */ |
#define PUFFSOP_VN 2 |
#define PUFFSOP_VN 0x02 /* kernel-> */ |
#define PUFFSOP_CACHE 3 |
#define PUFFSOP_CACHE 0x03 /* only kernel-> */ |
#define PUFFSOPFLAG_FAF 0x10 /* fire-and-forget */ |
#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_OPCLASS(a) ((a) & PUFFSOP_OPCMASK) |
#define PUFFSOP_WANTREPLY(a) (((a) & PUFFSOPFLAG_FAF) == 0) |
#define PUFFSOP_WANTREPLY(a) (((a) & PUFFSOPFLAG_FAF) == 0) |
|
|
|
|
}; |
}; |
#define PUFFS_VN_MAX PUFFS_VN_SETEXTATTR |
#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 PUFFSDEVELVERS 0x80000000 |
#define PUFFSVERSION 16 |
#define PUFFSVERSION 26 |
#define PUFFSNAMESIZE 32 |
#define PUFFSNAMESIZE 32 |
|
|
#define PUFFS_TYPEPREFIX "puffs|" |
#define PUFFS_TYPEPREFIX "puffs|" |
|
|
struct puffs_kargs { |
struct puffs_kargs { |
unsigned int pa_vers; |
unsigned int pa_vers; |
int pa_fd; |
int pa_fd; |
|
|
uint32_t pa_flags; |
uint32_t pa_flags; |
|
|
size_t pa_maxreqlen; |
size_t pa_maxmsglen; |
int pa_nhashbuckets; |
int pa_nhashbuckets; |
|
|
size_t pa_fhsize; |
size_t pa_fhsize; |
Line 110 struct puffs_kargs { |
|
Line 128 struct puffs_kargs { |
|
dev_t pa_root_rdev; |
dev_t pa_root_rdev; |
|
|
struct statvfs pa_svfsb; |
struct statvfs pa_svfsb; |
|
|
char pa_typename[_VFS_NAMELEN]; |
char pa_typename[_VFS_NAMELEN]; |
char pa_mntfromname[_VFS_MNAMELEN]; |
char pa_mntfromname[_VFS_MNAMELEN]; |
|
|
Line 125 struct puffs_kargs { |
|
Line 143 struct puffs_kargs { |
|
#define PUFFS_KFLAG_LOOKUP_FULLPNBUF 0x20 /* full pnbuf in lookup */ |
#define PUFFS_KFLAG_LOOKUP_FULLPNBUF 0x20 /* full pnbuf in lookup */ |
#define PUFFS_KFLAG_MASK 0x3f |
#define PUFFS_KFLAG_MASK 0x3f |
|
|
#define PUFFS_FHFLAG_DYNAMIC 0x01 |
#define PUFFS_FHFLAG_DYNAMIC 0x01 |
#define PUFFS_FHFLAG_NFSV2 0x02 |
#define PUFFS_FHFLAG_NFSV2 0x02 |
#define PUFFS_FHFLAG_NFSV3 0x04 |
#define PUFFS_FHFLAG_NFSV3 0x04 |
#define PUFFS_FHFLAG_PROTOMASK 0x06 |
#define PUFFS_FHFLAG_PROTOMASK 0x06 |
|
#define PUFFS_FHFLAG_PASSTHROUGH 0x08 |
|
#define PUFFS_FHFLAG_MASK 0x0f |
|
|
#define PUFFS_FHSIZE_MAX 1020 /* XXX: FHANDLE_SIZE_MAX - 4 */ |
#define PUFFS_FHSIZE_MAX 1020 /* XXX: FHANDLE_SIZE_MAX - 4 */ |
|
|
/* |
struct puffs_req { |
* This is the device minor number for the cloning device. Make it |
struct putter_hdr preq_pth; |
* a high number "just in case", even though we don't want to open |
|
* any specific devices currently. |
|
*/ |
|
#define PUFFS_CLONER 0x7ffff |
|
|
|
struct puffs_reqh_get { |
|
void *phg_buf; /* user buffer */ |
|
size_t phg_buflen; /* user buffer length */ |
|
|
|
int phg_nops; /* max ops user wants / number delivered */ |
|
int phg_more; /* advisory: more ops available? */ |
|
}; |
|
|
|
struct puffs_reqh_put { |
uint64_t preq_id; |
int php_nops; /* ops available / ops handled */ |
void *preq_cookie; |
|
|
/* these describe the first request */ |
uint16_t preq_opclass; |
uint64_t php_id; /* request id */ |
uint16_t preq_optype; |
void *php_buf; /* user buffer address */ |
int preq_rv; |
size_t php_buflen; /* user buffer length, hdr NOT incl. */ |
|
}; |
|
|
|
/* |
uint32_t preq_setbacks; |
* 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 { |
/* Who is making the call? Eventually host id is also needed. */ |
struct { |
pid_t preq_pid; |
uint8_t opclass; /* cur */ |
lwpid_t preq_lid; |
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 |
* the following helper pads the struct size to md alignment |
* multiple (should size_t not cut it). it makes sure that |
* multiple (should size_t not cut it). it makes sure that |
* whatever comes after this struct is aligned |
* whatever comes after this struct is aligned |
*/ |
*/ |
|
size_t preq_buflen; |
uint8_t preq_buf[0] __aligned(ALIGNBYTES+1); |
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_N1 0x01 /* set VOP_INACTIVE for node 1 */ |
#define PUFFS_SETBACK_INACT_N2 0x02 /* set VOP_INACTIVE for node 2 */ |
#define PUFFS_SETBACK_INACT_N2 0x02 /* set VOP_INACTIVE for node 2 */ |
Line 260 struct puffs_req { |
|
Line 184 struct puffs_req { |
|
#define PUFFS_SETBACK_MASK 0x0f |
#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: |
* Flush operation. This can be used to invalidate: |
* 1) name cache for one node |
* 1) name cache for one node |
* 2) name cache for all children |
* 2) name cache for all children |
Line 286 struct puffs_sizeop { |
|
Line 198 struct puffs_sizeop { |
|
|
|
/* XXX: needs restructuring */ |
/* XXX: needs restructuring */ |
struct puffs_flush { |
struct puffs_flush { |
void *pf_cookie; |
struct puffs_req pf_req; |
|
|
|
void *pf_cookie; |
|
|
int pf_op; |
int pf_op; |
off_t pf_start; |
off_t pf_start; |
off_t pf_end; |
off_t pf_end; |
}; |
}; |
#define PUFFS_INVAL_NAMECACHE_NODE 0 |
#define PUFFS_INVAL_NAMECACHE_NODE 0 |
#define PUFFS_INVAL_NAMECACHE_DIR 1 |
#define PUFFS_INVAL_NAMECACHE_DIR 1 |
Line 298 struct puffs_flush { |
|
Line 212 struct puffs_flush { |
|
#define PUFFS_INVAL_PAGECACHE_NODE_RANGE 3 |
#define PUFFS_INVAL_PAGECACHE_NODE_RANGE 3 |
#define PUFFS_FLUSH_PAGECACHE_NODE_RANGE 4 |
#define PUFFS_FLUSH_PAGECACHE_NODE_RANGE 4 |
|
|
|
/* keep this for now */ |
/* |
#define PUFFSREQSIZEOP _IOR ('p', 1, size_t) |
* 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) |
|
|
|
|
|
/* |
/* |
* Credentials for an operation. Can be either struct uucred for |
* Credentials for an operation. Can be either struct uucred for |
Line 333 struct puffs_kcred { |
|
Line 235 struct puffs_kcred { |
|
* 2*MAXPHYS is the max size the system will attempt to copy, |
* 2*MAXPHYS is the max size the system will attempt to copy, |
* else treated as garbage |
* else treated as garbage |
*/ |
*/ |
#define PUFFS_REQ_MAXSIZE 2*MAXPHYS |
#define PUFFS_MSG_MAXSIZE 2*MAXPHYS |
#define PUFFS_REQSTRUCT_MAX 4096 /* XXX: approxkludge */ |
#define PUFFS_MSGSTRUCT_MAX 4096 /* XXX: approxkludge */ |
|
|
#define PUFFS_TOMOVE(a,b) (MIN((a), b->pmp_req_maxsize - PUFFS_REQSTRUCT_MAX)) |
|
|
|
/* caller id */ |
#define PUFFS_TOMOVE(a,b) (MIN((a), b->pmp_msg_maxsize - PUFFS_MSGSTRUCT_MAX)) |
struct puffs_kcid { |
|
int pkcid_type; |
|
pid_t pkcid_pid; |
|
lwpid_t pkcid_lwpid; |
|
}; |
|
#define PUFFCID_TYPE_REAL 1 |
|
#define PUFFCID_TYPE_FAKE 2 |
|
|
|
/* puffs struct componentname built by kernel */ |
/* puffs struct componentname built by kernel */ |
struct puffs_kcn { |
struct puffs_kcn { |
/* args */ |
/* args */ |
u_long pkcn_nameiop; /* namei operation */ |
uint32_t pkcn_nameiop; /* namei operation */ |
u_long pkcn_flags; /* flags */ |
uint32_t pkcn_flags; /* flags */ |
|
|
char pkcn_name[MAXPATHLEN]; /* nulterminated path component */ |
char pkcn_name[MAXPATHLEN]; /* nulterminated path component */ |
long pkcn_namelen; /* current component length */ |
size_t pkcn_namelen; /* current component length */ |
long pkcn_consume; /* IN: extra chars server ate */ |
size_t pkcn_consume; /* IN: extra chars server ate */ |
}; |
}; |
|
|
/* |
|
* XXX: figure out what to do with these, copied from namei.h for now |
|
*/ |
|
#define PUFFSLOOKUP_LOOKUP 0 /* perform name lookup only */ |
|
#define PUFFSLOOKUP_CREATE 1 /* setup for file creation */ |
|
#define PUFFSLOOKUP_DELETE 2 /* setup for file deletion */ |
|
#define PUFFSLOOKUP_RENAME 3 /* setup for file renaming */ |
|
#define PUFFSLOOKUP_OPMASK 3 /* mask for operation */ |
|
|
|
#define PUFFSLOOKUP_FOLLOW 0x00004 /* follow final symlink */ |
|
#define PUFFSLOOKUP_NOFOLLOW 0x00008 /* don't follow final symlink */ |
|
#define PUFFSLOOKUP_ISLASTCN 0x08000 /* is last component of lookup */ |
|
#define PUFFSLOOKUP_REQUIREDIR 0x80000 /* must be directory */ |
|
|
|
|
|
/* |
/* |
* Next come the individual requests. They are all subclassed from |
* Next come the individual requests. They are all subclassed from |
Line 387 struct puffs_kcn { |
|
Line 266 struct puffs_kcn { |
|
/* |
/* |
* aux structures for vfs operations. |
* aux structures for vfs operations. |
*/ |
*/ |
struct puffs_vfsreq_unmount { |
struct puffs_vfsmsg_unmount { |
struct puffs_req pvfsr_pr; |
struct puffs_req pvfsr_pr; |
|
|
int pvfsr_flags; |
int pvfsr_flags; |
struct puffs_kcid pvfsr_cid; |
|
}; |
}; |
|
|
struct puffs_vfsreq_statvfs { |
struct puffs_vfsmsg_statvfs { |
struct puffs_req pvfsr_pr; |
struct puffs_req pvfsr_pr; |
|
|
struct statvfs pvfsr_sb; |
struct statvfs pvfsr_sb; |
struct puffs_kcid pvfsr_cid; |
|
}; |
}; |
|
|
struct puffs_vfsreq_sync { |
struct puffs_vfsmsg_sync { |
struct puffs_req pvfsr_pr; |
struct puffs_req pvfsr_pr; |
|
|
struct puffs_kcred pvfsr_cred; |
struct puffs_kcred pvfsr_cred; |
struct puffs_kcid pvfsr_cid; |
|
int pvfsr_waitfor; |
int pvfsr_waitfor; |
}; |
}; |
|
|
struct puffs_vfsreq_fhtonode { |
struct puffs_vfsmsg_fhtonode { |
struct puffs_req pvfsr_pr; |
struct puffs_req pvfsr_pr; |
|
|
void *pvfsr_fhcookie; /* IN */ |
void *pvfsr_fhcookie; /* IN */ |
Line 422 struct puffs_vfsreq_fhtonode { |
|
Line 298 struct puffs_vfsreq_fhtonode { |
|
__aligned(ALIGNBYTES+1); |
__aligned(ALIGNBYTES+1); |
}; |
}; |
|
|
struct puffs_vfsreq_nodetofh { |
struct puffs_vfsmsg_nodetofh { |
struct puffs_req pvfsr_pr; |
struct puffs_req pvfsr_pr; |
|
|
void *pvfsr_fhcookie; /* OUT */ |
void *pvfsr_fhcookie; /* OUT */ |
Line 432 struct puffs_vfsreq_nodetofh { |
|
Line 308 struct puffs_vfsreq_nodetofh { |
|
__aligned(ALIGNBYTES+1); |
__aligned(ALIGNBYTES+1); |
}; |
}; |
|
|
struct puffs_vfsreq_suspend { |
struct puffs_vfsmsg_suspend { |
struct puffs_req pvfsr_pr; |
struct puffs_req pvfsr_pr; |
|
|
int pvfsr_status; |
int pvfsr_status; |
Line 446 struct puffs_vfsreq_suspend { |
|
Line 322 struct puffs_vfsreq_suspend { |
|
* aux structures for vnode operations. |
* aux structures for vnode operations. |
*/ |
*/ |
|
|
struct puffs_vnreq_lookup { |
struct puffs_vnmsg_lookup { |
struct puffs_req pvn_pr; |
struct puffs_req pvn_pr; |
|
|
struct puffs_kcn pvnr_cn; /* OUT */ |
struct puffs_kcn pvnr_cn; /* OUT */ |
struct puffs_kcred pvnr_cn_cred; /* OUT */ |
struct puffs_kcred pvnr_cn_cred; /* OUT */ |
struct puffs_kcid pvnr_cn_cid; /* OUT */ |
|
|
|
void *pvnr_newnode; /* IN */ |
void *pvnr_newnode; /* IN */ |
enum vtype pvnr_vtype; /* IN */ |
enum vtype pvnr_vtype; /* IN */ |
Line 459 struct puffs_vnreq_lookup { |
|
Line 334 struct puffs_vnreq_lookup { |
|
dev_t pvnr_rdev; /* IN */ |
dev_t pvnr_rdev; /* IN */ |
}; |
}; |
|
|
struct puffs_vnreq_create { |
struct puffs_vnmsg_create { |
struct puffs_req pvn_pr; |
struct puffs_req pvn_pr; |
|
|
struct puffs_kcn pvnr_cn; /* OUT */ |
struct puffs_kcn pvnr_cn; /* OUT */ |
struct puffs_kcred pvnr_cn_cred; /* OUT */ |
struct puffs_kcred pvnr_cn_cred; /* OUT */ |
struct puffs_kcid pvnr_cn_cid; /* OUT */ |
|
|
|
struct vattr pvnr_va; /* OUT */ |
struct vattr pvnr_va; /* OUT */ |
void *pvnr_newnode; /* IN */ |
void *pvnr_newnode; /* IN */ |
}; |
}; |
|
|
struct puffs_vnreq_mknod { |
struct puffs_vnmsg_mknod { |
struct puffs_req pvn_pr; |
struct puffs_req pvn_pr; |
|
|
struct puffs_kcn pvnr_cn; /* OUT */ |
struct puffs_kcn pvnr_cn; /* OUT */ |
struct puffs_kcred pvnr_cn_cred; /* OUT */ |
struct puffs_kcred pvnr_cn_cred; /* OUT */ |
struct puffs_kcid pvnr_cn_cid; /* OUT */ |
|
|
|
struct vattr pvnr_va; /* OUT */ |
struct vattr pvnr_va; /* OUT */ |
void *pvnr_newnode; /* IN */ |
void *pvnr_newnode; /* IN */ |
}; |
}; |
|
|
struct puffs_vnreq_open { |
struct puffs_vnmsg_open { |
struct puffs_req pvn_pr; |
struct puffs_req pvn_pr; |
|
|
struct puffs_kcred pvnr_cred; /* OUT */ |
struct puffs_kcred pvnr_cred; /* OUT */ |
struct puffs_kcid pvnr_cid; /* OUT */ |
|
int pvnr_mode; /* OUT */ |
int pvnr_mode; /* OUT */ |
}; |
}; |
|
|
struct puffs_vnreq_close { |
struct puffs_vnmsg_close { |
struct puffs_req pvn_pr; |
struct puffs_req pvn_pr; |
|
|
struct puffs_kcred pvnr_cred; /* OUT */ |
struct puffs_kcred pvnr_cred; /* OUT */ |
struct puffs_kcid pvnr_cid; /* OUT */ |
|
int pvnr_fflag; /* OUT */ |
int pvnr_fflag; /* OUT */ |
}; |
}; |
|
|
struct puffs_vnreq_access { |
struct puffs_vnmsg_access { |
struct puffs_req pvn_pr; |
struct puffs_req pvn_pr; |
|
|
struct puffs_kcred pvnr_cred; /* OUT */ |
struct puffs_kcred pvnr_cred; /* OUT */ |
struct puffs_kcid pvnr_cid; /* OUT */ |
|
int pvnr_mode; /* OUT */ |
int pvnr_mode; /* OUT */ |
}; |
}; |
|
|
#define puffs_vnreq_setattr puffs_vnreq_setgetattr |
#define puffs_vnmsg_setattr puffs_vnmsg_setgetattr |
#define puffs_vnreq_getattr puffs_vnreq_setgetattr |
#define puffs_vnmsg_getattr puffs_vnmsg_setgetattr |
struct puffs_vnreq_setgetattr { |
struct puffs_vnmsg_setgetattr { |
struct puffs_req pvn_pr; |
struct puffs_req pvn_pr; |
|
|
struct puffs_kcred pvnr_cred; /* OUT */ |
struct puffs_kcred pvnr_cred; /* OUT */ |
struct puffs_kcid pvnr_cid; /* OUT */ |
|
struct vattr pvnr_va; /* IN/OUT (op depend) */ |
struct vattr pvnr_va; /* IN/OUT (op depend) */ |
}; |
}; |
|
|
#define puffs_vnreq_read puffs_vnreq_readwrite |
#define puffs_vnmsg_read puffs_vnmsg_rw |
#define puffs_vnreq_write puffs_vnreq_readwrite |
#define puffs_vnmsg_write puffs_vnmsg_rw |
struct puffs_vnreq_readwrite { |
struct puffs_vnmsg_rw { |
struct puffs_req pvn_pr; |
struct puffs_req pvn_pr; |
|
|
struct puffs_kcred pvnr_cred; /* OUT */ |
struct puffs_kcred pvnr_cred; /* OUT */ |
Line 528 struct puffs_vnreq_readwrite { |
|
Line 397 struct puffs_vnreq_readwrite { |
|
uint8_t pvnr_data[0]; /* IN/OUT (wr/rd) */ |
uint8_t pvnr_data[0]; /* IN/OUT (wr/rd) */ |
}; |
}; |
|
|
#define puffs_vnreq_ioctl puffs_vnreq_fcnioctl |
#define puffs_vnmsg_ioctl puffs_vnreq_fcnioctl |
#define puffs_vnreq_fcntl puffs_vnreq_fcnioctl |
#define puffs_vnmsg_fcntl puffs_vnreq_fcnioctl |
struct puffs_vnreq_fcnioctl { |
struct puffs_vnmsg_fcnioctl { |
struct puffs_req pvn_pr; |
struct puffs_req pvn_pr; |
|
|
struct puffs_kcred pvnr_cred; |
struct puffs_kcred pvnr_cred; |
Line 543 struct puffs_vnreq_fcnioctl { |
|
Line 412 struct puffs_vnreq_fcnioctl { |
|
int pvnr_copyback; |
int pvnr_copyback; |
}; |
}; |
|
|
struct puffs_vnreq_poll { |
struct puffs_vnmsg_poll { |
struct puffs_req pvn_pr; |
struct puffs_req pvn_pr; |
|
|
int pvnr_events; /* IN/OUT */ |
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_req pvn_pr; |
|
|
struct puffs_kcred pvnr_cred; /* OUT */ |
struct puffs_kcred pvnr_cred; /* OUT */ |
struct puffs_kcid pvnr_cid; /* OUT */ |
|
off_t pvnr_offlo; /* OUT */ |
off_t pvnr_offlo; /* OUT */ |
off_t pvnr_offhi; /* OUT */ |
off_t pvnr_offhi; /* OUT */ |
int pvnr_flags; /* OUT */ |
int pvnr_flags; /* OUT */ |
}; |
}; |
|
|
struct puffs_vnreq_seek { |
struct puffs_vnmsg_seek { |
struct puffs_req pvn_pr; |
struct puffs_req pvn_pr; |
|
|
struct puffs_kcred pvnr_cred; /* OUT */ |
struct puffs_kcred pvnr_cred; /* OUT */ |
Line 568 struct puffs_vnreq_seek { |
|
Line 435 struct puffs_vnreq_seek { |
|
off_t pvnr_newoff; /* OUT */ |
off_t pvnr_newoff; /* OUT */ |
}; |
}; |
|
|
struct puffs_vnreq_remove { |
struct puffs_vnmsg_remove { |
struct puffs_req pvn_pr; |
struct puffs_req pvn_pr; |
|
|
struct puffs_kcn pvnr_cn; /* OUT */ |
struct puffs_kcn pvnr_cn; /* OUT */ |
struct puffs_kcred pvnr_cn_cred; /* OUT */ |
struct puffs_kcred pvnr_cn_cred; /* OUT */ |
struct puffs_kcid pvnr_cn_cid; /* OUT */ |
|
|
|
void *pvnr_cookie_targ; /* OUT */ |
void *pvnr_cookie_targ; /* OUT */ |
}; |
}; |
|
|
struct puffs_vnreq_mkdir { |
struct puffs_vnmsg_mkdir { |
struct puffs_req pvn_pr; |
struct puffs_req pvn_pr; |
|
|
struct puffs_kcn pvnr_cn; /* OUT */ |
struct puffs_kcn pvnr_cn; /* OUT */ |
struct puffs_kcred pvnr_cn_cred; /* OUT */ |
struct puffs_kcred pvnr_cn_cred; /* OUT */ |
struct puffs_kcid pvnr_cn_cid; /* OUT */ |
|
|
|
struct vattr pvnr_va; /* OUT */ |
struct vattr pvnr_va; /* OUT */ |
void *pvnr_newnode; /* IN */ |
void *pvnr_newnode; /* IN */ |
}; |
}; |
|
|
struct puffs_vnreq_rmdir { |
struct puffs_vnmsg_rmdir { |
struct puffs_req pvn_pr; |
struct puffs_req pvn_pr; |
|
|
struct puffs_kcn pvnr_cn; /* OUT */ |
struct puffs_kcn pvnr_cn; /* OUT */ |
struct puffs_kcred pvnr_cn_cred; /* OUT */ |
struct puffs_kcred pvnr_cn_cred; /* OUT */ |
struct puffs_kcid pvnr_cn_cid; /* OUT */ |
|
|
|
void *pvnr_cookie_targ; /* OUT */ |
void *pvnr_cookie_targ; /* OUT */ |
}; |
}; |
|
|
struct puffs_vnreq_link { |
struct puffs_vnmsg_link { |
struct puffs_req pvn_pr; |
struct puffs_req pvn_pr; |
|
|
struct puffs_kcn pvnr_cn; /* OUT */ |
struct puffs_kcn pvnr_cn; /* OUT */ |
struct puffs_kcred pvnr_cn_cred; /* OUT */ |
struct puffs_kcred pvnr_cn_cred; /* OUT */ |
struct puffs_kcid pvnr_cn_cid; /* OUT */ |
|
|
|
void *pvnr_cookie_targ; /* OUT */ |
void *pvnr_cookie_targ; /* OUT */ |
}; |
}; |
|
|
struct puffs_vnreq_rename { |
struct puffs_vnmsg_rename { |
struct puffs_req pvn_pr; |
struct puffs_req pvn_pr; |
|
|
struct puffs_kcn pvnr_cn_src; /* OUT */ |
struct puffs_kcn pvnr_cn_src; /* OUT */ |
struct puffs_kcred pvnr_cn_src_cred; /* 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_kcn pvnr_cn_targ; /* OUT */ |
struct puffs_kcred pvnr_cn_targ_cred; /* 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_src; /* OUT */ |
void *pvnr_cookie_targ; /* OUT */ |
void *pvnr_cookie_targ; /* OUT */ |
void *pvnr_cookie_targdir; /* OUT */ |
void *pvnr_cookie_targdir; /* OUT */ |
}; |
}; |
|
|
struct puffs_vnreq_symlink { |
struct puffs_vnmsg_symlink { |
struct puffs_req pvn_pr; |
struct puffs_req pvn_pr; |
|
|
struct puffs_kcn pvnr_cn; /* OUT */ |
struct puffs_kcn pvnr_cn; /* OUT */ |
struct puffs_kcred pvnr_cn_cred; /* OUT */ |
struct puffs_kcred pvnr_cn_cred; /* OUT */ |
struct puffs_kcid pvnr_cn_cid; /* OUT */ |
|
|
|
struct vattr pvnr_va; /* OUT */ |
struct vattr pvnr_va; /* OUT */ |
void *pvnr_newnode; /* IN */ |
void *pvnr_newnode; /* IN */ |
char pvnr_link[MAXPATHLEN]; /* OUT */ |
char pvnr_link[MAXPATHLEN]; /* OUT */ |
}; |
}; |
|
|
struct puffs_vnreq_readdir { |
struct puffs_vnmsg_readdir { |
struct puffs_req pvn_pr; |
struct puffs_req pvn_pr; |
|
|
struct puffs_kcred pvnr_cred; /* OUT */ |
struct puffs_kcred pvnr_cred; /* OUT */ |
Line 650 struct puffs_vnreq_readdir { |
|
Line 510 struct puffs_vnreq_readdir { |
|
__aligned(ALIGNBYTES+1); |
__aligned(ALIGNBYTES+1); |
}; |
}; |
|
|
struct puffs_vnreq_readlink { |
struct puffs_vnmsg_readlink { |
struct puffs_req pvn_pr; |
struct puffs_req pvn_pr; |
|
|
struct puffs_kcred pvnr_cred; /* OUT */ |
struct puffs_kcred pvnr_cred; /* OUT */ |
Line 658 struct puffs_vnreq_readlink { |
|
Line 518 struct puffs_vnreq_readlink { |
|
char pvnr_link[MAXPATHLEN]; /* IN, XXX */ |
char pvnr_link[MAXPATHLEN]; /* IN, XXX */ |
}; |
}; |
|
|
struct puffs_vnreq_reclaim { |
struct puffs_vnmsg_reclaim { |
struct puffs_req pvn_pr; |
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_req pvn_pr; |
|
|
struct puffs_kcid pvnr_cid; /* OUT */ |
|
}; |
}; |
|
|
struct puffs_vnreq_print { |
struct puffs_vnmsg_print { |
struct puffs_req pvn_pr; |
struct puffs_req pvn_pr; |
|
|
/* empty */ |
/* empty */ |
}; |
}; |
|
|
struct puffs_vnreq_pathconf { |
struct puffs_vnmsg_pathconf { |
struct puffs_req pvn_pr; |
struct puffs_req pvn_pr; |
|
|
int pvnr_name; /* OUT */ |
int pvnr_name; /* OUT */ |
int pvnr_retval; /* IN */ |
int pvnr_retval; /* IN */ |
}; |
}; |
|
|
struct puffs_vnreq_advlock { |
struct puffs_vnmsg_advlock { |
struct puffs_req pvn_pr; |
struct puffs_req pvn_pr; |
|
|
struct flock pvnr_fl; /* OUT */ |
struct flock pvnr_fl; /* OUT */ |
Line 692 struct puffs_vnreq_advlock { |
|
Line 548 struct puffs_vnreq_advlock { |
|
int pvnr_flags; /* OUT */ |
int pvnr_flags; /* OUT */ |
}; |
}; |
|
|
struct puffs_vnreq_mmap { |
struct puffs_vnmsg_mmap { |
struct puffs_req pvn_pr; |
struct puffs_req pvn_pr; |
|
|
vm_prot_t pvnr_prot; /* OUT */ |
vm_prot_t pvnr_prot; /* OUT */ |
struct puffs_kcred pvnr_cred; /* OUT */ |
struct puffs_kcred pvnr_cred; /* OUT */ |
struct puffs_kcid pvnr_cid; /* OUT */ |
|
}; |
}; |
|
|
|
|
Line 721 struct puffs_cacheinfo { |
|
Line 576 struct puffs_cacheinfo { |
|
#define PCACHE_TYPE_READ 0 |
#define PCACHE_TYPE_READ 0 |
#define PCACHE_TYPE_WRITE 1 |
#define PCACHE_TYPE_WRITE 1 |
|
|
/* notyet */ |
/* |
#if 0 |
* Error notification. Always outgoing, no response, no remorse. |
struct puffs_vnreq_kqfilter { }; |
*/ |
struct puffs_vnreq_islocked { }; |
struct puffs_error { |
#endif |
struct puffs_req perr_pr; |
struct puffs_vnreq_getextattr { }; |
|
struct puffs_vnreq_setextattr { }; |
int perr_error; |
struct puffs_vnreq_listextattr { }; |
char perr_str[256]; |
|
}; |
#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 |
|
|
|
#endif /* _PUFFS_MSGIF_H_ */ |
#endif /* _FS_PUFFS_PUFFS_MSGIF_H_ */ |