-
Notifications
You must be signed in to change notification settings - Fork 1.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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(). Signed-off-by: loli10K <ezomori.nozomu@gmail.com>
- Loading branch information
Showing
7 changed files
with
123 additions
and
14 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
74 changes: 74 additions & 0 deletions
74
tests/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_zil.ksh
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
#!/bin/ksh -p | ||
# | ||
# CDDL HEADER START | ||
# | ||
# The contents of this file are subject to the terms of the | ||
# Common Development and Distribution License (the "License"). | ||
# You may not use this file except in compliance with the License. | ||
# | ||
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | ||
# or http://www.opensolaris.org/os/licensing. | ||
# See the License for the specific language governing permissions | ||
# and limitations under the License. | ||
# | ||
# When distributing Covered Code, include this CDDL HEADER in each | ||
# file and include the License file at usr/src/OPENSOLARIS.LICENSE. | ||
# If applicable, add the following below this CDDL HEADER, with the | ||
# fields enclosed by brackets "[]" replaced with your own identifying | ||
# information: Portions Copyright [yyyy] [name of copyright owner] | ||
# | ||
# CDDL HEADER END | ||
# | ||
|
||
# | ||
# Copyright 2017, loli10K <ezomori.nozomu@gmail.com>. All rights reserved. | ||
# | ||
|
||
. $STF_SUITE/include/libtest.shlib | ||
. $STF_SUITE/tests/functional/zvol/zvol_common.shlib | ||
. $STF_SUITE/tests/functional/zvol/zvol_misc/zvol_misc_common.kshlib | ||
|
||
# | ||
# DESCRIPTION: | ||
# Verify ZIL functionality on ZVOLs | ||
# | ||
# STRATEGY: | ||
# 1. Create a ZVOLs with various combination of "logbias" and "sync" values | ||
# 2. Write data to ZVOL device node | ||
# 3. Verify we don't trigger any issue like the one reported in #6238 | ||
# | ||
|
||
verify_runnable "global" | ||
|
||
function cleanup | ||
{ | ||
datasetexists $ZVOL && log_must_busy zfs destroy $ZVOL | ||
udev_wait | ||
} | ||
|
||
log_assert "Verify ZIL functionality on ZVOLs" | ||
log_onexit cleanup | ||
|
||
ZVOL="$TESTPOOL/vol" | ||
ZDEV="$ZVOL_DEVDIR/$ZVOL" | ||
typeset -a logbias_prop_vals=('latency' 'throughput') | ||
typeset -a sync_prop_vals=('standard' 'always' 'disabled') | ||
|
||
for logbias in ${logbias_prop_vals[@]}; do | ||
for sync in ${sync_prop_vals[@]}; do | ||
# 1. Create a ZVOL with logbias=throughput and sync=always | ||
log_must zfs create -V $VOLSIZE -b 128K -o sync=$sync \ | ||
-o logbias=$logbias $ZVOL | ||
|
||
# 2. Write data to its device node | ||
for i in {1..50}; do | ||
dd if=/dev/zero of=$ZDEV bs=8k count=1 & | ||
done | ||
|
||
# 3. Verify we don't trigger any issue | ||
log_must wait | ||
log_must_busy zfs destroy $ZVOL | ||
done | ||
done | ||
|
||
log_pass "ZIL functionality works on ZVOLs" |