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 /* {

Reply via email to