svn commit: r345392 - projects/fuse2/sys/fs/fuse
Alan Somers
asomers at FreeBSD.org
Thu Mar 21 22:17:11 UTC 2019
Author: asomers
Date: Thu Mar 21 22:17:10 2019
New Revision: 345392
URL: https://svnweb.freebsd.org/changeset/base/345392
Log:
fusefs: VOP_FSYNC should be synchronous -- sometimes
I committed too hastily in r345390. There are cases, not directly reachable
from userland, where VOP_FSYNC ought to be asynchronous. This commit fixes
fusefs to handle VOP_FSYNC synchronously if and only if the VFS requests it.
PR: 236474
X-MFC-With: 345390
Sponsored by: The FreeBSD Foundation
Modified:
projects/fuse2/sys/fs/fuse/fuse_internal.c
projects/fuse2/sys/fs/fuse/fuse_internal.h
projects/fuse2/sys/fs/fuse/fuse_vnops.c
Modified: projects/fuse2/sys/fs/fuse/fuse_internal.c
==============================================================================
--- projects/fuse2/sys/fs/fuse/fuse_internal.c Thu Mar 21 21:56:03 2019 (r345391)
+++ projects/fuse2/sys/fs/fuse/fuse_internal.c Thu Mar 21 22:17:10 2019 (r345392)
@@ -282,12 +282,13 @@ int
fuse_internal_fsync(struct vnode *vp,
struct thread *td,
struct ucred *cred,
- struct fuse_filehandle *fufh)
+ struct fuse_filehandle *fufh,
+ int waitfor)
{
int op = FUSE_FSYNC;
struct fuse_fsync_in *ffsi;
struct fuse_dispatcher fdi;
- int err;
+ int err = 0;
if (vnode_isdir(vp)) {
op = FUSE_FSYNCDIR;
@@ -299,7 +300,12 @@ fuse_internal_fsync(struct vnode *vp,
ffsi->fsync_flags = 1; /* datasync */
- err = fdisp_wait_answ(&fdi);
+ if (waitfor == MNT_WAIT) {
+ err = fdisp_wait_answ(&fdi);
+ } else {
+ fuse_insert_callback(fdi.tick, fuse_internal_fsync_callback);
+ fuse_insert_message(fdi.tick);
+ }
fdisp_destroy(&fdi);
return err;
Modified: projects/fuse2/sys/fs/fuse/fuse_internal.h
==============================================================================
--- projects/fuse2/sys/fs/fuse/fuse_internal.h Thu Mar 21 21:56:03 2019 (r345391)
+++ projects/fuse2/sys/fs/fuse/fuse_internal.h Thu Mar 21 22:17:10 2019 (r345392)
@@ -199,7 +199,7 @@ void fuse_internal_cache_attrs(struct vnode *vp, struc
/* fsync */
int fuse_internal_fsync(struct vnode *vp, struct thread *td,
- struct ucred *cred, struct fuse_filehandle *fufh);
+ struct ucred *cred, struct fuse_filehandle *fufh, int waitfor);
int fuse_internal_fsync_callback(struct fuse_ticket *tick, struct uio *uio);
/* readdir */
Modified: projects/fuse2/sys/fs/fuse/fuse_vnops.c
==============================================================================
--- projects/fuse2/sys/fs/fuse/fuse_vnops.c Thu Mar 21 21:56:03 2019 (r345391)
+++ projects/fuse2/sys/fs/fuse/fuse_vnops.c Thu Mar 21 22:17:10 2019 (r345392)
@@ -435,6 +435,7 @@ fuse_vnop_fsync(struct vop_fsync_args *ap)
{
struct vnode *vp = ap->a_vp;
struct thread *td = ap->a_td;
+ int waitfor = ap->a_waitfor;
struct fuse_filehandle *fufh;
struct fuse_vnode_data *fvdat = VTOFUD(vp);
@@ -454,7 +455,7 @@ fuse_vnop_fsync(struct vop_fsync_args *ap)
for (type = 0; type < FUFH_MAXTYPE; type++) {
fufh = &(fvdat->fufh[type]);
if (FUFH_IS_VALID(fufh)) {
- err = fuse_internal_fsync(vp, td, NULL, fufh);
+ err = fuse_internal_fsync(vp, td, NULL, fufh, waitfor);
}
}
More information about the svn-src-projects
mailing list