Bug 192701 - [fusefs] FOPEN_DIRECT_IO not honored by fuse module
Summary: [fusefs] FOPEN_DIRECT_IO not honored by fuse module
Status: Closed FIXED
Alias: None
Product: Base System
Classification: Unclassified
Component: kern (show other bugs)
Version: 10.0-RELEASE
Hardware: amd64 Any
: Normal Affects Some People
Assignee: Edward Tomasz Napierala
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2014-08-16 09:10 UTC by Harshavardhana
Modified: 2015-05-15 11:11 UTC (History)
3 users (show)

See Also:


Attachments
FUSE honor FOPEN_DIRECT_IO (1.68 KB, patch)
2014-08-16 09:10 UTC, Harshavardhana
no flags Details | Diff
FUSE honor FOPEN_DIRECT_IO v2 (2.02 KB, patch)
2014-08-18 20:39 UTC, Harshavardhana
no flags Details | Diff
FUSE honor FOPEN_DIRECT_IO v3 (2.04 KB, patch)
2014-08-25 23:04 UTC, Harshavardhana
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Harshavardhana 2014-08-16 09:10:53 UTC
Created attachment 145860 [details]
FUSE honor FOPEN_DIRECT_IO

FUSE module does not honor FOPEN_DIRECT_IO flags being set by the user space filesystem for example here is 'glusterfs'


------- fuse_vnode_open() ------------
          * Funcation is called for every vnode open.
          * Merge fuse_open_flags it may be 0
          *
          * XXXIP: Handle FOPEN_DIRECT_IO and FOPEN_KEEP_CACHE
--------------------------------------

Currently just ignores this option. 


The necessity for this comes from the point of view of GlusterFS, with in GlusterFS there is a feature called 'meta' which provide meta information about the mounted filesystem and provides largely fine grained statistics about the the filesystem.

IT is necessary to have this feature available for consistency and also for better portability on FreeBSD. 

The issue seems to be that VFS takes hint from the file size (returned in lookup/stat) to limit itself from not read()ing beyond that offset. So if a file size is returned 0 in lookup, read() is never received even by FUSE.

In meta all file sizes are 0 (since the contents of the inode are generated dynamically on open()/read(), size is unknown during lookup() -- just like /proc (on linux)). And therefore all meta file open()s are forced into direct_io_mode  so that read() requests are sent straight to FUSE/glusterfs bypassing VFS (size is ignored etc.)

It requires for read/write requests over a vnode to be sent directly to FUSE not to VFS which would ignore a '0byte' file. 

Attaching a patch which fixes this and allows FreeBSD FUSE to honor FOPEN_DIRECT_IO flag and also helps getting 'meta' module working.
Comment 1 Harshavardhana 2014-08-18 20:39:33 UTC
Created attachment 146010 [details]
FUSE honor FOPEN_DIRECT_IO v2
Comment 2 Harshavardhana 2014-08-25 23:04:55 UTC
Created attachment 146279 [details]
FUSE honor FOPEN_DIRECT_IO v3
Comment 3 Harshavardhana 2014-09-05 01:21:31 UTC
Is there anything needed from my end?
Comment 4 commit-hook freebsd_committer freebsd_triage 2015-03-02 19:04:43 UTC
A commit references this bug:

Author: trasz
Date: Mon Mar  2 19:04:29 UTC 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

Changes:
  head/sys/fs/fuse/fuse_node.c
  head/sys/fs/fuse/fuse_node.h
  head/sys/fs/fuse/fuse_vnops.c
Comment 5 commit-hook freebsd_committer freebsd_triage 2015-05-15 11:03:32 UTC
A commit references this bug:

Author: trasz
Date: Fri May 15 11:03:20 UTC 2015
New revision: 282960
URL: https://svnweb.freebsd.org/changeset/base/282960

Log:
  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

Changes:
_U  stable/10/
  stable/10/sys/fs/fuse/fuse_node.c
  stable/10/sys/fs/fuse/fuse_node.h
  stable/10/sys/fs/fuse/fuse_vnops.c