mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-20 11:11:24 +00:00
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
This commit is contained in:
parent
ff9b6b61e6
commit
ead063e0a2
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=279536
@ -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 */
|
||||
|
@ -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 **/
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user