From ee5fd0bb80d68ef095f831784cbb17181b2ba898 Mon Sep 17 00:00:00 2001 From: Etienne Dechamps Date: Wed, 1 Aug 2012 10:29:59 +0200 Subject: Set zvol discard_granularity to the volblocksize. Currently, zvols have a discard granularity set to 0, which suggests to the upper layer that discard requests of arbirarily small size and alignment can be made efficiently. In practice however, ZFS does not handle unaligned discard requests efficiently: indeed, it is unable to free a part of a block. It will write zeros to the specified range instead, which is both useless and inefficient (see dnode_free_range). With this patch, zvol block devices expose volblocksize as their discard granularity, so the upper layer is aware that it's not supposed to send discard requests smaller than volblocksize. Signed-off-by: Brian Behlendorf Closes #862 --- module/zfs/zvol.c | 1 + 1 file changed, 1 insertion(+) (limited to 'module') diff --git a/module/zfs/zvol.c b/module/zfs/zvol.c index 32e4f3c1e..07bda6dba 100644 --- a/module/zfs/zvol.c +++ b/module/zfs/zvol.c @@ -1245,6 +1245,7 @@ __zvol_create_minor(const char *name) #ifdef HAVE_BLK_QUEUE_DISCARD blk_queue_max_discard_sectors(zv->zv_queue, (zvol_max_discard_blocks * zv->zv_volblocksize) >> 9); + blk_queue_discard_granularity(zv->zv_queue, zv->zv_volblocksize); queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, zv->zv_queue); #endif #ifdef HAVE_BLK_QUEUE_NONROT -- cgit v1.2.3