Module Name:    src
Committed By:   manu
Date:           Fri Oct 31 13:52:41 UTC 2014

Modified Files:
        src/sys/fs/puffs: puffs_msgif.h puffs_vnops.c

Log Message:
Add PUFFS support for fallocate and fdiscard operations


To generate a diff of this commit:
cvs rdiff -u -r1.81 -r1.82 src/sys/fs/puffs/puffs_msgif.h
cvs rdiff -u -r1.195 -r1.196 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/sys/fs/puffs/puffs_msgif.h
diff -u src/sys/fs/puffs/puffs_msgif.h:1.81 src/sys/fs/puffs/puffs_msgif.h:1.82
--- src/sys/fs/puffs/puffs_msgif.h:1.81	Sat Aug 16 16:19:41 2014
+++ src/sys/fs/puffs/puffs_msgif.h	Fri Oct 31 13:52:41 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs_msgif.h,v 1.81 2014/08/16 16:19:41 manu Exp $	*/
+/*	$NetBSD: puffs_msgif.h,v 1.82 2014/10/31 13:52:41 manu 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,18 @@ struct puffs_vnmsg_deleteextattr {
 	struct puffs_kcred	pvnr_cred;			/* OUT	*/
 };
 
+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.195 src/sys/fs/puffs/puffs_vnops.c:1.196
--- src/sys/fs/puffs/puffs_vnops.c:1.195	Fri Oct 31 13:51:33 2014
+++ src/sys/fs/puffs/puffs_vnops.c	Fri Oct 31 13:52:41 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs_vnops.c,v 1.195 2014/10/31 13:51:33 manu Exp $	*/
+/*	$NetBSD: puffs_vnops.c,v 1.196 2014/10/31 13:52:41 manu 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.195 2014/10/31 13:51:33 manu Exp $");
+__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.196 2014/10/31 13:52:41 manu 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