Re: [PATCH v3] Setting 10_wwn.model name per lun

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

 



On Mon, 2013-01-28 at 16:05 -0800, Andy Grover wrote:
> This patch changes LIO to use the configfs backend device name as the
> model if you either change the DA_EMULATE_MODEL_ALIAS in
> include/target/target_core_base.h before compiling (changes the default
> behavior for all devices) or echo '1' to an individual device's
> emulate_model_alias attribute (changes only that device).
> 
> Signed-off-by: Tregaron Bayly <tbayly@xxxxxxxxxxxx>
> Signed-off-by: Andy Grover <agrover@xxxxxxxxxx>
> ---

This patch is still not quite there yet.  Comments below.

>  drivers/target/target_core_configfs.c |    4 ++
>  drivers/target/target_core_device.c   |   50 +++++++++++++++++++++++++++++++-
>  drivers/target/target_core_internal.h |    1 +
>  include/target/target_core_base.h     |    3 ++
>  4 files changed, 56 insertions(+), 2 deletions(-)
> 
> 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 e269510..a3086e7 100644
> --- a/drivers/target/target_core_device.c
> +++ b/drivers/target/target_core_device.c
> @@ -713,6 +713,47 @@ 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);
> +	if (configname) {
> +		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';
> +	}
> +	else {
> +		strncpy(&dev->t10_wwn.model[0],
> +			dev->transport->inquiry_prod, 16);
> +	}
> +}

This bottom section is useless here, as config_item_name() will never
return NULL for a normal se_device.

> +
> +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);
> +		dev->dev_attrib.emulate_model_alias = flag;
> +	}
> +

This is still missing the ability to pass flag=0 to revert back to the
old model name.

Please make sure that any option that can be enabled via configfs, can
also be disabled via configfs.

> +	return 0;
> +}
> +
>  int se_dev_set_emulate_dpo(struct se_device *dev, int flag)
>  {
>  	if (flag != 0 && flag != 1) {
> @@ -1384,6 +1425,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;
> @@ -1468,8 +1510,12 @@ int target_configure_device(struct se_device *dev)
>  	 */
>  	if (dev->transport->transport_type != TRANSPORT_PLUGIN_PHBA_PDEV) {
>  		strncpy(&dev->t10_wwn.vendor[0], "LIO-ORG", 8);
> -		strncpy(&dev->t10_wwn.model[0],
> -			dev->transport->inquiry_prod, 16);
> +		if (dev->dev_attrib.emulate_model_alias) {
> +			dev_set_t10_wwn_model_alias(dev);
> +		} else {
> +			strncpy(&dev->t10_wwn.model[0],
> +				dev->transport->inquiry_prod, 16);
> +		}

Please drop this code for the non default usage case. 

If someone want's to make this the default action, then they should
modify user-space to set emulate_model_alias=1.

--nab

>  		strncpy(&dev->t10_wwn.revision[0],
>  			dev->transport->inquiry_rev, 4);
>  	}
> 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 02ed017..aa9743c 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