diff --git a/module/zfs/dmu.c b/module/zfs/dmu.c index 96698b6f9ea2..3ec1d3bf1a9a 100644 --- a/module/zfs/dmu.c +++ b/module/zfs/dmu.c @@ -1524,6 +1524,7 @@ dmu_write_uio_dnode(dnode_t *dn, uio_t *uio, uint64_t size, dmu_tx_t *tx, * to lock the pages in memory, so that uiomove won't * block. */ + uio->uio_fault_disable = fault_disable; err = uiomove((char *)db->db_data + bufoff, tocpy, UIO_WRITE, uio); diff --git a/module/zfs/dmu_tx.c b/module/zfs/dmu_tx.c index 5bde56c18c2a..c268f3c40465 100644 --- a/module/zfs/dmu_tx.c +++ b/module/zfs/dmu_tx.c @@ -1040,7 +1040,6 @@ dmu_tx_assign(dmu_tx_t *tx, uint64_t txg_how) return (0); } - void dmu_tx_wait(dmu_tx_t *tx) { diff --git a/module/zfs/zfs_vnops.c b/module/zfs/zfs_vnops.c index 37e414892d99..a3cde9cb8313 100644 --- a/module/zfs/zfs_vnops.c +++ b/module/zfs/zfs_vnops.c @@ -763,9 +763,7 @@ zfs_write(struct inode *ip, uio_t *uio, int ioflag, cred_t *cr) /* * Start a transaction. */ - dmu_tx_t *tx = NULL; -top: - tx = dmu_tx_create(zfsvfs->z_os); + dmu_tx_t *tx = dmu_tx_create(zfsvfs->z_os); dmu_tx_hold_sa(tx, zp->z_sa_hdl, B_FALSE); dmu_tx_hold_write(tx, zp->z_id, woff, MIN(n, max_blksz)); zfs_sa_upgrade_txholds(tx, zp); @@ -816,7 +814,7 @@ zfs_write(struct inode *ip, uio_t *uio, int ioflag, cred_t *cr) if (error == EFAULT) { uio_prefaultpages(MIN(n, max_blksz), uio); dmu_tx_commit(tx); - goto top; + continue; } else if (error != 0) { dmu_tx_abort(tx); break;