Index: kern/vfs_default.c =================================================================== RCS file: /usr/local/arch/ncvs/src/sys/kern/vfs_default.c,v retrieving revision 1.135 diff -u -r1.135 vfs_default.c --- kern/vfs_default.c 13 Nov 2006 05:51:22 -0000 1.135 +++ kern/vfs_default.c 6 Dec 2006 11:18:47 -0000 @@ -62,6 +62,7 @@ static int vop_nolookup(struct vop_lookup_args *); static int vop_nostrategy(struct vop_strategy_args *); +static int vop_stdgetsize(struct vop_getsize_args *); /* * This vnode table stores what we want to do if the filesystem doesn't @@ -96,6 +97,7 @@ .vop_revoke = VOP_PANIC, .vop_strategy = vop_nostrategy, .vop_unlock = vop_stdunlock, + .vop_getsize = vop_stdgetsize, }; /* @@ -511,6 +513,24 @@ ap->a_sync, ap->a_rtvals); } +static int +vop_stdgetsize(ap) + struct vop_getsize_args /* { + struct vnode *vp; + u_quad_t *sz; + struct ucred *cred; + struct thread *td; + } */ *ap; +{ + struct vattr va; + int error; + + error = VOP_GETATTR(ap->a_vp, &va, ap->a_cred, ap->a_td); + if (!error) + *ap->a_sz = va.va_size; + return (error); +} + /* * vfs default ops * used to fill the vfs function table to get reasonable default return values. Index: kern/vfs_subr.c =================================================================== RCS file: /usr/local/arch/ncvs/src/sys/kern/vfs_subr.c,v retrieving revision 1.692 diff -u -r1.692 vfs_subr.c --- kern/vfs_subr.c 13 Nov 2006 05:51:22 -0000 1.692 +++ kern/vfs_subr.c 6 Dec 2006 11:18:47 -0000 @@ -3817,7 +3817,7 @@ filt_vfsread(struct knote *kn, long hint) { struct vnode *vp = (struct vnode *)kn->kn_hook; - struct vattr va; + u_quad_t sz; /* * filesystem is gone, so set the EOF flag and schedule @@ -3828,10 +3828,10 @@ return (1); } - if (VOP_GETATTR(vp, &va, curthread->td_ucred, curthread)) + if (VOP_GETSIZE(vp, &sz, curthread->td_ucred, curthread)) return (0); - kn->kn_data = va.va_size - kn->kn_fp->f_offset; + kn->kn_data = sz - kn->kn_fp->f_offset; return (kn->kn_data != 0); } Index: kern/vnode_if.src =================================================================== RCS file: /usr/local/arch/ncvs/src/sys/kern/vnode_if.src,v retrieving revision 1.84 diff -u -r1.84 vnode_if.src --- kern/vnode_if.src 13 Nov 2006 05:51:22 -0000 1.84 +++ kern/vnode_if.src 6 Dec 2006 11:18:47 -0000 @@ -164,6 +164,16 @@ }; +%% getsize vp L L L + +vop_getsize { + IN struct vnode *vp; + OUT u_quad_t *sz; + IN struct ucred *cred; + IN struct thread *td; +}; + + %% setattr vp E E E %! setattr post vop_setattr_post Index: ufs/ufs/ufs_vnops.c =================================================================== RCS file: /usr/local/arch/ncvs/src/sys/ufs/ufs/ufs_vnops.c,v retrieving revision 1.283 diff -u -r1.283 ufs_vnops.c --- ufs/ufs/ufs_vnops.c 6 Nov 2006 13:42:09 -0000 1.283 +++ ufs/ufs/ufs_vnops.c 6 Dec 2006 11:18:47 -0000 @@ -97,6 +97,7 @@ static vop_close_t ufs_close; static vop_create_t ufs_create; static vop_getattr_t ufs_getattr; +static vop_getsize_t ufs_getsize; static vop_link_t ufs_link; static int ufs_makeinode(int mode, struct vnode *, struct vnode **, struct componentname *); static vop_mkdir_t ufs_mkdir; @@ -437,6 +438,28 @@ return (0); } +/* ARGSUSED */ +static int +ufs_getsize(ap) + struct vop_getsize_args /* { + struct vnode *a_vp; + struct u_quad_t *a_sz; + struct ucred *a_cred; + struct thread *a_td; + } */ *ap; +{ + struct vnode *vp = ap->a_vp; + struct inode *ip = VTOI(vp); + u_quad_t *sz = ap->a_sz; + + if (ip->i_ump->um_fstype == UFS1) { + *sz = ip->i_din1->di_size; + } else { + *sz = ip->i_din2->di_size; + } + return (0); +} + /* * Set attribute vnode op. called from several syscalls */ @@ -2464,6 +2487,7 @@ .vop_close = ufs_close, .vop_create = ufs_create, .vop_getattr = ufs_getattr, + .vop_getsize = ufs_getsize, .vop_inactive = ufs_inactive, .vop_link = ufs_link, .vop_lookup = vfs_cache_lookup, @@ -2504,6 +2528,7 @@ .vop_access = ufs_access, .vop_close = ufsfifo_close, .vop_getattr = ufs_getattr, + .vop_getsize = ufs_getsize, .vop_inactive = ufs_inactive, .vop_kqfilter = ufsfifo_kqfilter, .vop_print = ufs_print,