diff options
author | Brian Behlendorf <[email protected]> | 2011-02-25 14:36:01 +0700 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2011-05-02 08:54:40 -0700 |
commit | df554c148ecfdfb7e597f8ab7eee71388b24a19d (patch) | |
tree | f55979c7c3c842464a896e1551f93b3cfbd3e66f /config | |
parent | e90a3de3e8b52061aeb0717b031a956cc1e705d5 (diff) |
Fix 'zfs set volsize=N pool/dataset'
This change fixes a kernel panic which would occur when resizing
a dataset which was not open. The objset_t stored in the
zvol_state_t will be set to NULL when the block device is closed.
To avoid this issue we pass the correct objset_t as the third arg.
The code has also been updated to correctly notify the kernel
when the block device capacity changes. For 2.6.28 and newer
kernels the capacity change will be immediately detected. For
earlier kernels the capacity change will be detected when the
device is next opened. This is a known limitation of older
kernels.
Online ext3 resize test case passes on 2.6.28+ kernels:
$ dd if=/dev/zero of=/tmp/zvol bs=1M count=1 seek=1023
$ zpool create tank /tmp/zvol
$ zfs create -V 500M tank/zd0
$ mkfs.ext3 /dev/zd0
$ mkdir /mnt/zd0
$ mount /dev/zd0 /mnt/zd0
$ df -h /mnt/zd0
$ zfs set volsize=800M tank/zd0
$ resize2fs /dev/zd0
$ df -h /mnt/zd0
Original-patch-by: Fajar A. Nugraha <[email protected]>
Closes #68
Closes #84
Diffstat (limited to 'config')
-rw-r--r-- | config/kernel-check-disk-size-change.m4 | 12 | ||||
-rw-r--r-- | config/kernel.m4 | 1 |
2 files changed, 13 insertions, 0 deletions
diff --git a/config/kernel-check-disk-size-change.m4 b/config/kernel-check-disk-size-change.m4 new file mode 100644 index 000000000..1a730c0c5 --- /dev/null +++ b/config/kernel-check-disk-size-change.m4 @@ -0,0 +1,12 @@ +dnl # +dnl # 2.6.28 API change +dnl # Added check_disk_size_change() helper function. +dnl # +AC_DEFUN([ZFS_AC_KERNEL_CHECK_DISK_SIZE_CHANGE], [ + ZFS_CHECK_SYMBOL_EXPORT( + [check_disk_size_change], + [fs/block_dev.c], + [AC_DEFINE(HAVE_CHECK_DISK_SIZE_CHANGE, 1, + [check_disk_size_change() is available])], + []) +]) diff --git a/config/kernel.m4 b/config/kernel.m4 index e2a983b54..015192b5b 100644 --- a/config/kernel.m4 +++ b/config/kernel.m4 @@ -36,6 +36,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [ ZFS_AC_KERNEL_EVICT_INODE ZFS_AC_KERNEL_INSERT_INODE_LOCKED ZFS_AC_KERNEL_D_OBTAIN_ALIAS + ZFS_AC_KERNEL_CHECK_DISK_SIZE_CHANGE if test "$LINUX_OBJ" != "$LINUX"; then KERNELMAKE_PARAMS="$KERNELMAKE_PARAMS O=$LINUX_OBJ" |