svn commit: r347554 - projects/fuse2/sys/fs/fuse
Alan Somers
asomers at FreeBSD.org
Mon May 13 23:30:07 UTC 2019
Author: asomers
Date: Mon May 13 23:30:06 2019
New Revision: 347554
URL: https://svnweb.freebsd.org/changeset/base/347554
Log:
fusefs: eliminate superfluous FUSE_GETATTR when filesize=0
fuse_vnode_refreshsize was using 0 as a flag value for filesize meaning
"uninitialized" (thanks to the malloc(...M_ZERO) in fuse_vnode_alloc. But
this led to unnecessary getattr operations when the filesize legitimately
happened to be zero. Fix by adding a distinct flag value.
Sponsored by: The FreeBSD Foundation
Modified:
projects/fuse2/sys/fs/fuse/fuse_node.c
projects/fuse2/sys/fs/fuse/fuse_node.h
Modified: projects/fuse2/sys/fs/fuse/fuse_node.c
==============================================================================
--- projects/fuse2/sys/fs/fuse/fuse_node.c Mon May 13 22:17:11 2019 (r347553)
+++ projects/fuse2/sys/fs/fuse/fuse_node.c Mon May 13 23:30:06 2019 (r347554)
@@ -143,6 +143,7 @@ fuse_vnode_init(struct vnode *vp, struct fuse_vnode_da
fvdat->nid = nodeid;
LIST_INIT(&fvdat->handles);
vattr_null(&fvdat->cached_attrs);
+ fvdat->filesize = FUSE_FILESIZE_UNINITIALIZED;
if (nodeid == FUSE_ROOT_ID) {
vp->v_vflag |= VV_ROOT;
}
@@ -388,15 +389,10 @@ fuse_vnode_refreshsize(struct vnode *vp, struct ucred
if ((fvdat->flag & FN_SIZECHANGE) != 0 ||
fuse_data_cache_mode == FUSE_CACHE_UC ||
- fvdat->filesize != 0)
+ fvdat->filesize != FUSE_FILESIZE_UNINITIALIZED)
return 0;
- /*
- * TODO: replace VOP_GETATTR with fuse_internal_getattr to use the
- * cached attributes. Better yet, replace fvdat->filesize with
- * attrs->va_size
- */
- err = VOP_GETATTR(vp, &va, cred);
+ err = fuse_internal_getattr(vp, &va, cred, curthread);
SDT_PROBE2(fusefs, , node, trace, 1, "refreshed file size");
return err;
}
Modified: projects/fuse2/sys/fs/fuse/fuse_node.h
==============================================================================
--- projects/fuse2/sys/fs/fuse/fuse_node.h Mon May 13 22:17:11 2019 (r347553)
+++ projects/fuse2/sys/fs/fuse/fuse_node.h Mon May 13 23:30:06 2019 (r347554)
@@ -71,6 +71,8 @@
#define FN_SIZECHANGE 0x00000100
#define FN_DIRECTIO 0x00000200
+#define FUSE_FILESIZE_UNINITIALIZED -1
+
struct fuse_vnode_data {
/** self **/
uint64_t nid;
@@ -89,7 +91,11 @@ struct fuse_vnode_data {
/* The monotonic time after which the attr cache is invalid */
struct bintime attr_cache_timeout;
struct vattr cached_attrs;
- /* TODO: use cached_attrs.size instead */
+ /*
+ * File size according to the kernel, not the daemon.
+ * May differ from cached_attrs.st_size due to write caching. Unlike
+ * cached_attrs.st_size, filesize never expires.
+ */
off_t filesize;
uint64_t nlookup;
enum vtype vtype;
More information about the svn-src-projects
mailing list