[stgt] [PATCH] support custom block sizes

FUJITA Tomonori fujita.tomonori at lab.ntt.co.jp
Thu Dec 2 11:26:05 CET 2010


On Tue, 30 Nov 2010 21:04:59 +0200
Alexander Nezhinsky <alexandern at Voltaire.COM> wrote:

> Added support for user-defined block size (actually "sector size").
> 
> The rationale is for using with devices (notably SSDs) that allow 
> formatting with sector size different from 512B. If such device 
> is formatted to a greater value, but tgt reports its sector size
> to be 512B, all commands referencing device sectors and/or extents
> will address wrong locations, some of which will be even out of
> the device's capacity.
> 
> This patch follows the patch posted here:
> http://lists.wpkg.org/pipermail/stgt/2009-December/003469.html
> and elaborates the suggested functionality a bit further.
> 
> The default block size is maintained by sbc (block devices).
> It has its own default value 512B. This default may be overridden
> by using the following extra param in tgt command line:
> --sbc blocksize=4096
> (sizes 512,1024..8096 are supported).

Let's remove this option because we can configure this per lun.


> After this all block devices will report the passed block sz value
> during scsi inquiries.
> Block size can be set for individual luns as well using
> --params blocksize=4096,...
> among the parameters of new logical unit through tgtadm.
> This may be used in scripts as follows:
> --params blocksize=`blockdev --getss /dev/sdd`
> In this case lun specific setting overrides sbc default.
> Tha actual per lun is displayed through -m target -o show.
> 
> Signed-off-by: Alexander Nezhinsky <alexandern at voltaire.com>
> ---
>  usr/sbc.c    |   51 +++++++++++++++++++++++++++++++++++++++++++--------
>  usr/target.c |   35 +++++++++++++++++++++++++++++++----
>  usr/tgtd.h   |    1 +
>  usr/util.c   |   19 +++++++++++++++++++
>  usr/util.h   |    1 +
>  5 files changed, 95 insertions(+), 12 deletions(-)
> 
> diff --git a/usr/sbc.c b/usr/sbc.c
> index 1f0a6ff..88cd893 100644
> --- a/usr/sbc.c
> +++ b/usr/sbc.c
> @@ -41,7 +41,9 @@
>  #include "spc.h"
>  #include "tgtadm_error.h"
>  
> -#define BLK_SHIFT	9
> +#define DEFAULT_BLK_SHIFT 9
> +
> +static unsigned int blk_shift = DEFAULT_BLK_SHIFT;
>  
>  static int sbc_mode_page_update(struct scsi_cmd *cmd, uint8_t *data, int *changed)
>  {
> @@ -123,7 +125,7 @@ static int sbc_rw(int host_no, struct scsi_cmd *cmd)
>  
>  	cmd->scsi_cmd_done = target_cmd_io_done;
>  
> -	cmd->offset = (scsi_rw_offset(cmd->scb) << BLK_SHIFT);
> +	cmd->offset = (scsi_rw_offset(cmd->scb) << cmd->dev->blk_shift);
>  	ret = cmd->dev->bst->bs_cmd_submit(cmd);
>  	if (ret) {
>  		key = HARDWARE_ERROR;
> @@ -163,6 +165,7 @@ static int sbc_release(int host_no, struct scsi_cmd *cmd)
>  static int sbc_read_capacity(int host_no, struct scsi_cmd *cmd)
>  {
>  	uint32_t *data;
> +	unsigned int bshift;
>  	uint64_t size;
>  	uint8_t *scb = cmd->scb;
>  	unsigned char key = ILLEGAL_REQUEST;
> @@ -177,11 +180,12 @@ static int sbc_read_capacity(int host_no, struct scsi_cmd *cmd)
>  		goto overflow;
>  
>  	data = scsi_get_in_buffer(cmd);
> -	size = cmd->dev->size >> BLK_SHIFT;
> +	bshift = cmd->dev->blk_shift;
> +	size = cmd->dev->size >> bshift;
>  
>  	data[0] = (size >> 32) ?
>  		__cpu_to_be32(0xffffffff) : __cpu_to_be32(size - 1);

Can we use put_unaligned_be32 instead? I like to kill __cpu_to_
macros.
--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html



More information about the stgt mailing list