diff options
author | Tregaron Bayly <tregaron@baylys.org> | 2013-01-31 17:30:24 -0500 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2013-02-13 14:27:58 -0500 |
commit | adfa9570a56c3dbfc2a28baab77ff6f0b8f480d3 (patch) | |
tree | 3d0fcb992e2cf56c8a88cac6861c276f4ad7b088 /drivers/target/target_core_device.c | |
parent | 0e48e7a5a345a727d5fd7a06bd6a9e6a67eae2bd (diff) |
target: Add device attribute to expose config_item_name for INQUIRY model
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@bluehost.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/target/target_core_device.c')
-rw-r--r-- | drivers/target/target_core_device.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c index d10cbed23472..6fb82f1abe5c 100644 --- a/drivers/target/target_core_device.c +++ b/drivers/target/target_core_device.c | |||
@@ -713,6 +713,44 @@ int se_dev_set_max_write_same_len( | |||
713 | return 0; | 713 | return 0; |
714 | } | 714 | } |
715 | 715 | ||
716 | static void dev_set_t10_wwn_model_alias(struct se_device *dev) | ||
717 | { | ||
718 | const char *configname; | ||
719 | |||
720 | configname = config_item_name(&dev->dev_group.cg_item); | ||
721 | if (strlen(configname) >= 16) { | ||
722 | pr_warn("dev[%p]: Backstore name '%s' is too long for " | ||
723 | "INQUIRY_MODEL, truncating to 16 bytes\n", dev, | ||
724 | configname); | ||
725 | } | ||
726 | snprintf(&dev->t10_wwn.model[0], 16, "%s", configname); | ||
727 | } | ||
728 | |||
729 | int se_dev_set_emulate_model_alias(struct se_device *dev, int flag) | ||
730 | { | ||
731 | if (dev->export_count) { | ||
732 | pr_err("dev[%p]: Unable to change model alias" | ||
733 | " while export_count is %d\n", | ||
734 | dev, dev->export_count); | ||
735 | return -EINVAL; | ||
736 | } | ||
737 | |||
738 | if (flag != 0 && flag != 1) { | ||
739 | pr_err("Illegal value %d\n", flag); | ||
740 | return -EINVAL; | ||
741 | } | ||
742 | |||
743 | if (flag) { | ||
744 | dev_set_t10_wwn_model_alias(dev); | ||
745 | } else { | ||
746 | strncpy(&dev->t10_wwn.model[0], | ||
747 | dev->transport->inquiry_prod, 16); | ||
748 | } | ||
749 | dev->dev_attrib.emulate_model_alias = flag; | ||
750 | |||
751 | return 0; | ||
752 | } | ||
753 | |||
716 | int se_dev_set_emulate_dpo(struct se_device *dev, int flag) | 754 | int se_dev_set_emulate_dpo(struct se_device *dev, int flag) |
717 | { | 755 | { |
718 | if (flag != 0 && flag != 1) { | 756 | if (flag != 0 && flag != 1) { |
@@ -1396,6 +1434,7 @@ struct se_device *target_alloc_device(struct se_hba *hba, const char *name) | |||
1396 | dev->t10_alua.t10_dev = dev; | 1434 | dev->t10_alua.t10_dev = dev; |
1397 | 1435 | ||
1398 | dev->dev_attrib.da_dev = dev; | 1436 | dev->dev_attrib.da_dev = dev; |
1437 | dev->dev_attrib.emulate_model_alias = DA_EMULATE_MODEL_ALIAS; | ||
1399 | dev->dev_attrib.emulate_dpo = DA_EMULATE_DPO; | 1438 | dev->dev_attrib.emulate_dpo = DA_EMULATE_DPO; |
1400 | dev->dev_attrib.emulate_fua_write = DA_EMULATE_FUA_WRITE; | 1439 | dev->dev_attrib.emulate_fua_write = DA_EMULATE_FUA_WRITE; |
1401 | dev->dev_attrib.emulate_fua_read = DA_EMULATE_FUA_READ; | 1440 | dev->dev_attrib.emulate_fua_read = DA_EMULATE_FUA_READ; |