MFC r279536:

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@
Sponsored by:	The FreeBSD Foundation
This commit is contained in:
trasz 2015-05-15 11:03:19 +00:00
parent 871ace6a13
commit 56a7f3d096
3 changed files with 29 additions and 1 deletions

View File

@ -273,8 +273,26 @@ fuse_vnode_open(struct vnode *vp, int32_t fuse_open_flags, struct thread *td)
* 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 */

View File

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

View File

@ -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 *ap)
}
fuse_vnode_refreshsize(vp, cred);
if (VTOFUD(vp)->flag & FN_DIRECTIO) {
ioflag |= IO_DIRECT;
}
return fuse_io_dispatch(vp, uio, ioflag, cred);
}