svn commit: r344185 - head/sys/fs/fuse

Conrad Meyer cem at FreeBSD.org
Fri Feb 15 22:51:11 UTC 2019


Author: cem
Date: Fri Feb 15 22:51:09 2019
New Revision: 344185
URL: https://svnweb.freebsd.org/changeset/base/344185

Log:
  FUSE: Only "dirty" cached file size when data is dirty
  
  Most users of fuse_vnode_setsize() set the cached fvdat->filesize and update
  the buf cache bounds as a result of either a read from the underlying FUSE
  filesystem, or as part of a write-through type operation (like truncate =>
  VOP_SETATTR).  In these cases, do not set the FN_SIZECHANGE flag, which
  indicates that an inode's data is dirty (in particular, that the local buf
  cache and fvdat->filesize have dirty extended data).
  
  PR:		230258 (related)

Modified:
  head/sys/fs/fuse/fuse_io.c
  head/sys/fs/fuse/fuse_node.c
  head/sys/fs/fuse/fuse_vnops.c

Modified: head/sys/fs/fuse/fuse_io.c
==============================================================================
--- head/sys/fs/fuse/fuse_io.c	Fri Feb 15 22:50:31 2019	(r344184)
+++ head/sys/fs/fuse/fuse_io.c	Fri Feb 15 22:51:09 2019	(r344185)
@@ -362,8 +362,11 @@ fuse_write_directbackend(struct vnode *vp, struct uio 
 		}
 		uio->uio_resid += diff;
 		uio->uio_offset -= diff;
-		if (uio->uio_offset > fvdat->filesize)
+		if (uio->uio_offset > fvdat->filesize &&
+		    fuse_data_cache_enable) {
 			fuse_vnode_setsize(vp, cred, uio->uio_offset);
+			fvdat->flag &= ~FN_SIZECHANGE;
+		}
 	}
 
 	fdisp_destroy(&fdi);

Modified: head/sys/fs/fuse/fuse_node.c
==============================================================================
--- head/sys/fs/fuse/fuse_node.c	Fri Feb 15 22:50:31 2019	(r344184)
+++ head/sys/fs/fuse/fuse_node.c	Fri Feb 15 22:51:09 2019	(r344185)
@@ -375,6 +375,7 @@ fuse_vnode_refreshsize(struct vnode *vp, struct ucred 
 	struct vattr va;
 
 	if ((fvdat->flag & FN_SIZECHANGE) != 0 ||
+	    fuse_data_cache_enable == 0 ||
 	    (fuse_refresh_size == 0 && fvdat->filesize != 0))
 		return;
 

Modified: head/sys/fs/fuse/fuse_vnops.c
==============================================================================
--- head/sys/fs/fuse/fuse_vnops.c	Fri Feb 15 22:50:31 2019	(r344184)
+++ head/sys/fs/fuse/fuse_vnops.c	Fri Feb 15 22:51:09 2019	(r344185)
@@ -538,6 +538,7 @@ fuse_vnop_getattr(struct vop_getattr_args *ap)
 
 		if (fvdat->filesize != new_filesize) {
 			fuse_vnode_setsize(vp, cred, new_filesize);
+			fvdat->flag &= ~FN_SIZECHANGE;
 		}
 	}
 	debug_printf("fuse_getattr e: returning 0\n");
@@ -1637,9 +1638,9 @@ fuse_vnop_setattr(struct vop_setattr_args *ap)
 			err = EAGAIN;
 		}
 	}
-	if (!err && !sizechanged) {
+	if (err == 0)
 		cache_attrs(vp, (struct fuse_attr_out *)fdi.answ, NULL);
-	}
+
 out:
 	fdisp_destroy(&fdi);
 	if (!err && sizechanged) {


More information about the svn-src-head mailing list