Module Name: src
Committed By: ad
Date: Thu May 21 20:43:23 UTC 2020
Modified Files:
src/external/cddl/osnet/dist/uts/common/fs/zfs: zfs_vnops.c
Log Message:
Fix bugs in previous.
To generate a diff of this commit:
cvs rdiff -u -r1.68 -r1.69 \
src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c
diff -u src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c:1.68 src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c:1.69
--- src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c:1.68 Wed May 20 20:47:18 2020
+++ src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c Thu May 21 20:43:23 2020
@@ -5971,7 +5971,6 @@ zfs_netbsd_getpages(void *v)
} */ * const ap = v;
vnode_t *const vp = ap->a_vp;
- off_t offset = ap->a_offset + (ap->a_centeridx << PAGE_SHIFT);
const int flags = ap->a_flags;
const bool async = (flags & PGO_SYNCIO) == 0;
const bool memwrite = (ap->a_access_type & VM_PROT_WRITE) != 0;
@@ -5983,12 +5982,13 @@ zfs_netbsd_getpages(void *v)
vfs_t *mp;
struct vm_page *pg;
caddr_t va;
- int npages, found, err = 0;
+ int npages = *ap->a_count, found, err = 0;
if (flags & PGO_LOCKED) {
- uvn_findpages(uobj, ap->a_offset, ap->a_count, ap->a_m, NULL,
+ uvn_findpages(uobj, ap->a_offset, &npages, ap->a_m, NULL,
UFP_NOWAIT | UFP_NOALLOC | UFP_NOBUSY |
(memwrite ? UFP_NORDONLY : 0));
+ KASSERT(npages == *ap->a_count);
if (memwrite) {
KASSERT(rw_write_held(uobj->vmobjlock));
for (int i = 0; i < npages; i++) {
@@ -6010,9 +6010,6 @@ zfs_netbsd_getpages(void *v)
if (async) {
return 0;
}
- if (*ap->a_count != 1) {
- return EBUSY;
- }
mp = vp->v_mount;
fstrans_start(mp);
@@ -6024,18 +6021,20 @@ zfs_netbsd_getpages(void *v)
ZFS_VERIFY_ZP(zp);
rw_enter(rw, RW_WRITER);
- if (offset >= vp->v_size) {
+ if (ap->a_offset + (npages << PAGE_SHIFT) > round_page(vp->v_size)) {
rw_exit(rw);
ZFS_EXIT(zfsvfs);
fstrans_done(mp);
return EINVAL;
}
- npages = *ap->a_count;
- uvn_findpages(uobj, offset, &npages, ap->a_m, NULL, UFP_ALL);
+ uvn_findpages(uobj, ap->a_offset, &npages, ap->a_m, NULL, UFP_ALL);
+ KASSERT(npages == *ap->a_count);
for (int i = 0; i < npages; i++) {
pg = ap->a_m[i];
if (pg->flags & PG_FAKE) {
+ voff_t offset = pg->offset;
+ KASSERT(pg->offset == ap->a_offset + (i << PAGE_SHIFT));
rw_exit(rw);
va = zfs_map_page(pg, S_WRITE);