Module Name: src Committed By: hannken Date: Sat Jan 5 09:20:29 UTC 2019
Modified Files: src/external/cddl/osnet/dist/uts/common/fs/zfs: zfs_vnops.c Log Message: Even though zfs_netbsd_putpages() cannot use ZFS_ENTER() it has to respect the teardown lock. Enter z_teardown_lock as reader and ZFS_EXIT(). Instead of ZFS_VERIFY_ZP() return without writing and without error from zfs_putapage() if "z_sa_hdl == NULL". To generate a diff of this commit: cvs rdiff -u -r1.41 -r1.42 \ 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.41 src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c:1.42 --- src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c:1.41 Tue Jan 1 10:09:26 2019 +++ src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c Sat Jan 5 09:20:29 2019 @@ -5863,6 +5863,11 @@ zfs_putapage(vnode_t *vp, page_t **pp, i struct uvm_object *uobj = &vp->v_uobj; kmutex_t *mtx = uobj->vmobjlock; + if (zp->z_sa_hdl == NULL) { + err = 0; + goto out_unbusy; + } + off = pp[0]->offset; len = count * PAGESIZE; KASSERT(off + len <= round_page(zp->z_size)); @@ -5914,6 +5919,7 @@ zfs_putapage(vnode_t *vp, page_t **pp, i } dmu_tx_commit(tx); +out_unbusy: mutex_enter(mtx); mutex_enter(&uvm_pageqlock); uvm_page_unbusy(pp, count); @@ -5994,6 +6000,12 @@ zfs_netbsd_putpages(void *v) return 0; } } + /* + * Cannot use ZFS_ENTER() here as it returns with error + * if z_unmounted. The next statement is equivalent. + */ + rrm_enter(&zfsvfs->z_teardown_lock, RW_READER, FTAG); + rl = zfs_range_lock(zp, offlo, len, RL_WRITER); mutex_enter(vp->v_interlock); tsd_set(zfs_putpage_key, &cleaned); @@ -6011,6 +6023,7 @@ zfs_netbsd_putpages(void *v) if (cleaned) if (!async || zfsvfs->z_os->os_sync == ZFS_SYNC_ALWAYS) zil_commit(zfsvfs->z_log, zp->z_id); + ZFS_EXIT(zfsvfs); fstrans_done(vp->v_mount); } return error;