@@ -53,6 +53,8 @@ spc_emulate_inquiry_std(struct se_cmd *cmd, unsigned char *buf)
struct se_lun *lun = cmd->se_lun;
struct se_device *dev = cmd->se_dev;
struct se_session *sess = cmd->se_sess;
+ struct t10_alua_tg_pt_gp *tg_pt_gp;
+ u64 dev_ports = 0;
/* Set RMB (removable media) for tape devices */
if (dev->transport->get_device_type(dev) == TYPE_TAPE)
@@ -93,6 +95,21 @@ spc_emulate_inquiry_std(struct se_cmd *cmd, unsigned char *buf)
buf[5] |= 0x1;
}
+ spin_lock(&dev->t10_alua.tg_pt_gps_lock);
+ list_for_each_entry(tg_pt_gp, &dev->t10_alua.tg_pt_gps_list,
+ tg_pt_gp_list) {
+ dev_ports += tg_pt_gp->tg_pt_gp_members;
+ /* Exact number of ports does not matter for MULTIP bit */
+ if (dev_ports > 1)
+ break;
+ }
+ spin_unlock(&dev->t10_alua.tg_pt_gps_lock);
+ /*
+ * Set MULTIP bit to indicate presence of multiple SCSI target ports
+ */
+ if (dev_ports > 1)
+ buf[6] |= 0x10;
+
buf[7] = 0x2; /* CmdQue=1 */
/*