svn commit: r279536 - head/sys/fs/fuse

Edward Tomasz Napierala trasz at FreeBSD.org
Mon Mar 2 19:04:29 UTC 2015


Author: trasz
Date: Mon Mar  2 19:04:27 2015
New Revision: 279536
URL: https://svnweb.freebsd.org/changeset/base/279536

Log:
  Make fuse(4) respect FOPEN_DIRECT_IO.  This is required for correct
  operation of GlusterFS.
  
  PR:		192701
  Submitted by:	harsha at harshavardhana.net
  Reviewed by:	kib@
  MFC after:	1 month
  Sponsored by:	The FreeBSD Foundation

Modified:
  head/sys/fs/fuse/fuse_node.c
  head/sys/fs/fuse/fuse_node.h
  head/sys/fs/fuse/fuse_vnops.c

Modified: head/sys/fs/fuse/fuse_node.c
==============================================================================
--- head/sys/fs/fuse/fuse_node.c	Mon Mar  2 18:10:58 2015	(r279535)
+++ head/sys/fs/fuse/fuse_node.c	Mon Mar  2 19:04:27 2015	(r279536)
@@ -273,8 +273,26 @@ fuse_vnode_open(struct vnode *vp, int32_
          * Funcation is called for every vnode open.
          * Merge fuse_open_flags it may be 0
          *
-         * XXXIP: Handle FOPEN_DIRECT_IO and FOPEN_KEEP_CACHE
+         * XXXIP: Handle FOPEN_KEEP_CACHE
          */
+        /*
+	  * Ideally speaking, direct io should be enabled on
+         * fd's but do not see of any way of providing that
+         * this implementation.
+
+         * Also cannot think of a reason why would two
+         * different fd's on same vnode would like
+         * have DIRECT_IO turned on and off. But linux
+         * based implementation works on an fd not an
+         * inode and provides such a feature.
+         *
+         * XXXIP: Handle fd based DIRECT_IO
+         */
+	if (fuse_open_flags & FOPEN_DIRECT_IO) {
+		VTOFUD(vp)->flag |= FN_DIRECTIO;
+	} else {
+	        VTOFUD(vp)->flag &= ~FN_DIRECTIO;
+	}
 
 	if (vnode_vtype(vp) == VREG) {
 		/* XXXIP prevent getattr, by using cached node size */

Modified: head/sys/fs/fuse/fuse_node.h
==============================================================================
--- head/sys/fs/fuse/fuse_node.h	Mon Mar  2 18:10:58 2015	(r279535)
+++ head/sys/fs/fuse/fuse_node.h	Mon Mar  2 19:04:27 2015	(r279536)
@@ -67,6 +67,7 @@
 #define FN_FLUSHINPROG       0x00000040
 #define FN_FLUSHWANT         0x00000080
 #define FN_SIZECHANGE        0x00000100
+#define FN_DIRECTIO          0x00000200
 
 struct fuse_vnode_data {
     /** self **/

Modified: head/sys/fs/fuse/fuse_vnops.c
==============================================================================
--- head/sys/fs/fuse/fuse_vnops.c	Mon Mar  2 18:10:58 2015	(r279535)
+++ head/sys/fs/fuse/fuse_vnops.c	Mon Mar  2 19:04:27 2015	(r279536)
@@ -1173,6 +1173,11 @@ fuse_vnop_read(struct vop_read_args *ap)
 	if (fuse_isdeadfs(vp)) {
 		return ENXIO;
 	}
+
+	if (VTOFUD(vp)->flag & FN_DIRECTIO) {
+		ioflag |= IO_DIRECT;
+	}
+
 	return fuse_io_dispatch(vp, uio, ioflag, cred);
 }
 
@@ -1712,6 +1717,10 @@ fuse_vnop_write(struct vop_write_args *a
 	}
 	fuse_vnode_refreshsize(vp, cred);
 
+	if (VTOFUD(vp)->flag & FN_DIRECTIO) {
+		ioflag |= IO_DIRECT;
+	}
+
 	return fuse_io_dispatch(vp, uio, ioflag, cred);
 }
 


More information about the svn-src-all mailing list