From 3bddba795147da5c018578644f1757f6e636baf5 Mon Sep 17 00:00:00 2001 From: dillon Date: Mon, 20 Sep 1999 23:27:58 +0000 Subject: More removals of vnode->v_lastr, replaced by preexisting seqcount heuristic to detect sequential operation. VM-related forced clustering code removed from ufs in preparation for a commit to vm/vm_fault.c that does it more generally. Reviewed by: David Greenman , Alan Cox --- sys/fs/cd9660/cd9660_vnops.c | 6 ++- sys/fs/msdosfs/msdosfs_vfsops.c | 4 +- sys/fs/msdosfs/msdosfs_vnops.c | 9 ++-- sys/gnu/ext2fs/ext2_readwrite.c | 5 ++- sys/gnu/fs/ext2fs/ext2_readwrite.c | 5 ++- sys/isofs/cd9660/cd9660_vnops.c | 6 ++- sys/msdosfs/msdosfs_vfsops.c | 4 +- sys/msdosfs/msdosfs_vnops.c | 9 ++-- sys/ufs/ufs/ufs_readwrite.c | 89 +++++--------------------------------- 9 files changed, 41 insertions(+), 96 deletions(-) diff --git a/sys/fs/cd9660/cd9660_vnops.c b/sys/fs/cd9660/cd9660_vnops.c index ee2528b..9b2eac2 100644 --- a/sys/fs/cd9660/cd9660_vnops.c +++ b/sys/fs/cd9660/cd9660_vnops.c @@ -275,8 +275,11 @@ cd9660_read(ap) daddr_t lbn, rablock; off_t diff; int rasize, error = 0; + int seqcount; long size, n, on; + seqcount = ap->a_ioflag >> 16; + if (uio->uio_resid == 0) return (0); if (uio->uio_offset < 0) @@ -303,7 +306,7 @@ cd9660_read(ap) else error = bread(vp, lbn, size, NOCRED, &bp); } else { - if (vp->v_lastr + 1 == lbn && + if (seqcount > 1 && lblktosize(imp, rablock) < ip->i_size) { rasize = blksize(imp, ip, rablock); error = breadn(vp, lbn, size, &rablock, @@ -311,7 +314,6 @@ cd9660_read(ap) } else error = bread(vp, lbn, size, NOCRED, &bp); } - vp->v_lastr = lbn; n = min(n, size - bp->b_resid); if (error) { brelse(bp); diff --git a/sys/fs/msdosfs/msdosfs_vfsops.c b/sys/fs/msdosfs/msdosfs_vfsops.c index 625690d..8e3d0b3 100644 --- a/sys/fs/msdosfs/msdosfs_vfsops.c +++ b/sys/fs/msdosfs/msdosfs_vfsops.c @@ -769,8 +769,8 @@ msdosfs_unmount(mp, mntflags, p) printf("msdosfs_umount(): just before calling VOP_CLOSE()\n"); printf("flag %08lx, usecount %d, writecount %d, holdcnt %ld\n", vp->v_flag, vp->v_usecount, vp->v_writecount, vp->v_holdcnt); - printf("lastr %d, id %lu, mount %p, op %p\n", - vp->v_lastr, vp->v_id, vp->v_mount, vp->v_op); + printf("id %lu, mount %p, op %p\n", + vp->v_id, vp->v_mount, vp->v_op); printf("freef %p, freeb %p, mount %p\n", vp->v_freelist.tqe_next, vp->v_freelist.tqe_prev, vp->v_mount); diff --git a/sys/fs/msdosfs/msdosfs_vnops.c b/sys/fs/msdosfs/msdosfs_vnops.c index 2407e2e..05139a7 100644 --- a/sys/fs/msdosfs/msdosfs_vnops.c +++ b/sys/fs/msdosfs/msdosfs_vnops.c @@ -559,6 +559,7 @@ msdosfs_read(ap) daddr_t lbn; daddr_t rablock; int rasize; + int seqcount; struct buf *bp; struct vnode *vp = ap->a_vp; struct denode *dep = VTODE(vp); @@ -575,6 +576,8 @@ msdosfs_read(ap) if (orig_resid <= 0) return (0); + seqcount = ap->a_ioflag >> 16; + isadir = dep->de_Attributes & ATTR_DIRECTORY; do { lbn = de_cluster(pmp, uio->uio_offset); @@ -600,15 +603,15 @@ msdosfs_read(ap) error = bread(pmp->pm_devvp, lbn, blsize, NOCRED, &bp); } else { rablock = lbn + 1; - if (vp->v_lastr + 1 == lbn && + if (seqcount > 1 && de_cn2off(pmp, rablock) < dep->de_FileSize) { rasize = pmp->pm_bpcluster; error = breadn(vp, lbn, pmp->pm_bpcluster, &rablock, &rasize, 1, NOCRED, &bp); - } else + } else { error = bread(vp, lbn, pmp->pm_bpcluster, NOCRED, &bp); - vp->v_lastr = lbn; + } } n = min(n, pmp->pm_bpcluster - bp->b_resid); if (error) { diff --git a/sys/gnu/ext2fs/ext2_readwrite.c b/sys/gnu/ext2fs/ext2_readwrite.c index abcdfe3..d49466d 100644 --- a/sys/gnu/ext2fs/ext2_readwrite.c +++ b/sys/gnu/ext2fs/ext2_readwrite.c @@ -37,6 +37,7 @@ * SUCH DAMAGE. * * @(#)ufs_readwrite.c 8.7 (Berkeley) 1/21/94 + * $FreeBSD$ */ #define BLKSIZE(a, b, c) blksize(a, b, c) @@ -69,6 +70,7 @@ READ(ap) off_t bytesinfile; long size, xfersize, blkoffset; int error, orig_resid; + int seqcount = ap->a_ioflag >> 16; u_short mode; vp = ap->a_vp; @@ -113,7 +115,7 @@ READ(ap) error = cluster_read(vp, ip->i_size, lbn, size, NOCRED, uio->uio_resid, (ap->a_ioflag >> 16), &bp); - else if (lbn - 1 == vp->v_lastr) { + else if (seqcount > 1) { int nextsize = BLKSIZE(fs, ip, nextlbn); error = breadn(vp, lbn, size, &nextlbn, &nextsize, 1, NOCRED, &bp); @@ -124,7 +126,6 @@ READ(ap) bp = NULL; break; } - vp->v_lastr = lbn; /* * We should only get non-zero b_resid when an I/O error diff --git a/sys/gnu/fs/ext2fs/ext2_readwrite.c b/sys/gnu/fs/ext2fs/ext2_readwrite.c index abcdfe3..d49466d 100644 --- a/sys/gnu/fs/ext2fs/ext2_readwrite.c +++ b/sys/gnu/fs/ext2fs/ext2_readwrite.c @@ -37,6 +37,7 @@ * SUCH DAMAGE. * * @(#)ufs_readwrite.c 8.7 (Berkeley) 1/21/94 + * $FreeBSD$ */ #define BLKSIZE(a, b, c) blksize(a, b, c) @@ -69,6 +70,7 @@ READ(ap) off_t bytesinfile; long size, xfersize, blkoffset; int error, orig_resid; + int seqcount = ap->a_ioflag >> 16; u_short mode; vp = ap->a_vp; @@ -113,7 +115,7 @@ READ(ap) error = cluster_read(vp, ip->i_size, lbn, size, NOCRED, uio->uio_resid, (ap->a_ioflag >> 16), &bp); - else if (lbn - 1 == vp->v_lastr) { + else if (seqcount > 1) { int nextsize = BLKSIZE(fs, ip, nextlbn); error = breadn(vp, lbn, size, &nextlbn, &nextsize, 1, NOCRED, &bp); @@ -124,7 +126,6 @@ READ(ap) bp = NULL; break; } - vp->v_lastr = lbn; /* * We should only get non-zero b_resid when an I/O error diff --git a/sys/isofs/cd9660/cd9660_vnops.c b/sys/isofs/cd9660/cd9660_vnops.c index ee2528b..9b2eac2 100644 --- a/sys/isofs/cd9660/cd9660_vnops.c +++ b/sys/isofs/cd9660/cd9660_vnops.c @@ -275,8 +275,11 @@ cd9660_read(ap) daddr_t lbn, rablock; off_t diff; int rasize, error = 0; + int seqcount; long size, n, on; + seqcount = ap->a_ioflag >> 16; + if (uio->uio_resid == 0) return (0); if (uio->uio_offset < 0) @@ -303,7 +306,7 @@ cd9660_read(ap) else error = bread(vp, lbn, size, NOCRED, &bp); } else { - if (vp->v_lastr + 1 == lbn && + if (seqcount > 1 && lblktosize(imp, rablock) < ip->i_size) { rasize = blksize(imp, ip, rablock); error = breadn(vp, lbn, size, &rablock, @@ -311,7 +314,6 @@ cd9660_read(ap) } else error = bread(vp, lbn, size, NOCRED, &bp); } - vp->v_lastr = lbn; n = min(n, size - bp->b_resid); if (error) { brelse(bp); diff --git a/sys/msdosfs/msdosfs_vfsops.c b/sys/msdosfs/msdosfs_vfsops.c index 625690d..8e3d0b3 100644 --- a/sys/msdosfs/msdosfs_vfsops.c +++ b/sys/msdosfs/msdosfs_vfsops.c @@ -769,8 +769,8 @@ msdosfs_unmount(mp, mntflags, p) printf("msdosfs_umount(): just before calling VOP_CLOSE()\n"); printf("flag %08lx, usecount %d, writecount %d, holdcnt %ld\n", vp->v_flag, vp->v_usecount, vp->v_writecount, vp->v_holdcnt); - printf("lastr %d, id %lu, mount %p, op %p\n", - vp->v_lastr, vp->v_id, vp->v_mount, vp->v_op); + printf("id %lu, mount %p, op %p\n", + vp->v_id, vp->v_mount, vp->v_op); printf("freef %p, freeb %p, mount %p\n", vp->v_freelist.tqe_next, vp->v_freelist.tqe_prev, vp->v_mount); diff --git a/sys/msdosfs/msdosfs_vnops.c b/sys/msdosfs/msdosfs_vnops.c index 2407e2e..05139a7 100644 --- a/sys/msdosfs/msdosfs_vnops.c +++ b/sys/msdosfs/msdosfs_vnops.c @@ -559,6 +559,7 @@ msdosfs_read(ap) daddr_t lbn; daddr_t rablock; int rasize; + int seqcount; struct buf *bp; struct vnode *vp = ap->a_vp; struct denode *dep = VTODE(vp); @@ -575,6 +576,8 @@ msdosfs_read(ap) if (orig_resid <= 0) return (0); + seqcount = ap->a_ioflag >> 16; + isadir = dep->de_Attributes & ATTR_DIRECTORY; do { lbn = de_cluster(pmp, uio->uio_offset); @@ -600,15 +603,15 @@ msdosfs_read(ap) error = bread(pmp->pm_devvp, lbn, blsize, NOCRED, &bp); } else { rablock = lbn + 1; - if (vp->v_lastr + 1 == lbn && + if (seqcount > 1 && de_cn2off(pmp, rablock) < dep->de_FileSize) { rasize = pmp->pm_bpcluster; error = breadn(vp, lbn, pmp->pm_bpcluster, &rablock, &rasize, 1, NOCRED, &bp); - } else + } else { error = bread(vp, lbn, pmp->pm_bpcluster, NOCRED, &bp); - vp->v_lastr = lbn; + } } n = min(n, pmp->pm_bpcluster - bp->b_resid); if (error) { diff --git a/sys/ufs/ufs/ufs_readwrite.c b/sys/ufs/ufs/ufs_readwrite.c index 59f064e..62b0241 100644 --- a/sys/ufs/ufs/ufs_readwrite.c +++ b/sys/ufs/ufs/ufs_readwrite.c @@ -135,16 +135,15 @@ READ(ap) if ((uio->uio_resid == 0) || (error != 0)) { /* * If we finished or there was an error - * then finish up. + * then finish up (the reference previously + * obtained on object must be released). */ if ((error == 0 || uio->uio_resid != orig_resid) && (vp->v_mount->mnt_flag & MNT_NOATIME) == 0) ip->i_flag |= IN_ACCESS; + if (object) - /* - * This I don't understand - */ vm_object_vndeallocate(object); return error; } @@ -178,6 +177,12 @@ READ(ap) if (toread >= PAGE_SIZE) { error = uioread(toread, uio, object, &nread); if ((uio->uio_resid == 0) || (error != 0)) { + /* + * If we finished or there was an + * error then finish up (the reference + * previously obtained on object must + * be released). + */ if ((error == 0 || uio->uio_resid != orig_resid) && (vp->v_mount->mnt_flag & @@ -243,7 +248,7 @@ READ(ap) */ error = cluster_read(vp, ip->i_size, lbn, size, NOCRED, uio->uio_resid, seqcount, &bp); - else if (lbn - 1 == vp->v_lastr) { + else if (seqcount > 1) { /* * If we are NOT allowed to cluster, then * if we appear to be acting sequentially, @@ -269,12 +274,6 @@ READ(ap) } /* - * Remember where we read so we can see latter if we start - * acting sequential. - */ - vp->v_lastr = lbn; - - /* * We should only get non-zero b_resid when an I/O error * has occurred, which should cause us to break above. * However, if the short read did not cause an error, @@ -543,7 +542,7 @@ ffs_getpages(ap) struct vnode *dp, *vp; vm_object_t obj; vm_pindex_t pindex, firstindex; - vm_page_t m, mreq; + vm_page_t mreq; int bbackwards, bforwards; int pbackwards, pforwards; int firstpage; @@ -586,71 +585,6 @@ ffs_getpages(ap) return vnode_pager_generic_getpages(ap->a_vp, ap->a_m, ap->a_count, ap->a_reqpage); - - - if (firstindex == 0) - vp->v_lastr = 0; - - if ((firstindex != 0) && - (firstindex <= vp->v_lastr) && - ((firstindex + pcount) > vp->v_lastr)) { - - struct uio auio; - struct iovec aiov; - int error; - - for (i = 0; i < pcount; i++) { - m = ap->a_m[i]; - vm_page_activate(m); - vm_page_io_start(m); - vm_page_wakeup(m); - } - - auio.uio_iov = &aiov; - auio.uio_iovcnt = 1; - aiov.iov_base = 0; - aiov.iov_len = MAXBSIZE; - auio.uio_resid = MAXBSIZE; - auio.uio_offset = foff; - auio.uio_segflg = UIO_NOCOPY; - auio.uio_rw = UIO_READ; - auio.uio_procp = curproc; - error = VOP_READ(vp, &auio, - IO_VMIO | ((MAXBSIZE / bsize) << 16), curproc->p_ucred); - - for (i = 0; i < pcount; i++) { - m = ap->a_m[i]; - vm_page_io_finish(m); - - if ((m != mreq) && (m->wire_count == 0) && (m->hold_count == 0) && - (m->valid == 0) && (m->busy == 0) && - (m->flags & PG_BUSY) == 0) { - vm_page_busy(m); - vm_page_free(m); - } else if (m == mreq) { - while (vm_page_sleep_busy(m, FALSE, "ffspwt")) - ; - vm_page_busy(m); - vp->v_lastr = m->pindex + 1; - } else { - if (m->wire_count == 0) { - if (m->busy || (m->flags & PG_MAPPED) || - (m->flags & (PG_WANTED | PG_BUSY)) == PG_WANTED) { - vm_page_activate(m); - } else { - vm_page_deactivate(m); - } - } - vp->v_lastr = m->pindex + 1; - } - } - - if (mreq->valid == 0) - return VM_PAGER_ERROR; - if (mreq->valid != VM_PAGE_BITS_ALL) - vm_page_zero_invalid(mreq, TRUE); - return VM_PAGER_OK; - } /* * foff is the file offset of the required page @@ -717,7 +651,6 @@ ffs_getpages(ap) */ size = pcount * PAGE_SIZE; - vp->v_lastr = mreq->pindex + pcount; if ((IDX_TO_OFF(ap->a_m[firstpage]->pindex) + size) > obj->un_pager.vnp.vnp_size) -- cgit v1.1