Re: [PATCH v4] Setting t10_wwn.model name per lun

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Tregaron,

On Thu, 2013-01-31 at 15:30 -0700, Tregaron Bayly wrote:
> This patch changes LIO to use the configfs backend device name as the
> model if you echo '1' to an individual device's emulate_model_alias attribute.
> This is a valid operation only on devices with an export count of 0.
> 
> Signed-off-by: Tregaron Bayly <tbayly@xxxxxxxxxxxx>
> ---

This looks good.  Just a few minor items below that I've ended up
changing ahead of applying your patch.

>  drivers/target/target_core_configfs.c |  4 ++++
>  drivers/target/target_core_device.c   | 40 +++++++++++++++++++++++++++++++++++
>  drivers/target/target_core_internal.h |  1 +
>  include/target/target_core_base.h     |  3 +++
>  4 files changed, 48 insertions(+)
> 
> diff --git a/drivers/target/target_core_configfs.c b/drivers/target/target_core_configfs.c
> index 4efb61b..43b7ac6 100644
> --- a/drivers/target/target_core_configfs.c
> +++ b/drivers/target/target_core_configfs.c
> @@ -609,6 +609,9 @@ static struct target_core_dev_attrib_attribute				\
>  	__CONFIGFS_EATTR_RO(_name,					\
>  	target_core_dev_show_attr_##_name);
>  
> +DEF_DEV_ATTRIB(emulate_model_alias);
> +SE_DEV_ATTR(emulate_model_alias, S_IRUGO | S_IWUSR);
> +
>  DEF_DEV_ATTRIB(emulate_dpo);
>  SE_DEV_ATTR(emulate_dpo, S_IRUGO | S_IWUSR);
>  
> @@ -681,6 +684,7 @@ SE_DEV_ATTR(max_write_same_len, S_IRUGO | S_IWUSR);
>  CONFIGFS_EATTR_OPS(target_core_dev_attrib, se_dev_attrib, da_group);
>  
>  static struct configfs_attribute *target_core_dev_attrib_attrs[] = {
> +	&target_core_dev_attrib_emulate_model_alias.attr,
>  	&target_core_dev_attrib_emulate_dpo.attr,
>  	&target_core_dev_attrib_emulate_fua_write.attr,
>  	&target_core_dev_attrib_emulate_fua_read.attr,
> diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c
> index 39d56eb..595bd80 100644
> --- a/drivers/target/target_core_device.c
> +++ b/drivers/target/target_core_device.c
> @@ -713,6 +713,45 @@ int se_dev_set_max_write_same_len(
>  	return 0;
>  }
>  
> +static void dev_set_t10_wwn_model_alias(struct se_device *dev)
> +{
> +	const char *configname;
> +
> +	configname = config_item_name(&dev->dev_group.cg_item);
> +	strncpy(&dev->t10_wwn.model[0], configname, 16);
> +	if (strlen(configname) >= 16) {
> +		pr_warn("dev[%p]: Backstore name '%s' is too long for "
> +			"INQUIRY_MODEL, truncating to 16 bytes", dev, configname);
> +	}
> +	dev->t10_wwn.model[15] = '\0';
> +}
> +

The strncpy() + '\0' assignment can be made into a snprintf() instead.

Changing the above into the following slightly cleaner version:

static void dev_set_t10_wwn_model_alias(struct se_device *dev)
{
        const char *configname;

        configname = config_item_name(&dev->dev_group.cg_item);
        if (strlen(configname) >= 16) {
                pr_warn("dev[%p]: Backstore name '%s' is too long for "
                        "INQUIRY_MODEL, truncating to 16 bytes\n", dev,
                        configname);
        }
        snprintf(&dev->t10_wwn.model[0], 16, "%s", configname);
}


> +int se_dev_set_emulate_model_alias(struct se_device *dev, int flag)
> +{
> +	if (dev->export_count) {
> +		pr_err("dev[%p]: Unable to change model alias"
> +			" while export_count is %d\n",
> +			dev, dev->export_count);
> +			return -EINVAL;
> +	}
> +
> +	if (flag != 0 && flag != 1) {
> +		pr_err("Illegal value %d\n", flag);
> +		return -EINVAL;
> +	}
> +
> +	if (flag) {
> +		dev_set_t10_wwn_model_alias(dev);
> +	}
> +	else {

Minor style nit.  Changing this 'else {' to be '} else {'

Folding these two changes into this patch, and applying now to
target-pending/for-next.

Thanks Tregaron!

--nab

> +		strncpy(&dev->t10_wwn.model[0],
> +			dev->transport->inquiry_prod, 16);
> +	}
> +	dev->dev_attrib.emulate_model_alias = flag;
> +
> +	return 0;
> +}
> +
>  int se_dev_set_emulate_dpo(struct se_device *dev, int flag)
>  {
>  	if (flag != 0 && flag != 1) {
> @@ -1390,6 +1429,7 @@ struct se_device *target_alloc_device(struct se_hba *hba, const char *name)
>  	dev->t10_alua.t10_dev = dev;
>  
>  	dev->dev_attrib.da_dev = dev;
> +	dev->dev_attrib.emulate_model_alias = DA_EMULATE_MODEL_ALIAS;
>  	dev->dev_attrib.emulate_dpo = DA_EMULATE_DPO;
>  	dev->dev_attrib.emulate_fua_write = DA_EMULATE_FUA_WRITE;
>  	dev->dev_attrib.emulate_fua_read = DA_EMULATE_FUA_READ;
> diff --git a/drivers/target/target_core_internal.h b/drivers/target/target_core_internal.h
> index 93e9c1f..fdc51f8 100644
> --- a/drivers/target/target_core_internal.h
> +++ b/drivers/target/target_core_internal.h
> @@ -25,6 +25,7 @@ int	se_dev_set_max_unmap_block_desc_count(struct se_device *, u32);
>  int	se_dev_set_unmap_granularity(struct se_device *, u32);
>  int	se_dev_set_unmap_granularity_alignment(struct se_device *, u32);
>  int	se_dev_set_max_write_same_len(struct se_device *, u32);
> +int	se_dev_set_emulate_model_alias(struct se_device *, int);
>  int	se_dev_set_emulate_dpo(struct se_device *, int);
>  int	se_dev_set_emulate_fua_write(struct se_device *, int);
>  int	se_dev_set_emulate_fua_read(struct se_device *, int);
> diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h
> index 01e8601..d6b30d7 100644
> --- a/include/target/target_core_base.h
> +++ b/include/target/target_core_base.h
> @@ -75,6 +75,8 @@
>  #define DA_MAX_WRITE_SAME_LEN			0
>  /* Default max transfer length */
>  #define DA_FABRIC_MAX_SECTORS			8192
> +/* Use a model alias based on the configfs backend device name */
> +#define DA_EMULATE_MODEL_ALIAS			0
>  /* Emulation for Direct Page Out */
>  #define DA_EMULATE_DPO				0
>  /* Emulation for Forced Unit Access WRITEs */
> @@ -590,6 +592,7 @@ struct se_dev_entry {
>  };
>  
>  struct se_dev_attrib {
> +	int		emulate_model_alias;
>  	int		emulate_dpo;
>  	int		emulate_fua_write;
>  	int		emulate_fua_read;


--
To unsubscribe from this list: send the line "unsubscribe target-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux SCSI]     [Kernel Newbies]     [Linux SCSI Target Infrastructure]     [Share Photos]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Device Mapper]

  Powered by Linux