#ifndef _FS_PUFFS_PUFFS_MSGIF_H_
#define _FS_PUFFS_PUFFS_MSGIF_H_
#include <sys/param.h>
#include <sys/time.h>
#include <sys/ioccom.h>
#include <sys/uio.h>
#include <sys/vnode.h>
#include <sys/ucred.h>
#include <sys/statvfs.h>
#include <sys/dirent.h>
#include <sys/fcntl.h>
#include <dev/putter/putter.h>
#include <uvm/uvm_prot.h>
#define PUFFSOP_VFS 0x01
#define PUFFSOP_VN 0x02
#define PUFFSOP_CACHE 0x03
#define PUFFSOP_ERROR 0x04
#define PUFFSOP_FLUSH 0x05
#define PUFFSOP_SUSPEND 0x06
#define PUFFSOP_UNMOUNT 0x07
#define PUFFSOPFLAG_FAF 0x10
#define PUFFSOPFLAG_ISRESPONSE 0x20
#define PUFFSOP_OPCMASK 0x07
#define PUFFSOP_OPCLASS(a) ((a) & PUFFSOP_OPCMASK)
#define PUFFSOP_WANTREPLY(a) (((a) & PUFFSOPFLAG_FAF) == 0)
enum puffs_vfs {
PUFFS_VFS_MOUNT, PUFFS_VFS_START, PUFFS_VFS_UNMOUNT,
PUFFS_VFS_ROOT, PUFFS_VFS_QUOTACTL, PUFFS_VFS_STATVFS,
PUFFS_VFS_SYNC, PUFFS_VFS_VGET, PUFFS_VFS_FHTOVP,
PUFFS_VFS_VPTOFH, PUFFS_VFS_INIT, PUFFS_VFS_DONE,
PUFFS_VFS_SNAPSHOT, PUFFS_VFS_EXTATTRCTL, PUFFS_VFS_SUSPEND
};
#define PUFFS_VFS_MAX PUFFS_VFS_SUSPEND
enum puffs_vn {
PUFFS_VN_LOOKUP, PUFFS_VN_CREATE, PUFFS_VN_MKNOD,
PUFFS_VN_OPEN, PUFFS_VN_CLOSE, PUFFS_VN_ACCESS,
PUFFS_VN_GETATTR, PUFFS_VN_SETATTR, PUFFS_VN_READ,
PUFFS_VN_WRITE, PUFFS_VN_IOCTL, PUFFS_VN_FCNTL,
PUFFS_VN_POLL, PUFFS_VN_KQFILTER, PUFFS_VN_REVOKE,
PUFFS_VN_MMAP, PUFFS_VN_FSYNC, PUFFS_VN_SEEK,
PUFFS_VN_REMOVE, PUFFS_VN_LINK, PUFFS_VN_RENAME,
PUFFS_VN_MKDIR, PUFFS_VN_RMDIR, PUFFS_VN_SYMLINK,
PUFFS_VN_READDIR, PUFFS_VN_READLINK, PUFFS_VN_ABORTOP,
PUFFS_VN_INACTIVE, PUFFS_VN_RECLAIM, PUFFS_VN_LOCK,
PUFFS_VN_UNLOCK, PUFFS_VN_BMAP, PUFFS_VN_STRATEGY,
PUFFS_VN_PRINT, PUFFS_VN_ISLOCKED, PUFFS_VN_PATHCONF,
PUFFS_VN_ADVLOCK, PUFFS_VN_LEASE, PUFFS_VN_WHITEOUT,
PUFFS_VN_GETPAGES, PUFFS_VN_PUTPAGES, PUFFS_VN_GETEXTATTR,
PUFFS_VN_LISTEXTATTR, PUFFS_VN_OPENEXTATTR, PUFFS_VN_DELETEEXTATTR,
PUFFS_VN_SETEXTATTR, PUFFS_VN_CLOSEEXTATTR, PUFFS_VN_FALLOCATE,
PUFFS_VN_FDISCARD,
};
#define PUFFS_VN_MAX PUFFS_VN_FDISCARD
#define PUFFS_VN_SPARE 30
enum puffs_err {
PUFFS_ERR_ERROR,
PUFFS_ERR_MAKENODE, PUFFS_ERR_LOOKUP, PUFFS_ERR_READDIR,
PUFFS_ERR_READLINK, PUFFS_ERR_READ, PUFFS_ERR_WRITE,
PUFFS_ERR_VPTOFH, PUFFS_ERR_GETEXTATTR, PUFFS_ERR_LISTEXTATTR
};
#define PUFFS_ERR_MAX PUFFS_ERR_LISTEXTATTR
#define PUFFSVERSION 30
#define PUFFSNAMESIZE 32
#define PUFFS_TYPEPREFIX "puffs|"
#define PUFFS_TYPELEN (_VFS_NAMELEN - (sizeof(PUFFS_TYPEPREFIX)+1))
#define PUFFS_NAMELEN (_VFS_MNAMELEN-1)
struct puffs_statvfs {
unsigned long f_flag;
unsigned long f_bsize;
unsigned long f_frsize;
unsigned long f_iosize;
fsblkcnt_t f_blocks;
fsblkcnt_t f_bfree;
fsblkcnt_t f_bavail;
fsblkcnt_t f_bresvd;
fsfilcnt_t f_files;
fsfilcnt_t f_ffree;
fsfilcnt_t f_favail;
fsfilcnt_t f_fresvd;
uint64_t f_syncreads;
uint64_t f_syncwrites;
uint64_t f_asyncreads;
uint64_t f_asyncwrites;
fsid_t f_fsidx;
unsigned long f_fsid;
unsigned long f_namemax;
uid_t f_owner;
uint32_t f_spare[4];
char f_fstypename[_VFS_NAMELEN];
char f_mntonname[_VFS_MNAMELEN];
char f_mntfromname[_VFS_MNAMELEN];
};
#ifndef _KERNEL
#include <string.h>
#endif
static __inline void
statvfs_to_puffs_statvfs(const struct statvfs *s, struct puffs_statvfs *ps)
{
ps->f_flag = s->f_flag;
ps->f_bsize = s->f_bsize;
ps->f_frsize = s->f_frsize;
ps->f_iosize = s->f_iosize;
ps->f_blocks = s->f_blocks;
ps->f_bfree = s->f_bfree;
ps->f_bavail = s->f_bavail;
ps->f_bresvd = s->f_bresvd;
ps->f_files = s->f_files;
ps->f_ffree = s->f_ffree;
ps->f_favail = s->f_favail;
ps->f_fresvd = s->f_fresvd;
ps->f_syncreads = s->f_syncreads;
ps->f_syncwrites = s->f_syncwrites;
ps->f_asyncreads = s->f_asyncreads;
ps->f_asyncwrites = s->f_asyncwrites;
ps->f_fsidx = s->f_fsidx;
ps->f_fsid = s->f_fsid;
ps->f_namemax = s->f_namemax;
ps->f_owner = s->f_owner;
memset(ps->f_spare, 0, sizeof(ps->f_spare));
memcpy(ps->f_fstypename, s->f_fstypename, sizeof(ps->f_fstypename));
memcpy(ps->f_mntonname, s->f_mntonname, sizeof(ps->f_mntonname));
memcpy(ps->f_mntfromname, s->f_mntfromname, sizeof(ps->f_mntfromname));
}
static __inline void
puffs_statvfs_to_statvfs(const struct puffs_statvfs *ps, struct statvfs *s)
{
s->f_flag = ps->f_flag;
s->f_bsize = ps->f_bsize;
s->f_frsize = ps->f_frsize;
s->f_iosize = ps->f_iosize;
s->f_blocks = ps->f_blocks;
s->f_bfree = ps->f_bfree;
s->f_bavail = ps->f_bavail;
s->f_bresvd = ps->f_bresvd;
s->f_files = ps->f_files;
s->f_ffree = ps->f_ffree;
s->f_favail = ps->f_favail;
s->f_fresvd = ps->f_fresvd;
s->f_syncreads = ps->f_syncreads;
s->f_syncwrites = ps->f_syncwrites;
s->f_asyncreads = ps->f_asyncreads;
s->f_asyncwrites = ps->f_asyncwrites;
s->f_fsidx = ps->f_fsidx;
s->f_fsid = ps->f_fsid;
s->f_namemax = ps->f_namemax;
s->f_owner = ps->f_owner;
memset(s->f_spare, 0, sizeof(s->f_spare));
memcpy(s->f_fstypename, ps->f_fstypename, sizeof(s->f_fstypename));
memcpy(s->f_mntonname, ps->f_mntonname, sizeof(s->f_mntonname));
memcpy(s->f_mntfromname, ps->f_mntfromname, sizeof(s->f_mntfromname));
memset(s->f_mntfromlabel, 0, sizeof(s->f_mntfromlabel));
}
typedef void *puffs_cookie_t;
typedef puffs_cookie_t puffs_croissant_t;
struct puffs_kargs {
unsigned int pa_vers;
int pa_fd;
uint32_t pa_flags;
size_t pa_maxmsglen;
int pa_nhashbuckets;
size_t pa_fhsize;
int pa_fhflags;
uint8_t pa_vnopmask[PUFFS_VN_MAX + PUFFS_VN_SPARE];
char pa_typename[_VFS_NAMELEN];
char pa_mntfromname[_VFS_MNAMELEN];
puffs_cookie_t pa_root_cookie;
enum vtype pa_root_vtype;
voff_t pa_root_vsize;
union {
dev_t dev;
uint64_t container;
} devunion;
struct puffs_statvfs pa_svfsb;
uint32_t pa_time32;
uint32_t pa_spare[127];
};
#define pa_root_rdev devunion.dev
#define PUFFS_KFLAG_NOCACHE_NAME 0x001
#define PUFFS_KFLAG_NOCACHE_PAGE 0x002
#define PUFFS_KFLAG_NOCACHE 0x003
#define PUFFS_KFLAG_ALLOPS 0x004
#define PUFFS_KFLAG_WTCACHE 0x008
#define PUFFS_KFLAG_IAONDEMAND 0x010
#define PUFFS_KFLAG_LOOKUP_FULLPNBUF 0x020
#define PUFFS_KFLAG_NOCACHE_ATTR 0x040
#define PUFFS_KFLAG_CACHE_FS_TTL 0x080
#define PUFFS_KFLAG_CACHE_DOTDOT 0x100
#define PUFFS_KFLAG_NOFLUSH_META 0x200
#define PUFFS_KFLAG_MASK 0x3bf
#define PUFFS_FHFLAG_DYNAMIC 0x01
#define PUFFS_FHFLAG_NFSV2 0x02
#define PUFFS_FHFLAG_NFSV3 0x04
#define PUFFS_FHFLAG_PROTOMASK 0x06
#define PUFFS_FHFLAG_PASSTHROUGH 0x08
#define PUFFS_FHFLAG_MASK 0x0f
#define PUFFS_FHSIZE_MAX 1020
struct puffs_req {
struct putter_hdr preq_pth;
uint64_t preq_id;
puffs_cookie_t preq_cookie;
uint16_t preq_opclass;
uint16_t preq_optype;
int preq_rv;
uint32_t preq_setbacks;
pid_t preq_pid;
lwpid_t preq_lid;
size_t preq_buflen;
uint8_t preq_buf[0] __aligned(ALIGNBYTES+1);
};
#define PUFFS_SETBACK_INACT_N1 0x01
#define PUFFS_SETBACK_INACT_N2 0x02
#define PUFFS_SETBACK_NOREF_N1 0x04
#define PUFFS_SETBACK_NOREF_N2 0x08
#define PUFFS_SETBACK_MASK 0x0f
struct puffs_flush {
struct puffs_req pf_req;
puffs_cookie_t 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
#define PUFFS_INVAL_NAMECACHE_ALL 2
#define PUFFS_INVAL_PAGECACHE_NODE_RANGE 3
#define PUFFS_FLUSH_PAGECACHE_NODE_RANGE 4
struct puffs_kcred {
struct uucred pkcr_uuc;
uint8_t pkcr_type;
uint8_t pkcr_internal;
};
#define PUFFCRED_TYPE_UUC 1
#define PUFFCRED_TYPE_INTERNAL 2
#define PUFFCRED_CRED_NOCRED 1
#define PUFFCRED_CRED_FSCRED 2
#define PUFFS_MSG_MAXSIZE 2*MAXPHYS
#define PUFFS_MSGSTRUCT_MAX 4096
#define PUFFS_EXTNAMELEN KERNEL_NAME_MAX
#define PUFFS_TOMOVE(a,b) (MIN((a), b->pmp_msg_maxsize - PUFFS_MSGSTRUCT_MAX))
struct puffs_kcn {
uint32_t pkcn_nameiop;
uint32_t pkcn_flags;
char pkcn_name[MAXPATHLEN];
size_t pkcn_namelen;
size_t pkcn_consume;
};
struct puffs_vfsmsg_unmount {
struct puffs_req pvfsr_pr;
int pvfsr_flags;
};
struct puffs_vfsmsg_statvfs {
struct puffs_req pvfsr_pr;
struct puffs_statvfs pvfsr_sb;
};
struct puffs_vfsmsg_sync {
struct puffs_req pvfsr_pr;
struct puffs_kcred pvfsr_cred;
int pvfsr_waitfor;
};
struct puffs_vfsmsg_fhtonode {
struct puffs_req pvfsr_pr;
void *pvfsr_fhcookie;
enum vtype pvfsr_vtype;
voff_t pvfsr_size;
dev_t pvfsr_rdev;
size_t pvfsr_dsize;
uint8_t pvfsr_data[0]
__aligned(ALIGNBYTES+1);
};
struct puffs_vfsmsg_nodetofh {
struct puffs_req pvfsr_pr;
void *pvfsr_fhcookie;
size_t pvfsr_dsize;
uint8_t pvfsr_data[0]
__aligned(ALIGNBYTES+1);
};
struct puffs_vfsmsg_suspend {
struct puffs_req pvfsr_pr;
int pvfsr_status;
};
#define PUFFS_SUSPEND_START 0
#define PUFFS_SUSPEND_SUSPENDED 1
#define PUFFS_SUSPEND_RESUME 2
#define PUFFS_SUSPEND_ERROR 3
#define PUFFS_EXTATTRCTL_HASNODE 0x01
#define PUFFS_EXTATTRCTL_HASATTRNAME 0x02
#define PUFFS_OPEN_IO_DIRECT 0x01
struct puffs_vfsmsg_extattrctl {
struct puffs_req pvfsr_pr;
int pvfsr_cmd;
int pvfsr_attrnamespace;
int pvfsr_flags;
char pvfsr_attrname[PUFFS_EXTNAMELEN];
};
struct puffs_vnmsg_lookup {
struct puffs_req pvn_pr;
struct puffs_kcn pvnr_cn;
struct puffs_kcred pvnr_cn_cred;
puffs_cookie_t pvnr_newnode;
enum vtype pvnr_vtype;
voff_t pvnr_size;
dev_t pvnr_rdev;
struct vattr pvnr_va;
struct timespec pvnr_va_ttl;
struct timespec pvnr_cn_ttl;
};
struct puffs_vnmsg_create {
struct puffs_req pvn_pr;
struct puffs_kcn pvnr_cn;
struct puffs_kcred pvnr_cn_cred;
struct vattr pvnr_va;
puffs_cookie_t pvnr_newnode;
struct timespec pvnr_va_ttl;
struct timespec pvnr_cn_ttl;
};
struct puffs_vnmsg_mknod {
struct puffs_req pvn_pr;
struct puffs_kcn pvnr_cn;
struct puffs_kcred pvnr_cn_cred;
struct vattr pvnr_va;
puffs_cookie_t pvnr_newnode;
struct timespec pvnr_va_ttl;
struct timespec pvnr_cn_ttl;
};
struct puffs_vnmsg_open {
struct puffs_req pvn_pr;
struct puffs_kcred pvnr_cred;
int pvnr_mode;
int pvnr_oflags;
};
struct puffs_vnmsg_close {
struct puffs_req pvn_pr;
struct puffs_kcred pvnr_cred;
int pvnr_fflag;
};
struct puffs_vnmsg_access {
struct puffs_req pvn_pr;
struct puffs_kcred pvnr_cred;
int pvnr_mode;
};
#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;
struct vattr pvnr_va;
struct timespec pvnr_va_ttl;
};
#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;
off_t pvnr_offset;
size_t pvnr_resid;
int pvnr_ioflag;
uint8_t pvnr_data[0];
};
#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;
u_long pvnr_command;
pid_t pvnr_pid;
int pvnr_fflag;
void *pvnr_data;
size_t pvnr_datalen;
int pvnr_copyback;
};
struct puffs_vnmsg_poll {
struct puffs_req pvn_pr;
int pvnr_events;
};
struct puffs_vnmsg_fsync {
struct puffs_req pvn_pr;
struct puffs_kcred pvnr_cred;
off_t pvnr_offlo;
off_t pvnr_offhi;
int pvnr_flags;
};
struct puffs_vnmsg_seek {
struct puffs_req pvn_pr;
struct puffs_kcred pvnr_cred;
off_t pvnr_oldoff;
off_t pvnr_newoff;
};
struct puffs_vnmsg_remove {
struct puffs_req pvn_pr;
struct puffs_kcn pvnr_cn;
struct puffs_kcred pvnr_cn_cred;
puffs_cookie_t pvnr_cookie_targ;
};
struct puffs_vnmsg_mkdir {
struct puffs_req pvn_pr;
struct puffs_kcn pvnr_cn;
struct puffs_kcred pvnr_cn_cred;
struct vattr pvnr_va;
puffs_cookie_t pvnr_newnode;
struct timespec pvnr_va_ttl;
struct timespec pvnr_cn_ttl;
};
struct puffs_vnmsg_rmdir {
struct puffs_req pvn_pr;
struct puffs_kcn pvnr_cn;
struct puffs_kcred pvnr_cn_cred;
puffs_cookie_t pvnr_cookie_targ;
};
struct puffs_vnmsg_link {
struct puffs_req pvn_pr;
struct puffs_kcn pvnr_cn;
struct puffs_kcred pvnr_cn_cred;
puffs_cookie_t pvnr_cookie_targ;
};
struct puffs_vnmsg_rename {
struct puffs_req pvn_pr;
struct puffs_kcn pvnr_cn_src;
struct puffs_kcred pvnr_cn_src_cred;
struct puffs_kcn pvnr_cn_targ;
struct puffs_kcred pvnr_cn_targ_cred;
puffs_cookie_t pvnr_cookie_src;
puffs_cookie_t pvnr_cookie_targ;
puffs_cookie_t pvnr_cookie_targdir;
};
struct puffs_vnmsg_symlink {
struct puffs_req pvn_pr;
struct puffs_kcn pvnr_cn;
struct puffs_kcred pvnr_cn_cred;
struct vattr pvnr_va;
puffs_cookie_t pvnr_newnode;
char pvnr_link[MAXPATHLEN];
struct timespec pvnr_va_ttl;
struct timespec pvnr_cn_ttl;
};
struct puffs_vnmsg_readdir {
struct puffs_req pvn_pr;
struct puffs_kcred pvnr_cred;
off_t pvnr_offset;
size_t pvnr_resid;
size_t pvnr_ncookies;
int pvnr_eofflag;
size_t pvnr_dentoff;
uint8_t pvnr_data[0]
__aligned(ALIGNBYTES+1);
};
struct puffs_vnmsg_readlink {
struct puffs_req pvn_pr;
struct puffs_kcred pvnr_cred;
size_t pvnr_linklen;
char pvnr_link[MAXPATHLEN];
};
struct puffs_vnmsg_reclaim {
struct puffs_req pvn_pr;
int pvnr_nlookup;
};
struct puffs_vnmsg_inactive {
struct puffs_req pvn_pr;
};
struct puffs_vnmsg_print {
struct puffs_req pvn_pr;
};
struct puffs_vnmsg_pathconf {
struct puffs_req pvn_pr;
int pvnr_name;
__register_t pvnr_retval;
};
struct puffs_vnmsg_advlock {
struct puffs_req pvn_pr;
struct flock pvnr_fl;
void *pvnr_id;
int pvnr_op;
int pvnr_flags;
};
struct puffs_vnmsg_mmap {
struct puffs_req pvn_pr;
vm_prot_t pvnr_prot;
struct puffs_kcred pvnr_cred;
};
struct puffs_vnmsg_abortop {
struct puffs_req pvn_pr;
struct puffs_kcn pvnr_cn;
struct puffs_kcred pvnr_cn_cred;
};
struct puffs_vnmsg_getextattr {
struct puffs_req pvn_pr;
int pvnr_attrnamespace;
char pvnr_attrname[PUFFS_EXTNAMELEN];
struct puffs_kcred pvnr_cred;
size_t pvnr_datasize;
size_t pvnr_resid;
uint8_t pvnr_data[0]
__aligned(ALIGNBYTES+1);
};
struct puffs_vnmsg_setextattr {
struct puffs_req pvn_pr;
int pvnr_attrnamespace;
char pvnr_attrname[PUFFS_EXTNAMELEN];
struct puffs_kcred pvnr_cred;
size_t pvnr_resid;
uint8_t pvnr_data[0]
__aligned(ALIGNBYTES+1);
};
struct puffs_vnmsg_listextattr {
struct puffs_req pvn_pr;
int pvnr_attrnamespace;
struct puffs_kcred pvnr_cred;
size_t pvnr_datasize;
size_t pvnr_resid;
int pvnr_flag;
uint8_t pvnr_data[0]
__aligned(ALIGNBYTES+1);
};
struct puffs_vnmsg_deleteextattr {
struct puffs_req pvn_pr;
int pvnr_attrnamespace;
char pvnr_attrname[PUFFS_EXTNAMELEN];
struct puffs_kcred pvnr_cred;
};
#define PUFFS_HAVE_FALLOCATE 1
struct puffs_vnmsg_fallocate {
struct puffs_req pvn_pr;
off_t pvnr_off;
off_t pvnr_len;
};
struct puffs_vnmsg_fdiscard {
struct puffs_req pvn_pr;
off_t pvnr_off;
off_t pvnr_len;
};
struct puffs_cacherun {
off_t pcache_runstart;
off_t pcache_runend;
};
struct puffs_cacheinfo {
struct puffs_req pcache_pr;
int pcache_type;
size_t pcache_nruns;
struct puffs_cacherun pcache_runs[0];
};
#define PCACHE_TYPE_READ 0
#define PCACHE_TYPE_WRITE 1
struct puffs_error {
struct puffs_req perr_pr;
int perr_error;
char perr_str[256];
};
#endif