[dm-devel] [PATCH] dm table: fix logic bug in dm_table_supports_write_same [was: Re: BLKZEROOUT on dm devices]

Mike Snitzer snitzer at redhat.com
Tue Apr 30 16:32:14 UTC 2013


On Tue, Apr 30 2013 at 12:07am -0400,
Bharata B Rao <bharata.rao at gmail.com> wrote:

> Hi,
> 
> Is BLKZEROOUT ioctl supposed to work on dm devices ? When I try this
> ioctl on an LV that sits on a WRITE SAME capable SCSI device, I see
> that conventional zeroing is done since the WRITE SAME support isn't
> advertised by the dm device.
> 
> # lsblk
> NAME                             MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
> sda                                8:0    0    50G  0 disk
> └─mpathb (dm-12)                 252:12   0    50G  0 mpath
>   └─ws_vg-lvol0 (dm-11)          252:11   0     1G  0 lvm
> sde                                8:64   0    50G  0 disk
> └─mpathb (dm-12)                 252:12   0    50G  0 mpath
>   └─ws_vg-lvol0 (dm-11)          252:11   0     1G  0 lvm
> 
> # cat /sys/block/sda/queue/write_same_max_bytes
> 268435456
> # cat /sys/block/dm-12/queue/write_same_max_bytes
> 0
> # cat /sys/block/dm-11/queue/write_same_max_bytes
> 0
> 
> [root at llmvm02 ~]# cat /sys/dev/block/8\:0/queue/write_same_max_bytes
> 268435456
> [root at llmvm02 ~]# cat /sys/dev/block/252\:12/queue/write_same_max_bytes
> 0
> [root at llmvm02 ~]# cat /sys/dev/block/252\:11/queue/write_same_max_bytes
> 0

Sure enough I see the same limits stacking problem you reported:

# modprobe scsi_debug dev_size_mb=100 lbpws=1
...
sd 5:0:0:0: [sdh] Attached SCSI disk

# cat /sys/block/sdh/queue/write_same_max_bytes
33553920
(which reflects scsi_debug's write_same_length default of 0xffff * 512b)

# echo "0 `blockdev --getsz /dev/sdh` linear /dev/sdh 0" | dmsetup create test
# readlink /dev/mapper/test
../dm-4
# cat /sys/block/dm-4/queue/write_same_max_bytes 
0

> From commit d54eaa5a0fde0a202e4e91f200f818edcef15bee, I gather that
> WRITE SAME is advertised by a dm device if all of its target and
> underlying devices support WRITE SAME. Also as per
> 4f0b70b0479101522b8645ddc1f5ee7137821db3, WRITE SAME is supported for
> linear dm devices. Both of these seem to be true in my case, but still
> BLKZEROOUT ioctl resorts to conventional zeroing. What am I missing
> here ?

The first patch of my WRITE SAME patchset that I posted to dm-devel was
tweaked before going upstream:
http://www.redhat.com/archives/dm-devel/2012-December/msg00064.html

Due to iterate_devices disposition to short-circuit if the test func()
returns true, it looks like Alasdair correctly changed 
s/device_write_same_capable/device_not_write_same_capable/ but forgot to
invert the logic of the calling iterate_devices in
dm_table_supports_write_same().

Anyway, this patch fixes things for me:

From: Mike Snitzer <snitzer at redhat.com>
Date: Tue, 30 Apr 2013 12:24:58 -0400
Subject: [PATCH] dm table: fix logic bug in dm_table_supports_write_same

If device_not_write_same_capable() returns true then the iterate_devices
loop in dm_table_supports_write_same() should return false.

Reported-by: Bharata B Rao <bharata.rao at gmail.com>
Signed-off-by: Mike Snitzer <snitzer at redhat.com>
Cc: stable at vger.kernel.org # v3.8+
---
 drivers/md/dm-table.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c
index 3fe797f..d801682 100644
--- a/drivers/md/dm-table.c
+++ b/drivers/md/dm-table.c
@@ -1445,7 +1445,7 @@ static bool dm_table_supports_write_same(struct dm_table *t)
 			return false;
 
 		if (!ti->type->iterate_devices ||
-		    !ti->type->iterate_devices(ti, device_not_write_same_capable, NULL))
+		    ti->type->iterate_devices(ti, device_not_write_same_capable, NULL))
 			return false;
 	}
 
-- 
1.7.1




More information about the dm-devel mailing list