sizeof(g_inquiry_vendor), S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(inquiry_vendor, "inquiry vendor string override");
+/* SCSI inquiry product string is 16 chars space padded + NULL. */
+char g_inquiry_product[17] = "";
+module_param_string(inquiry_product, g_inquiry_product,
+ sizeof(g_inquiry_product), S_IRUGO|S_IWUSR);
+MODULE_PARM_DESC(inquiry_product, "inquiry product string override");
+
sense_reason_t
transport_lookup_cmd_lun(struct se_cmd *se_cmd, u32 unpacked_lun)
{
if (flag) {
dev_set_t10_wwn_model_alias(dev);
} else {
- strncpy(&dev->t10_wwn.model[0],
- dev->transport->inquiry_prod, 16);
+ /*
+ * If module_parm inquiry_product was set, use that.
+ */
+ if (g_inquiry_product[0] != '\0')
+ strncpy(&dev->t10_wwn.model[0],
+ g_inquiry_product, 16);
+ else
+ strncpy(&dev->t10_wwn.model[0],
+ dev->transport->inquiry_prod, 16);
}
dev->dev_attrib.emulate_model_alias = flag;
*/
if (!(dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH)) {
strncpy(&dev->t10_wwn.vendor[0], g_inquiry_vendor, 8);
- strncpy(&dev->t10_wwn.model[0],
- dev->transport->inquiry_prod, 16);
+ /*
+ * If module_parm inquiry_product was set, use that.
+ */
+ if (g_inquiry_product[0] != '\0')
+ strncpy(&dev->t10_wwn.model[0],
+ g_inquiry_product, 16);
+ else
+ strncpy(&dev->t10_wwn.model[0],
+ dev->transport->inquiry_prod, 16);
strncpy(&dev->t10_wwn.revision[0],
dev->transport->inquiry_rev, 4);
}
#include <linux/kernel.h>
#include <linux/module.h>
+#include <linux/string.h>
#include <asm/unaligned.h>
#include <scsi/scsi.h>
memcpy(&buf[8], g_inquiry_vendor, 8);
memset(&buf[16], 0x20, 16);
memcpy(&buf[16], dev->t10_wwn.model,
- min_t(size_t, strlen(dev->t10_wwn.model), 16));
+ min_t(size_t, strnlen(dev->t10_wwn.model, 16), 16));
memcpy(&buf[32], dev->t10_wwn.revision,
- min_t(size_t, strlen(dev->t10_wwn.revision), 4));
+ min_t(size_t, strnlen(dev->t10_wwn.revision, 4), 4));
buf[4] = 31; /* Set additional length to 31 */
return 0;
u16 len;
if (dev->dev_flags & DF_EMULATED_VPD_UNIT_SERIAL) {
- len = sprintf(&buf[4], "%s", dev->t10_wwn.unit_serial);
+ len = snprintf(&buf[4], INQUIRY_VPD_SERIAL_LEN, "%s",
+ dev->t10_wwn.unit_serial);
len++; /* Extra Byte for NULL Terminator */
buf[3] = len;
}
struct t10_alua_tg_pt_gp *tg_pt_gp;
struct t10_alua_tg_pt_gp_member *tg_pt_gp_mem;
unsigned char *prod = &dev->t10_wwn.model[0];
- u32 prod_len;
+ u32 prod_len, model_len;
u32 unit_serial_len, off = 0;
u16 len = 0, id_len;
id_len = 8; /* For Vendor field */
prod_len = 4; /* For VPD Header */
prod_len += 8; /* For Vendor field */
- prod_len += strlen(prod);
+ model_len = strnlen(prod, 16);
+ prod_len += model_len;
prod_len++; /* For : */
if (dev->dev_flags & DF_EMULATED_VPD_UNIT_SERIAL) {
- unit_serial_len = strlen(&dev->t10_wwn.unit_serial[0]);
- unit_serial_len++; /* For NULL Terminator */
-
- id_len += sprintf(&buf[off+12], "%s:%s", prod,
- &dev->t10_wwn.unit_serial[0]);
+ unit_serial_len = strnlen(&dev->t10_wwn.unit_serial[0],
+ INQUIRY_VPD_SERIAL_LEN);
+ if (model_len && unit_serial_len) {
+ id_len += snprintf(&buf[off+12],
+ model_len, "%s", prod);
+ id_len += snprintf(&buf[off+12+model_len],
+ unit_serial_len + 1, ":%s",
+ &dev->t10_wwn.unit_serial[0]);
+ /* Extra Byte for NULL Terminator */
+ id_len++;
+ }
}
buf[off] = 0x2; /* ASCII */
buf[off+1] = 0x1; /* T10 Vendor ID */