Module Name:    src
Committed By:   manu
Date:           Sat Aug 16 16:28:43 UTC 2014

Modified Files:
        src/lib/libperfuse: ops.c perfuse.c perfuse_priv.h

Log Message:
Use just introduced open2 PUFFS method and its PUFFS_OPEN_IO_DIRECT oflag
to implement FUSE's OPEN_IO_DIRECT, by which the filesystem tells the kernel
that read/write to the file should bypass the page cache.

Remove a warning about read beyond EOF which will now normally appear when
page cache is bypassed.


To generate a diff of this commit:
cvs rdiff -u -r1.66 -r1.67 src/lib/libperfuse/ops.c
cvs rdiff -u -r1.31 -r1.32 src/lib/libperfuse/perfuse.c
cvs rdiff -u -r1.32 -r1.33 src/lib/libperfuse/perfuse_priv.h

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/ops.c
diff -u src/lib/libperfuse/ops.c:1.66 src/lib/libperfuse/ops.c:1.67
--- src/lib/libperfuse/ops.c:1.66	Sun Aug 10 03:22:33 2014
+++ src/lib/libperfuse/ops.c	Sat Aug 16 16:28:43 2014
@@ -1,4 +1,4 @@
-/*  $NetBSD: ops.c,v 1.66 2014/08/10 03:22:33 manu Exp $ */
+/*  $NetBSD: ops.c,v 1.67 2014/08/16 16:28:43 manu Exp $ */
 
 /*-
  *  Copyright (c) 2010-2011 Emmanuel Dreyfus. All rights reserved.
@@ -1338,6 +1338,13 @@ int
 perfuse_node_open(struct puffs_usermount *pu, puffs_cookie_t opc, int mode,
 	const struct puffs_cred *pcr)
 {
+	return perfuse_node_open2(pu, opc, mode, pcr, NULL);
+}
+
+int
+perfuse_node_open2(struct puffs_usermount *pu, puffs_cookie_t opc, int mode,
+	const struct puffs_cred *pcr, int *oflags)
+{
 	struct perfuse_state *ps;
 	struct perfuse_node_data *pnd;
 	perfuse_msg_t *pm;
@@ -1439,6 +1446,12 @@ perfuse_node_open(struct puffs_usermount
 	 */
 	perfuse_new_fh(opc, foo->fh, mode);
 
+	/*
+	 * Set direct I/O if the filesystems forces it
+	 */
+	if ((foo->open_flags & FUSE_FOPEN_DIRECT_IO) && (oflags != NULL))
+		*oflags |= PUFFS_OPEN_IO_DIRECT;
+
 #ifdef PERFUSE_DEBUG
 	if (perfuse_diagflags & (PDF_FH|PDF_FILENAME))
 		DPRINTF("%s: opc = %p, file = \"%s\", "
@@ -3031,11 +3044,6 @@ perfuse_node_read(struct puffs_usermount
 	if (vap->va_type == VDIR)
 		return EISDIR;
 
-	if ((u_quad_t)offset + *resid > vap->va_size)
-		DWARNX("%s %p read %lld@%zu beyond EOF %" PRIu64 "\n",
-		       __func__, (void *)opc, (long long)offset,
-		       *resid, vap->va_size);
-
 	do {
 		size_t max_read;
 

Index: src/lib/libperfuse/perfuse.c
diff -u src/lib/libperfuse/perfuse.c:1.31 src/lib/libperfuse/perfuse.c:1.32
--- src/lib/libperfuse/perfuse.c:1.31	Mon Sep 10 13:56:18 2012
+++ src/lib/libperfuse/perfuse.c	Sat Aug 16 16:28:43 2014
@@ -1,4 +1,4 @@
-/*  $NetBSD: perfuse.c,v 1.31 2012/09/10 13:56:18 manu Exp $ */
+/*  $NetBSD: perfuse.c,v 1.32 2014/08/16 16:28:43 manu Exp $ */
 
 /*-
  *  Copyright (c) 2010-2011 Emmanuel Dreyfus. All rights reserved.
@@ -503,6 +503,9 @@ perfuse_init(struct perfuse_callbacks *p
 #ifdef PUFFS_SETATTR_FAF
 	PUFFSOP_SET(pops, perfuse, node, write2);
 #endif /* PUFFS_SETATTR_FAF */
+#ifdef PUFFS_OPEN_IO_DIRECT 
+	PUFFSOP_SET(pops, perfuse, node, open2);
+#endif /* PUFFS_OPEN_IO_DIRECT */
 
 	/*
 	 * 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 src/lib/libperfuse/perfuse_priv.h:1.33
--- src/lib/libperfuse/perfuse_priv.h:1.32	Sun Aug 10 03:22:33 2014
+++ src/lib/libperfuse/perfuse_priv.h	Sat Aug 16 16:28:43 2014
@@ -1,4 +1,4 @@
-/*  $NetBSD: perfuse_priv.h,v 1.32 2014/08/10 03:22:33 manu Exp $ */
+/*  $NetBSD: perfuse_priv.h,v 1.33 2014/08/16 16:28:43 manu Exp $ */
 
 /*-
  *  Copyright (c) 2010-2011 Emmanuel Dreyfus. All rights reserved.
@@ -262,6 +262,8 @@ int perfuse_node_write(struct puffs_user
     uint8_t *, off_t, size_t *, const struct puffs_cred *, int);
 int perfuse_node_write2(struct puffs_usermount *, puffs_cookie_t,
     uint8_t *, off_t, size_t *, const struct puffs_cred *, int, int);
+int perfuse_node_open2(struct puffs_usermount *,
+    puffs_cookie_t, int, const struct puffs_cred *, int *);
 void perfuse_cache_write(struct puffs_usermount *,
     puffs_cookie_t, size_t, struct puffs_cacherun *);
 int perfuse_node_getextattr(struct puffs_usermount *, puffs_cookie_t,

Reply via email to