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