Index: sys/fs/fuse/fuse_node.c =================================================================== --- sys/fs/fuse/fuse_node.c (revisione 242577) +++ sys/fs/fuse/fuse_node.c (copia locale) @@ -127,6 +127,8 @@ int fuse_fix_broken_io = 0; SYSCTL_INT(_vfs_fuse, OID_AUTO, fix_broken_io, CTLFLAG_RW, &fuse_fix_broken_io, 0, ""); +extern int fuse_debug_getattr; + static void fuse_vnode_init(struct vnode *vp, struct fuse_vnode_data *fvdat, uint64_t nodeid, enum vtype vtyp) @@ -289,6 +291,10 @@ fuse_isvalid_attr(struct vnode *vp) struct timespec uptsp; nanouptime(&uptsp); + if (fuse_debug_getattr) + printf("tvp sec: %l, uvp sec: %l, tvp nsec: %l, uvp nsec: %l\n", + uptsp.tv_sec, (fvdat->cached_attrs_valid).tv_sec, + uptsp.tv_nsec, (fvdat->cached_attrs_valid).tv_nsec); return fuse_timespec_cmp(&uptsp, &fvdat->cached_attrs_valid, <=); } Index: sys/fs/fuse/fuse_vnops.c =================================================================== --- sys/fs/fuse/fuse_vnops.c (revisione 242577) +++ sys/fs/fuse/fuse_vnops.c (copia locale) @@ -179,6 +179,11 @@ int fuse_lookup_cache_enable = 1; SYSCTL_INT(_vfs_fuse, OID_AUTO, lookup_cache_enable, CTLFLAG_RW, &fuse_lookup_cache_enable, 0, ""); +int fuse_debug_getattr = 0; + +SYSCTL_INT(_vfs_fuse, OID_AUTO, debug_getattr, CTLFLAG_RW, + &fuse_debug_getattr, 0, ""); + /* * XXX: This feature is highly experimental and can bring to instabilities, * needs revisiting before to be enabled by default. @@ -485,11 +490,17 @@ fuse_vnop_getattr(struct vop_getattr_args *ap) /* look for cached attributes */ if (fuse_isvalid_attr(vp)) { if (vap != VTOVA(vp)) { + if (fuse_debug_getattr) + printf("trick 2\n"); memcpy(vap, VTOVA(vp), sizeof(*vap)); } if ((fvdat->flag & FN_SIZECHANGE) != 0) { + if (fuse_debug_getattr) + printf("trick 3\n"); vap->va_size = fvdat->filesize; } + if (fuse_debug_getattr) + printf("end trick\n"); debug_printf("return cached: inode=%ju\n", (uintmax_t)VTOI(vp)); return 0; }