Module Name: src Committed By: snj Date: Wed Nov 5 18:11:31 UTC 2014
Modified Files: src/lib/libperfuse [netbsd-7]: fuse.h ops.c perfuse.c perfuse_priv.h src/lib/libpuffs [netbsd-7]: dispatcher.c opdump.c puffs.c puffs.h puffs_ops.3 src/sys/fs/puffs [netbsd-7]: puffs_msgif.h puffs_vnops.c Log Message: Pull up following revision(s) (requested by manu in ticket #181): lib/libperfuse/fuse.h: revision 1.6 lib/libperfuse/ops.c: revision 1.78 lib/libperfuse/perfuse.c: revision 1.35 lib/libperfuse/perfuse_priv.h: revision 1.36 lib/libpuffs/dispatcher.c: revision 1.48 lib/libpuffs/opdump.c: revision 1.37 lib/libpuffs/puffs.c: revision 1.118 lib/libpuffs/puffs.h: revision 1.126 lib/libpuffs/puffs_ops.3: revisions 1.40-1.41 sys/fs/puffs/puffs_msgif.h: revision 1.82-1.83 sys/fs/puffs/puffs_msgif.h: revision 1.82 sys/fs/puffs/puffs_vnops.c: revision 1.196 Add PUFFS support for fallocate and fdiscard operations -- libpuffs support for fallocate and fdiscard operations -- Add PUFFS_HAVE_FALLOCATE in puffs_msgif.h so that filesystem can decide at build time wether fallocate is usable -- FUSE fallocate support There seems to be no fdiscard FUSE operation at the moment, hence that one is left unused. To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.5.18.1 src/lib/libperfuse/fuse.h cvs rdiff -u -r1.66.2.9 -r1.66.2.10 src/lib/libperfuse/ops.c cvs rdiff -u -r1.31.10.2 -r1.31.10.3 src/lib/libperfuse/perfuse.c cvs rdiff -u -r1.32.2.2 -r1.32.2.3 src/lib/libperfuse/perfuse_priv.h cvs rdiff -u -r1.46.4.1 -r1.46.4.2 src/lib/libpuffs/dispatcher.c cvs rdiff -u -r1.36 -r1.36.10.1 src/lib/libpuffs/opdump.c cvs rdiff -u -r1.117 -r1.117.18.1 src/lib/libpuffs/puffs.c cvs rdiff -u -r1.124.10.1 -r1.124.10.2 src/lib/libpuffs/puffs.h cvs rdiff -u -r1.36.10.1 -r1.36.10.2 src/lib/libpuffs/puffs_ops.3 cvs rdiff -u -r1.80.14.1 -r1.80.14.2 src/sys/fs/puffs/puffs_msgif.h cvs rdiff -u -r1.182.2.7 -r1.182.2.8 src/sys/fs/puffs/puffs_vnops.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/libperfuse/fuse.h diff -u src/lib/libperfuse/fuse.h:1.5 src/lib/libperfuse/fuse.h:1.5.18.1 --- src/lib/libperfuse/fuse.h:1.5 Wed Dec 28 17:33:53 2011 +++ src/lib/libperfuse/fuse.h Wed Nov 5 18:11:30 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: fuse.h,v 1.5 2011/12/28 17:33:53 manu Exp $ */ +/* $NetBSD: fuse.h,v 1.5.18.1 2014/11/05 18:11:30 snj Exp $ */ /*- * Copyright (c) 2010 Emmanuel Dreyfus. All rights reserved. @@ -169,6 +169,9 @@ enum fuse_opcode { FUSE_DESTROY = 38, FUSE_IOCTL = 39, FUSE_POLL = 40, + FUSE_NOTIFY_REPLY = 41, + FUSE_BATCH_FORGET = 42, + FUSE_FALLOCATE = 43, FUSE_OPCODE_MAX, FUSE_CUSE_INIT = 4096 @@ -441,6 +444,14 @@ struct fuse_notify_poll_wakeup_out { uint64_t kh; }; +struct fuse_fallocate_in { + uint64_t fh; + uint64_t offset; + uint64_t length; + uint32_t mode; + uint32_t padding; +}; + #if 0 /* Duplicated in perfuse.h to avoid making fuse.h public */ /* Send from kernel to proces */ struct fuse_in_header { Index: src/lib/libperfuse/ops.c diff -u src/lib/libperfuse/ops.c:1.66.2.9 src/lib/libperfuse/ops.c:1.66.2.10 --- src/lib/libperfuse/ops.c:1.66.2.9 Thu Oct 30 12:38:15 2014 +++ src/lib/libperfuse/ops.c Wed Nov 5 18:11:30 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: ops.c,v 1.66.2.9 2014/10/30 12:38:15 martin Exp $ */ +/* $NetBSD: ops.c,v 1.66.2.10 2014/11/05 18:11:30 snj Exp $ */ /*- * Copyright (c) 2010-2011 Emmanuel Dreyfus. All rights reserved. @@ -3635,8 +3635,47 @@ perfuse_node_deleteextattr(struct puffs_ error = xchg_msg(pu, opc, pm, NO_PAYLOAD_REPLY_LEN, wait_reply); if (error != 0) goto out; + + ps->ps_destroy_msg(pm); + +out: + node_rele(opc); + return error; +} + +int +perfuse_node_fallocate(struct puffs_usermount *pu, puffs_cookie_t opc, + off_t off, off_t len) +{ + struct perfuse_state *ps; + perfuse_msg_t *pm; + struct fuse_fallocate_in *fai; + int error; + ps = puffs_getspecific(pu); + if (ps->ps_flags & PS_NO_FALLOCATE) + return EOPNOTSUPP; + + node_ref(opc); + + pm = ps->ps_new_msg(pu, opc, FUSE_FALLOCATE, sizeof(*fai), NULL); + + fai = GET_INPAYLOAD(ps, pm, fuse_fallocate_in); + fai->fh = perfuse_get_fh(opc, FWRITE); + fai->offset = off; + fai->length = len; + fai->mode = 0; + + error = xchg_msg(pu, opc, pm, NO_PAYLOAD_REPLY_LEN, wait_reply); + if (error == EOPNOTSUPP || error == ENOSYS) { + ps->ps_flags |= PS_NO_FALLOCATE; + error = EOPNOTSUPP; + } + if (error != 0) + goto out; + ps->ps_destroy_msg(pm); + out: node_rele(opc); return error; Index: src/lib/libperfuse/perfuse.c diff -u src/lib/libperfuse/perfuse.c:1.31.10.2 src/lib/libperfuse/perfuse.c:1.31.10.3 --- src/lib/libperfuse/perfuse.c:1.31.10.2 Thu Sep 11 12:17:10 2014 +++ src/lib/libperfuse/perfuse.c Wed Nov 5 18:11:30 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: perfuse.c,v 1.31.10.2 2014/09/11 12:17:10 martin Exp $ */ +/* $NetBSD: perfuse.c,v 1.31.10.3 2014/11/05 18:11:30 snj Exp $ */ /*- * Copyright (c) 2010-2011 Emmanuel Dreyfus. All rights reserved. @@ -503,6 +503,9 @@ perfuse_init(struct perfuse_callbacks *p #ifdef PUFFS_OPEN_IO_DIRECT PUFFSOP_SET(pops, perfuse, node, open2); #endif /* PUFFS_OPEN_IO_DIRECT */ +#ifdef PUFFS_HAVE_FALLOCATE + PUFFSOP_SET(pops, perfuse, node, fallocate); +#endif /* PUFFS_HAVE_FALLOCATE */ /* * PUFFS_KFLAG_NOCACHE_NAME is required so that we can see changes Index: src/lib/libperfuse/perfuse_priv.h diff -u src/lib/libperfuse/perfuse_priv.h:1.32.2.2 src/lib/libperfuse/perfuse_priv.h:1.32.2.3 --- src/lib/libperfuse/perfuse_priv.h:1.32.2.2 Fri Sep 12 08:13:20 2014 +++ src/lib/libperfuse/perfuse_priv.h Wed Nov 5 18:11:30 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: perfuse_priv.h,v 1.32.2.2 2014/09/12 08:13:20 martin Exp $ */ +/* $NetBSD: perfuse_priv.h,v 1.32.2.3 2014/11/05 18:11:30 snj Exp $ */ /*- * Copyright (c) 2010-2011 Emmanuel Dreyfus. All rights reserved. @@ -67,6 +67,7 @@ struct perfuse_state { #define PS_NO_ACCESS 0x0001 /* access is unimplemented; */ #define PS_NO_CREAT 0x0004 /* create is unimplemented */ #define PS_INLOOP 0x0008 /* puffs mainloop started */ +#define PS_NO_FALLOCATE 0x0010 /* fallocate is unimplemented */ uint64_t ps_fsid; uint32_t ps_max_readahead; uint32_t ps_max_write; @@ -277,6 +278,8 @@ int perfuse_node_getattr_ttl(struct puff int perfuse_node_setattr_ttl(struct puffs_usermount *, puffs_cookie_t, struct vattr *, const struct puffs_cred *, struct timespec *, int); +int perfuse_node_fallocate(struct puffs_usermount *, + puffs_cookie_t, off_t, off_t); struct perfuse_trace *perfuse_trace_begin(struct perfuse_state *, puffs_cookie_t, perfuse_msg_t *); Index: src/lib/libpuffs/dispatcher.c diff -u src/lib/libpuffs/dispatcher.c:1.46.4.1 src/lib/libpuffs/dispatcher.c:1.46.4.2 --- src/lib/libpuffs/dispatcher.c:1.46.4.1 Sun Aug 24 08:42:06 2014 +++ src/lib/libpuffs/dispatcher.c Wed Nov 5 18:11:31 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: dispatcher.c,v 1.46.4.1 2014/08/24 08:42:06 martin Exp $ */ +/* $NetBSD: dispatcher.c,v 1.46.4.2 2014/11/05 18:11:31 snj Exp $ */ /* * Copyright (c) 2006, 2007, 2008 Antti Kantee. All Rights Reserved. @@ -31,7 +31,7 @@ #include <sys/cdefs.h> #if !defined(lint) -__RCSID("$NetBSD: dispatcher.c,v 1.46.4.1 2014/08/24 08:42:06 martin Exp $"); +__RCSID("$NetBSD: dispatcher.c,v 1.46.4.2 2014/11/05 18:11:31 snj Exp $"); #endif /* !lint */ #include <sys/types.h> @@ -1140,6 +1140,34 @@ dispatch(struct puffs_cc *pcc) break; } + case PUFFS_VN_FALLOCATE: + { + struct puffs_vnmsg_fallocate *auxt = auxbuf; + + if (pops->puffs_node_fallocate == NULL) { + error = EOPNOTSUPP; + break; + } + + error = pops->puffs_node_fallocate(pu, + opcookie, auxt->pvnr_off, auxt->pvnr_len); + break; + } + + case PUFFS_VN_FDISCARD: + { + struct puffs_vnmsg_fdiscard *auxt = auxbuf; + + if (pops->puffs_node_fdiscard == NULL) { + error = EOPNOTSUPP; + break; + } + + error = pops->puffs_node_fdiscard(pu, + opcookie, auxt->pvnr_off, auxt->pvnr_len); + break; + } + default: printf("inval op %d\n", preq->preq_optype); error = EINVAL; Index: src/lib/libpuffs/opdump.c diff -u src/lib/libpuffs/opdump.c:1.36 src/lib/libpuffs/opdump.c:1.36.10.1 --- src/lib/libpuffs/opdump.c:1.36 Thu Mar 15 02:02:21 2012 +++ src/lib/libpuffs/opdump.c Wed Nov 5 18:11:31 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: opdump.c,v 1.36 2012/03/15 02:02:21 joerg Exp $ */ +/* $NetBSD: opdump.c,v 1.36.10.1 2014/11/05 18:11:31 snj Exp $ */ /* * Copyright (c) 2005, 2006 Antti Kantee. All Rights Reserved. @@ -35,7 +35,7 @@ #include <sys/cdefs.h> #if !defined(lint) -__RCSID("$NetBSD: opdump.c,v 1.36 2012/03/15 02:02:21 joerg Exp $"); +__RCSID("$NetBSD: opdump.c,v 1.36.10.1 2014/11/05 18:11:31 snj Exp $"); #endif /* !lint */ #include <sys/types.h> @@ -117,6 +117,8 @@ const char *puffsdump_vnop_revmap[] = { "PUFFS_VN_DELETEEXTATTR", "PUFFS_VN_SETEXTATTR", "PUFFS_VN_CLOSEEXTATTR", + "PUFFS_VN_FALLOCATE", + "PUFFS_VN_FDISCARD", }; size_t puffsdump_vnop_count = __arraycount(puffsdump_vnop_revmap); Index: src/lib/libpuffs/puffs.c diff -u src/lib/libpuffs/puffs.c:1.117 src/lib/libpuffs/puffs.c:1.117.18.1 --- src/lib/libpuffs/puffs.c:1.117 Mon Nov 14 01:27:42 2011 +++ src/lib/libpuffs/puffs.c Wed Nov 5 18:11:31 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: puffs.c,v 1.117 2011/11/14 01:27:42 chs Exp $ */ +/* $NetBSD: puffs.c,v 1.117.18.1 2014/11/05 18:11:31 snj Exp $ */ /* * Copyright (c) 2005, 2006, 2007 Antti Kantee. All Rights Reserved. @@ -31,7 +31,7 @@ #include <sys/cdefs.h> #if !defined(lint) -__RCSID("$NetBSD: puffs.c,v 1.117 2011/11/14 01:27:42 chs Exp $"); +__RCSID("$NetBSD: puffs.c,v 1.117.18.1 2014/11/05 18:11:31 snj Exp $"); #endif /* !lint */ #include <sys/param.h> @@ -106,6 +106,8 @@ fillvnopmask(struct puffs_ops *pops, str FILLOP(setextattr, SETEXTATTR); FILLOP(listextattr, LISTEXTATTR); FILLOP(deleteextattr, DELETEEXTATTR); + FILLOP(fallocate, FALLOCATE); + FILLOP(fdiscard, FDISCARD); } #undef FILLOP Index: src/lib/libpuffs/puffs.h diff -u src/lib/libpuffs/puffs.h:1.124.10.1 src/lib/libpuffs/puffs.h:1.124.10.2 --- src/lib/libpuffs/puffs.h:1.124.10.1 Sun Aug 24 08:42:06 2014 +++ src/lib/libpuffs/puffs.h Wed Nov 5 18:11:31 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: puffs.h,v 1.124.10.1 2014/08/24 08:42:06 martin Exp $ */ +/* $NetBSD: puffs.h,v 1.124.10.2 2014/11/05 18:11:31 snj Exp $ */ /* * Copyright (c) 2005, 2006, 2007 Antti Kantee. All Rights Reserved. @@ -252,8 +252,12 @@ struct puffs_ops { puffs_cookie_t, int); int (*puffs_node_open2)(struct puffs_usermount *, puffs_cookie_t, int, const struct puffs_cred *, int *); + int (*puffs_node_fallocate)(struct puffs_usermount *, + puffs_cookie_t, off_t, off_t); + int (*puffs_node_fdiscard)(struct puffs_usermount *, + puffs_cookie_t, off_t, off_t); - void *puffs_ops_spare[28]; + void *puffs_ops_spare[26]; }; typedef int (*pu_pathbuild_fn)(struct puffs_usermount *, @@ -414,7 +418,11 @@ enum { int fsname##_node_reclaim2(struct puffs_usermount *, \ puffs_cookie_t, int); \ int fsname##_node_open2(struct puffs_usermount *, \ - puffs_cookie_t, int, const struct puffs_cred *, int *); + puffs_cookie_t, int, const struct puffs_cred *, int *); \ + int fsname##_node_fallocate(struct puffs_usermount *, \ + puffs_cookie_t, int, off_t, off_t); \ + int fsname##_node_fdiscard(struct puffs_usermount *, \ + puffs_cookie_t, int, off_t, off_t); #define PUFFSOP_INIT(ops) \ Index: src/lib/libpuffs/puffs_ops.3 diff -u src/lib/libpuffs/puffs_ops.3:1.36.10.1 src/lib/libpuffs/puffs_ops.3:1.36.10.2 --- src/lib/libpuffs/puffs_ops.3:1.36.10.1 Sun Aug 24 08:42:06 2014 +++ src/lib/libpuffs/puffs_ops.3 Wed Nov 5 18:11:31 2014 @@ -1,4 +1,4 @@ -.\" $NetBSD: puffs_ops.3,v 1.36.10.1 2014/08/24 08:42:06 martin Exp $ +.\" $NetBSD: puffs_ops.3,v 1.36.10.2 2014/11/05 18:11:31 snj Exp $ .\" .\" Copyright (c) 2007 Antti Kantee. All rights reserved. .\" @@ -23,7 +23,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd August 16, 2014 +.Dd October 31, 2014 .Dt PUFFS_OPS 3 .Os .Sh NAME @@ -227,7 +227,17 @@ .Fa "const struct puffs_cred *pcr" .Fc .Ft int -.Fn puffs_node_print "struct puffs_usermount *pu" "puffs_cookie_t opc" +.Fo puffs_node_fallocate +.Fa "struct puffs_usermount *pu" "puffs_cookie_t opc" "off_t pos" "off_t len" +.Fc +.Ft int +.Fo puffs_node_fdiscard +.Fa "struct puffs_usermount *pu" "puffs_cookie_t opc" "off_t pos" "off_t len" +.Fc +.Ft int +.Fo puffs_node_print +.Fa "struct puffs_usermount *pu" "puffs_cookie_t opc" +.Fc .Ft int .Fo puffs_node_reclaim .Fa "struct puffs_usermount *pu" "puffs_cookie_t opc" @@ -800,6 +810,20 @@ with an additional in which .Dv PUFFS_WRITE_FAF is set for Fire-And-Forget operations. +.It Fn puffs_node_fallocate "pu" "opc" "pos" "len" +Allocate +.Fa len +bytes of backing store at offset +.Fa pos +for the node referenced by the cookie +.Fa opc . +.It Fn puffs_node_fdiscard "pu" "opc" "pos" "len" +Free +.Fa len +bytes of backing store (creating a hole) at offset +.Fa pos +for the node referenced by the cookie +.Fa opc . .It Fn puffs_node_print "pu" "opc" Print information about node. This is used only for kernel-initiated diagnostic purposes. Index: src/sys/fs/puffs/puffs_msgif.h diff -u src/sys/fs/puffs/puffs_msgif.h:1.80.14.1 src/sys/fs/puffs/puffs_msgif.h:1.80.14.2 --- src/sys/fs/puffs/puffs_msgif.h:1.80.14.1 Tue Aug 26 23:15:12 2014 +++ src/sys/fs/puffs/puffs_msgif.h Wed Nov 5 18:11:31 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: puffs_msgif.h,v 1.80.14.1 2014/08/26 23:15:12 riz Exp $ */ +/* $NetBSD: puffs_msgif.h,v 1.80.14.2 2014/11/05 18:11:31 snj Exp $ */ /* * Copyright (c) 2005, 2006, 2007 Antti Kantee. All Rights Reserved. @@ -86,11 +86,12 @@ 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, PUFFS_VN_FALLOCATE, + PUFFS_VN_FDISCARD, /* NOTE: If you add an op, decrement PUFFS_VN_SPARE accordingly */ }; -#define PUFFS_VN_MAX PUFFS_VN_CLOSEEXTATTR -#define PUFFS_VN_SPARE 32 +#define PUFFS_VN_MAX PUFFS_VN_FDISCARD +#define PUFFS_VN_SPARE 30 /* * These signal invalid parameters the file system returned. @@ -666,6 +667,19 @@ struct puffs_vnmsg_deleteextattr { struct puffs_kcred pvnr_cred; /* OUT */ }; +#define PUFFS_HAVE_FALLOCATE 1 +struct puffs_vnmsg_fallocate { + struct puffs_req pvn_pr; + off_t pvnr_off; /* OUT */ + off_t pvnr_len; /* OUT */ +}; + +struct puffs_vnmsg_fdiscard { + struct puffs_req pvn_pr; + off_t pvnr_off; /* OUT */ + off_t pvnr_len; /* OUT */ +}; + /* * For cache reports. Everything is always out-out-out, no replies */ Index: src/sys/fs/puffs/puffs_vnops.c diff -u src/sys/fs/puffs/puffs_vnops.c:1.182.2.7 src/sys/fs/puffs/puffs_vnops.c:1.182.2.8 --- src/sys/fs/puffs/puffs_vnops.c:1.182.2.7 Tue Oct 14 08:16:03 2014 +++ src/sys/fs/puffs/puffs_vnops.c Wed Nov 5 18:11:31 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: puffs_vnops.c,v 1.182.2.7 2014/10/14 08:16:03 martin Exp $ */ +/* $NetBSD: puffs_vnops.c,v 1.182.2.8 2014/11/05 18:11:31 snj Exp $ */ /* * Copyright (c) 2005, 2006, 2007 Antti Kantee. All Rights Reserved. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.182.2.7 2014/10/14 08:16:03 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.182.2.8 2014/11/05 18:11:31 snj Exp $"); #include <sys/param.h> #include <sys/buf.h> @@ -73,6 +73,8 @@ int puffs_vnop_symlink(void *); int puffs_vnop_rename(void *); int puffs_vnop_read(void *); int puffs_vnop_write(void *); +int puffs_vnop_fallocate(void *); +int puffs_vnop_fdiscard(void *); int puffs_vnop_fcntl(void *); int puffs_vnop_ioctl(void *); int puffs_vnop_inactive(void *); @@ -113,8 +115,8 @@ const struct vnodeopv_entry_desc puffs_v { &vop_setattr_desc, puffs_vnop_checkop }, /* setattr */ { &vop_read_desc, puffs_vnop_checkop }, /* read */ { &vop_write_desc, puffs_vnop_checkop }, /* write */ - { &vop_fallocate_desc, genfs_eopnotsupp }, /* fallocate */ - { &vop_fdiscard_desc, genfs_eopnotsupp }, /* fdiscard */ + { &vop_fallocate_desc, puffs_vnop_fallocate }, /* fallocate */ + { &vop_fdiscard_desc, puffs_vnop_fdiscard }, /* fdiscard */ { &vop_fsync_desc, puffs_vnop_fsync }, /* REAL fsync */ { &vop_seek_desc, puffs_vnop_checkop }, /* seek */ { &vop_remove_desc, puffs_vnop_checkop }, /* remove */ @@ -2499,6 +2501,80 @@ puffs_vnop_write(void *v) } int +puffs_vnop_fallocate(void *v) +{ + struct vop_fallocate_args /* { + const struct vnodeop_desc *a_desc; + struct vnode *a_vp; + off_t a_pos; + off_t a_len; + } */ *ap = v; + struct vnode *vp = ap->a_vp; + struct puffs_node *pn = VPTOPP(vp); + struct puffs_mount *pmp = MPTOPUFFSMP(vp->v_mount); + PUFFS_MSG_VARS(vn, fallocate); + int error; + + mutex_enter(&pn->pn_sizemtx); + + PUFFS_MSG_ALLOC(vn, fallocate); + fallocate_msg->pvnr_off = ap->a_pos; + fallocate_msg->pvnr_len = ap->a_len; + puffs_msg_setinfo(park_fallocate, PUFFSOP_VN, + PUFFS_VN_FALLOCATE, VPTOPNC(vp)); + + PUFFS_MSG_ENQUEUEWAIT2(pmp, park_fallocate, vp->v_data, NULL, error); + error = checkerr(pmp, error, __func__); + PUFFS_MSG_RELEASE(fallocate); + + switch (error) { + case 0: + break; + case EAGAIN: + error = EIO; + /* FALLTHROUGH */ + default: + goto out; + } + + if (ap->a_pos + ap->a_len > vp->v_size) { + uvm_vnp_setsize(vp, ap->a_pos + ap->a_len); + puffs_updatenode(pn, PUFFS_UPDATESIZE, vp->v_size); + } +out: + mutex_exit(&pn->pn_sizemtx); + + return error; +} + +int +puffs_vnop_fdiscard(void *v) +{ + struct vop_fdiscard_args /* { + const struct vnodeop_desc *a_desc; + struct vnode *a_vp; + off_t a_pos; + off_t a_len; + } */ *ap = v; + struct vnode *vp = ap->a_vp; + struct puffs_mount *pmp = MPTOPUFFSMP(vp->v_mount); + PUFFS_MSG_VARS(vn, fdiscard); + int error; + + PUFFS_MSG_ALLOC(vn, fdiscard); + fdiscard_msg->pvnr_off = ap->a_pos; + fdiscard_msg->pvnr_len = ap->a_len; + puffs_msg_setinfo(park_fdiscard, PUFFSOP_VN, + PUFFS_VN_FALLOCATE, VPTOPNC(vp)); + + PUFFS_MSG_ENQUEUEWAIT2(pmp, park_fdiscard, vp->v_data, NULL, error); + error = checkerr(pmp, error, __func__); + PUFFS_MSG_RELEASE(fdiscard); + + return error; +} + +int puffs_vnop_print(void *v) { struct vop_print_args /* {