diff options
author | Etienne Dechamps <[email protected]> | 2011-09-02 15:23:12 +0200 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2012-02-09 16:19:38 -0800 |
commit | 30930fba219642cb1dadf1c8ef60ff799e3dc424 (patch) | |
tree | 093f2c5c254768e859f8307d77d393e9668b5e1f /config | |
parent | cb2d19010d8fbcf6c22585cd8763fad3ba7db724 (diff) |
Add support for DISCARD to ZVOLs.
DISCARD (REQ_DISCARD, BLKDISCARD) is useful for thin provisioning.
It allows ZVOL clients to discard (unmap, trim) block ranges from
a ZVOL, thus optimizing disk space usage by allowing a ZVOL to
shrink instead of just grow.
We can't use zfs_space() or zfs_freesp() here, since these functions
only work on regular files, not volumes. Fortunately we can use the
low-level function dmu_free_long_range() which does exactly what we
want.
Currently the discard operation is not added to the log. That's not
a big deal since losing discard requests cannot result in data
corruption. It would however result in disk space usage higher than
it should be. Thus adding log support to zvol_discard() is probably
a good idea for a future improvement.
Signed-off-by: Brian Behlendorf <[email protected]>
Diffstat (limited to 'config')
-rw-r--r-- | config/kernel-blk-queue-discard.m4 | 22 | ||||
-rw-r--r-- | config/kernel.m4 | 1 |
2 files changed, 23 insertions, 0 deletions
diff --git a/config/kernel-blk-queue-discard.m4 b/config/kernel-blk-queue-discard.m4 new file mode 100644 index 000000000..3e5147a51 --- /dev/null +++ b/config/kernel-blk-queue-discard.m4 @@ -0,0 +1,22 @@ +dnl # +dnl # 2.6.32 API change +dnl # Discard requests were moved to the normal I/O path. +dnl # +AC_DEFUN([ZFS_AC_KERNEL_BLK_QUEUE_DISCARD], [ + AC_MSG_CHECKING([whether blk_queue_discard() is available]) + tmp_flags="$EXTRA_KCFLAGS" + EXTRA_KCFLAGS="-Wno-unused-but-set-variable" + ZFS_LINUX_TRY_COMPILE([ + #include <linux/blkdev.h> + ],[ + struct request_queue *q = NULL; + (void) blk_queue_discard(q); + ],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_BLK_QUEUE_DISCARD, 1, + [blk_queue_discard() is available]) + ],[ + AC_MSG_RESULT(no) + ]) + EXTRA_KCFLAGS="$tmp_flags" +]) diff --git a/config/kernel.m4 b/config/kernel.m4 index c41cdf694..0adceadac 100644 --- a/config/kernel.m4 +++ b/config/kernel.m4 @@ -27,6 +27,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [ ZFS_AC_KERNEL_BLK_QUEUE_PHYSICAL_BLOCK_SIZE ZFS_AC_KERNEL_BLK_QUEUE_IO_OPT ZFS_AC_KERNEL_BLK_QUEUE_NONROT + ZFS_AC_KERNEL_BLK_QUEUE_DISCARD ZFS_AC_KERNEL_BLK_FETCH_REQUEST ZFS_AC_KERNEL_BLK_REQUEUE_REQUEST ZFS_AC_KERNEL_BLK_RQ_BYTES |