diff mbox series

[v2,1/2] scsi: target: fix unmap_zeroes_data boolean initialisation

Message ID 20200219130136.18946-2-ddiss@suse.de (mailing list archive)
State Accepted
Headers show
Series scsi: target: modify boolean configfs attributes | expand

Commit Message

David Disseldorp Feb. 19, 2020, 1:01 p.m. UTC
The LIO unmap_zeroes_data device attribute is mapped to the LBPRZ flag
in the READ CAPACITY (16) and Thin Provisioning VPD INQUIRY responses.

The unmap_zeroes_data attribute is exposed via configfs, where any write
value is correctly validated via strtobool(). However, when initialised
via target_configure_unmap_from_queue() it takes the value of the
device's max_write_zeroes_sectors queue limit, which is non-boolean.

A non-boolean value can be read from configfs, but attempting to write
the same value back results in -EINVAL, causing problems for configuration
utilities such as targetcli.

Fixes: 2237498f0b5c ("target/iblock: Convert WRITE_SAME to blkdev_issue_zeroout")
Signed-off-by: David Disseldorp <ddiss@suse.de>
---
 drivers/target/target_core_device.c | 2 +-
 include/target/target_core_base.h   | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

Comments

Bart Van Assche Feb. 19, 2020, 5:32 p.m. UTC | #1
On 2/19/20 5:01 AM, David Disseldorp wrote:
> The LIO unmap_zeroes_data device attribute is mapped to the LBPRZ flag
> in the READ CAPACITY (16) and Thin Provisioning VPD INQUIRY responses.
> 
> The unmap_zeroes_data attribute is exposed via configfs, where any write
> value is correctly validated via strtobool(). However, when initialised
> via target_configure_unmap_from_queue() it takes the value of the
> device's max_write_zeroes_sectors queue limit, which is non-boolean.
> 
> A non-boolean value can be read from configfs, but attempting to write
> the same value back results in -EINVAL, causing problems for configuration
> utilities such as targetcli.
> 
> Fixes: 2237498f0b5c ("target/iblock: Convert WRITE_SAME to blkdev_issue_zeroout")
> Signed-off-by: David Disseldorp <ddiss@suse.de>
> ---
>   drivers/target/target_core_device.c | 2 +-
>   include/target/target_core_base.h   | 2 +-
>   2 files changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c
> index 2d19f0e332b0..2c7ba2f7e13c 100644
> --- a/drivers/target/target_core_device.c
> +++ b/drivers/target/target_core_device.c
> @@ -829,7 +829,7 @@ bool target_configure_unmap_from_queue(struct se_dev_attrib *attrib,
>   	attrib->unmap_granularity = q->limits.discard_granularity / block_size;
>   	attrib->unmap_granularity_alignment = q->limits.discard_alignment /
>   								block_size;
> -	attrib->unmap_zeroes_data = (q->limits.max_write_zeroes_sectors);
> +	attrib->unmap_zeroes_data = !!(q->limits.max_write_zeroes_sectors);
>   	return true;
>   }
>   EXPORT_SYMBOL(target_configure_unmap_from_queue);
> diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h
> index 1728e883b7b2..35188e64239e 100644
> --- a/include/target/target_core_base.h
> +++ b/include/target/target_core_base.h
> @@ -682,7 +682,7 @@ struct se_dev_attrib {
>   	int		force_pr_aptpl;
>   	int		is_nonrot;
>   	int		emulate_rest_reord;
> -	int		unmap_zeroes_data;
> +	bool		unmap_zeroes_data;
>   	u32		hw_block_size;
>   	u32		block_size;
>   	u32		hw_max_sectors;

Reviewed-by: Bart Van Assche <bvanassche@acm.org>
diff mbox series

Patch

diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c
index 2d19f0e332b0..2c7ba2f7e13c 100644
--- a/drivers/target/target_core_device.c
+++ b/drivers/target/target_core_device.c
@@ -829,7 +829,7 @@  bool target_configure_unmap_from_queue(struct se_dev_attrib *attrib,
 	attrib->unmap_granularity = q->limits.discard_granularity / block_size;
 	attrib->unmap_granularity_alignment = q->limits.discard_alignment /
 								block_size;
-	attrib->unmap_zeroes_data = (q->limits.max_write_zeroes_sectors);
+	attrib->unmap_zeroes_data = !!(q->limits.max_write_zeroes_sectors);
 	return true;
 }
 EXPORT_SYMBOL(target_configure_unmap_from_queue);
diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h
index 1728e883b7b2..35188e64239e 100644
--- a/include/target/target_core_base.h
+++ b/include/target/target_core_base.h
@@ -682,7 +682,7 @@  struct se_dev_attrib {
 	int		force_pr_aptpl;
 	int		is_nonrot;
 	int		emulate_rest_reord;
-	int		unmap_zeroes_data;
+	bool		unmap_zeroes_data;
 	u32		hw_block_size;
 	u32		block_size;
 	u32		hw_max_sectors;