diff options
author | Bryan Drewery <bdrewery@FreeBSD.org> | 2020-10-01 20:08:27 +0000 |
---|---|---|
committer | Bryan Drewery <bdrewery@FreeBSD.org> | 2020-10-01 20:08:27 +0000 |
commit | 9ceba2246238cf4077385f39fd906567afb99cef (patch) | |
tree | c3201a5bdb1afb66a5d029b485e91482b91a96eb /sys/kern/vfs_bio.c | |
parent | 320ef1bef081b626c2e230740d85e72313fbefca (diff) | |
download | src-9ceba2246238cf4077385f39fd906567afb99cef.tar.gz src-9ceba2246238cf4077385f39fd906567afb99cef.zip |
Revert r366340.
CR wasn't finished and it breaks the build.
Notes
Notes:
svn path=/head/; revision=366343
Diffstat (limited to 'sys/kern/vfs_bio.c')
-rw-r--r-- | sys/kern/vfs_bio.c | 43 |
1 files changed, 18 insertions, 25 deletions
diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c index 7ead23b6a595..e7294dc90503 100644 --- a/sys/kern/vfs_bio.c +++ b/sys/kern/vfs_bio.c @@ -154,7 +154,7 @@ caddr_t __read_mostly unmapped_buf; /* Used below and for softdep flushing threads in ufs/ffs/ffs_softdep.c */ struct proc *bufdaemonproc; -static bool inmem(struct vnode *vp, daddr_t blkno); +static int inmem(struct vnode *vp, daddr_t blkno); static void vm_hold_free_pages(struct buf *bp, int newbsize); static void vm_hold_load_pages(struct buf *bp, vm_offset_t from, vm_offset_t to); @@ -3586,21 +3586,20 @@ incore(struct bufobj *bo, daddr_t blkno) * it also hunts around in the VM system for the data. */ -static bool +static int inmem(struct vnode * vp, daddr_t blkno) { vm_object_t obj; vm_offset_t toff, tinc, size; - vm_page_t m, n; + vm_page_t m; vm_ooffset_t off; - int valid; ASSERT_VOP_LOCKED(vp, "inmem"); if (incore(&vp->v_bufobj, blkno)) - return (1); + return 1; if (vp->v_mount == NULL) - return (0); + return 0; obj = vp->v_object; if (obj == NULL) return (0); @@ -3610,30 +3609,24 @@ inmem(struct vnode * vp, daddr_t blkno) size = vp->v_mount->mnt_stat.f_iosize; off = (vm_ooffset_t)blkno * (vm_ooffset_t)vp->v_mount->mnt_stat.f_iosize; + VM_OBJECT_RLOCK(obj); for (toff = 0; toff < vp->v_mount->mnt_stat.f_iosize; toff += tinc) { - m = vm_page_lookup_unlocked(obj, OFF_TO_IDX(off + toff)); -recheck: - if (m == NULL) - return (0); - /* - * Consider page validity only if page mapping didn't change - * during the check. - */ - valid = vm_page_is_valid(m, - (vm_offset_t)((toff + off) & PAGE_MASK), tinc); - n = vm_page_lookup_unlocked(obj, OFF_TO_IDX(off + toff)); - if (m != n) { - m = n; - goto recheck; - } - if (!valid) - return (0); - + m = vm_page_lookup(obj, OFF_TO_IDX(off + toff)); + if (!m) + goto notinmem; tinc = size; if (tinc > PAGE_SIZE - ((toff + off) & PAGE_MASK)) tinc = PAGE_SIZE - ((toff + off) & PAGE_MASK); + if (vm_page_is_valid(m, + (vm_offset_t) ((toff + off) & PAGE_MASK), tinc) == 0) + goto notinmem; } - return (1); + VM_OBJECT_RUNLOCK(obj); + return 1; + +notinmem: + VM_OBJECT_RUNLOCK(obj); + return (0); } /* |