git: sys/kern: Add struct file* arg to VOP_{GETATTR, SETATTR, READ, WRITE, FSYNC, READDIR}
Tomohiro Kusumi
tkusumi at crater.dragonflybsd.org
Sun Mar 31 10:04:29 PDT 2019
commit 2dfa19fa300df7648d9bf56b69c2cfd345882046
Author: Tomohiro Kusumi <kusumi.tomohiro at gmail.com>
Date: Mon Apr 1 01:30:07 2019 +0900
sys/kern: Add struct file* arg to VOP_{GETATTR,SETATTR,READ,WRITE,FSYNC,READDIR}
This commit changes VOP interface to support FUSE API/ABI.
It just adds an additional struct file* argument to VOP's, so that
FUSE VOP's can access *fp pointer (currently accessible only from
caller of VOP's if any, with exception of VOP_OPEN(), VOP_CLOSE(),
etc) and make use of its ->private_data pointer.
FUSE API/ABI requires FUSE to maintain a per file (usually per file
descriptor) data called fh. The fh is an opaque data whose purpose
may differ among userspace filesystems, but typically used to store
file descriptor value or arbitrary userspace address used by the
userspace filesystem process.
Below diagram illustrates typical flow of maintaining fh. The
userspace filesystem uses fd obtained from opening backing store
(e.g fd for regular file, socket, etc) for fh, as a consequence of
end user's open(2) syscall, and expects FUSE to maintain that value
for future use as an identifier for userspace.
* Notes on Linux VFS I/F vs BSD VFS I/F:
In Linux, supporting the concept of fh is quite straight forward since
Linux kernel has functions vector built around (opened)file including
things like mmap(2) handler, in addition to a vector built around
inode.
But since DragonFly doesn't have a vector built around file (other
than a simple struct fileops, which doesn't meet requirements of fh),
this change was needed for selected VOP's as minimum requirements
for initial FUSE API/ABI support.
--
FUSE user FUSE FUSE userspace fs
| | |
|---------open(2)--------->| |
| * issue VOP_OPEN |---------VOP_OPEN-------->|
| | * issue FUSE_OPEN | * open something
| | | * reply fd as fh
| |<--------VOP_OPEN---------|
|<--------open(2)----------| * store fh in fp |
| * open success | |
| | |
|... | |
|... | |
| | |
|---------read(2)--------->| |
| * issue VOP_READ |---------VOP_READ-------->|
| | * issue FUSE_READ |
| | with fh from fp | * read something
| | | using fh for fd
| |<--------VOP_READ---------|
|<--------read(2)----------| * return read bytes |
| * uiomove() success | |
| | |
Summary of changes:
sys/kern/kern_fp.c | 2 +-
sys/kern/uipc_syscalls.c | 4 ++--
sys/kern/vfs_syscalls.c | 12 ++++++------
sys/kern/vfs_vnops.c | 6 +++---
sys/kern/vfs_vopops.c | 21 +++++++++++++++------
sys/sys/vfsops.h | 44 ++++++++++++++++++++++++++++++++------------
6 files changed, 59 insertions(+), 30 deletions(-)
http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff/2dfa19fa300df7648d9bf56b69c2cfd345882046
--
DragonFly BSD source repository
More information about the Commits
mailing list