Fix range locking in ZIL commit codepath
authorLOLi <loli10K@users.noreply.github.com>
Mon, 21 Aug 2017 15:59:48 +0000 (17:59 +0200)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 21 Aug 2017 15:59:48 +0000 (08:59 -0700)
commitf763c3d1df569a8d6b60bcb5e95cf07aa7a189e6
tree82d2534f5ef0c8a23886ea57aeaad1f70206e4af
parent08de8c16f5d322fb594742ea78958385d8ee5b50
Fix range locking in ZIL commit codepath

Since OpenZFS 7578 (1b7c1e5) if we have a ZVOL with logbias=throughput
we will force WR_INDIRECT itxs in zvol_log_write() setting itx->itx_lr
offset and length to the offset and length of the BIO from
zvol_write()->zvol_log_write(): these offset and length are later used
to take a range lock in zillog->zl_get_data function: zvol_get_data().

Now suppose we have a ZVOL with blocksize=8K and push 4K writes to
offset 0: we will only be range-locking 0-4096. This means the
ASSERTion we make in dbuf_unoverride() is no longer valid because now
dmu_sync() is called from zilog's get_data functions holding a partial
lock on the dbuf.

Fix this by taking a range lock on the whole block in zvol_get_data().

Reviewed-by: Chunwei Chen <tuxoko@gmail.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: loli10K <ezomori.nozomu@gmail.com>
Closes #6238
Closes #6315
Closes #6356
Closes #6477
cmd/ztest/ztest.c
module/zfs/dmu.c
module/zfs/zfs_vnops.c
module/zfs/zvol.c
tests/runfiles/linux.run
tests/zfs-tests/tests/functional/zvol/zvol_misc/Makefile.am
tests/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_zil.ksh [new file with mode: 0755]