From 40b04abea5ad643d78fc4539ce791f9de23099eb Mon Sep 17 00:00:00 2001 From: pooka Date: Fri, 21 May 2010 10:40:19 +0000 Subject: [PATCH] Since libpuffs needs a major bump for extattr support anyway, make some changes to the user-kernel protocol. Namely, try to be a little more resilient some future changes. --- sys/fs/puffs/puffs_msgif.h | 65 ++++++++++++++++++------------------- sys/fs/puffs/puffs_vfsops.c | 10 +++--- 2 files changed, 35 insertions(+), 40 deletions(-) diff --git a/sys/fs/puffs/puffs_msgif.h b/sys/fs/puffs/puffs_msgif.h index 6926623113b4..1c5bed2e1cd2 100644 --- a/sys/fs/puffs/puffs_msgif.h +++ b/sys/fs/puffs/puffs_msgif.h @@ -1,4 +1,4 @@ -/* $NetBSD: puffs_msgif.h,v 1.71 2010/05/21 10:16:54 pooka Exp $ */ +/* $NetBSD: puffs_msgif.h,v 1.72 2010/05/21 10:40:19 pooka Exp $ */ /* * Copyright (c) 2005, 2006, 2007 Antti Kantee. All Rights Reserved. @@ -61,18 +61,15 @@ #define PUFFSOP_OPCLASS(a) ((a) & PUFFSOP_OPCMASK) #define PUFFSOP_WANTREPLY(a) (((a) & PUFFSOPFLAG_FAF) == 0) -/* XXX: we don't need everything */ enum { PUFFS_VFS_MOUNT, PUFFS_VFS_START, PUFFS_VFS_UNMOUNT, - PUFFS_VFS_ROOT, 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 + 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_SPARE 0 -#define PUFFS_VFS_MAX (PUFFS_VFS_EXTATTRCTL+PUFFS_VFS_SPARE) +#define PUFFS_VFS_MAX PUFFS_VFS_SUSPEND -/* moreXXX: we don't need everything here either */ enum { PUFFS_VN_LOOKUP, PUFFS_VN_CREATE, PUFFS_VN_MKNOD, PUFFS_VN_OPEN, PUFFS_VN_CLOSE, PUFFS_VN_ACCESS, @@ -89,27 +86,24 @@ enum { 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_SETEXTATTR, PUFFS_VN_CLOSEEXTATTR + /* NOTE: If you add an op, decrement PUFFS_VN_SPARE accordingly */ }; -#define PUFFS_VN_SPARE 0 -#define PUFFS_VN_MAX (PUFFS_VN_SETEXTATTR+PUFFS_VN_SPARE) +#define PUFFS_VN_MAX PUFFS_VN_CLOSEEXTATTR +#define PUFFS_VN_SPARE 32 /* * These signal invalid parameters the file system returned. */ enum { + 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_ERROR + PUFFS_ERR_VPTOFH, PUFFS_ERR_GETEXTATTR, PUFFS_ERR_LISTEXTATTR }; -#define PUFFS_ERR_MAX PUFFS_ERR_VPTOFH +#define PUFFS_ERR_MAX PUFFS_ERR_LISTEXTATTR -/* trick to avoid protocol bump */ -#define PUFFS_ERR_GETEXTATTR PUFFS_ERR_ERROR -#define PUFFS_ERR_LISTEXTATTR PUFFS_ERR_ERROR - -#define PUFFSDEVELVERS 0x80000000 -#define PUFFSVERSION 29 +#define PUFFSVERSION 30 #define PUFFSNAMESIZE 32 #define PUFFS_TYPEPREFIX "puffs|" @@ -137,18 +131,25 @@ struct puffs_kargs { size_t pa_fhsize; int pa_fhflags; - puffs_cookie_t pa_root_cookie; - enum vtype pa_root_vtype; - voff_t pa_root_vsize; - dev_t pa_root_rdev; - - struct statvfs pa_svfsb; + uint8_t pa_vnopmask[PUFFS_VN_MAX + PUFFS_VN_SPARE]; char pa_typename[_VFS_NAMELEN]; char pa_mntfromname[_VFS_MNAMELEN]; - uint8_t pa_vnopmask[PUFFS_VN_MAX]; + 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 statvfs pa_svfsb; + + uint32_t pa_spare[128]; }; +#define pa_root_rdev devunion.dev + #define PUFFS_KFLAG_NOCACHE_NAME 0x01 /* don't use name cache */ #define PUFFS_KFLAG_NOCACHE_PAGE 0x02 /* don't use page cache */ #define PUFFS_KFLAG_NOCACHE 0x03 /* no cache whatsoever */ @@ -165,7 +166,7 @@ struct puffs_kargs { #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 /* FHANDLE_SIZE_MAX - 4 */ struct puffs_req { struct putter_hdr preq_pth; @@ -211,7 +212,6 @@ struct puffs_req { * 2) page cache for one entire node */ -/* XXX: needs restructuring */ struct puffs_flush { struct puffs_req pf_req; @@ -227,9 +227,6 @@ struct puffs_flush { #define PUFFS_INVAL_PAGECACHE_NODE_RANGE 3 #define PUFFS_FLUSH_PAGECACHE_NODE_RANGE 4 -/* keep this for now */ -#define PUFFSREQSIZEOP _IOR ('p', 1, size_t) - /* * Credentials for an operation. Can be either struct uucred for * ops called from a credential context or NOCRED/FSCRED for ops @@ -251,7 +248,7 @@ struct puffs_kcred { * else treated as garbage */ #define PUFFS_MSG_MAXSIZE 2*MAXPHYS -#define PUFFS_MSGSTRUCT_MAX 4096 /* XXX: approxkludge */ +#define PUFFS_MSGSTRUCT_MAX 4096 /* approximate */ #define PUFFS_EXTNAMELEN NAME_MAX /* currently same as EXTATTR_MAXNAMELEN */ @@ -543,7 +540,7 @@ struct puffs_vnmsg_readlink { struct puffs_kcred pvnr_cred; /* OUT */ size_t pvnr_linklen; /* IN */ - char pvnr_link[MAXPATHLEN]; /* IN, XXX */ + char pvnr_link[MAXPATHLEN]; /* IN */ }; struct puffs_vnmsg_reclaim { diff --git a/sys/fs/puffs/puffs_vfsops.c b/sys/fs/puffs/puffs_vfsops.c index 398a6a1f26c1..f3070038cb83 100644 --- a/sys/fs/puffs/puffs_vfsops.c +++ b/sys/fs/puffs/puffs_vfsops.c @@ -1,4 +1,4 @@ -/* $NetBSD: puffs_vfsops.c,v 1.88 2010/05/21 10:16:54 pooka Exp $ */ +/* $NetBSD: puffs_vfsops.c,v 1.89 2010/05/21 10:40:19 pooka Exp $ */ /* * Copyright (c) 2005, 2006 Antti Kantee. All Rights Reserved. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: puffs_vfsops.c,v 1.88 2010/05/21 10:16:54 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: puffs_vfsops.c,v 1.89 2010/05/21 10:40:19 pooka Exp $"); #include #include @@ -111,11 +111,9 @@ puffs_vfsop_mount(struct mount *mp, const char *path, void *data, args = (struct puffs_kargs *)data; - /* devel phase */ - if (args->pa_vers != (PUFFSVERSION | PUFFSDEVELVERS)) { + if (args->pa_vers != PUFFSVERSION) { printf("puffs_mount: development version mismatch: " - "kernel %d, lib %d\n", - PUFFSVERSION, args->pa_vers & ~PUFFSDEVELVERS); + "kernel %d, lib %d\n", PUFFSVERSION, args->pa_vers); error = EINVAL; goto out; }