-nfsmout:
- if (tresid == uiop->uio_resid) {
- *eofflagp = 1;
- nfsstats.direofcache_misses++;
- } else {
- *eofflagp = 0;
- }
- return (error);
-}
-
-/*
- * nfs statfs call
- * (Actually a vfsop, not a vnode op)
- */
-nfs_statfs(mp, sbp)
- struct mount *mp;
- register struct statfs *sbp;
-{
- register struct vnode *vp;
- register struct nfsv2_statfs *sfp;
- register caddr_t cp;
- register long t1;
- caddr_t bpos, dpos, cp2;
- u_long xid;
- int error = 0;
- struct mbuf *mreq, *mrep, *md, *mb, *mb2;
- struct nfsmount *nmp;
- struct ucred *cred;
- struct nfsnode *np;
-
- nmp = vfs_to_nfs(mp);
- if (error = nfs_nget(mp, &nmp->nm_fh, &np))
- return (error);
- vp = NFSTOV(np);
- nfsstats.rpccnt[NFSPROC_STATFS]++;
- cred = crget();
- cred->cr_ngroups = 1;
- nfsm_reqhead(nfs_procids[NFSPROC_STATFS], cred, NFSX_FH);
- nfsm_fhtom(vp);
- nfsm_request(vp, nonidempotent[NFSPROC_STATFS]);
- nfsm_disect(sfp, struct nfsv2_statfs *, NFSX_STATFS);
- sbp->f_type = MOUNT_NFS;
- sbp->f_flags = nmp->nm_flag;
- sbp->f_bsize = fxdr_unsigned(long, sfp->sf_tsize);
- sbp->f_fsize = fxdr_unsigned(long, sfp->sf_bsize);
- sbp->f_blocks = fxdr_unsigned(long, sfp->sf_blocks);
- sbp->f_bfree = fxdr_unsigned(long, sfp->sf_bfree);
- sbp->f_bavail = fxdr_unsigned(long, sfp->sf_bavail);
- sbp->f_files = 0;
- sbp->f_ffree = 0;
- if (sbp != &mp->m_stat) {
- bcopy(mp->m_stat.f_mntonname, sbp->f_mntonname, MNAMELEN);
- bcopy(mp->m_stat.f_mntfromname, sbp->f_mntfromname, MNAMELEN);
+ /*
+ * Fill last record, iff any, out to a multiple of DIRBLKSIZ
+ * by increasing d_reclen for the last record.
+ */
+ if (uiop->uio_resid < tresid) {
+ len = uiop->uio_resid & (DIRBLKSIZ - 1);
+ if (len > 0) {
+ dp = (struct direct *)
+ (uiop->uio_iov->iov_base - lastlen);
+ dp->d_reclen += len;
+ uiop->uio_iov->iov_base += len;
+ uiop->uio_iov->iov_len -= len;
+ uiop->uio_resid -= len;
+ }