Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6d41134f authored by Chandrakanth patil's avatar Chandrakanth patil Committed by Greg Kroah-Hartman
Browse files

scsi: megaraid_sas: Target with invalid LUN ID is deleted during scan

[ Upstream commit 56495f295d8e021f77d065b890fc0100e3f9f6d8 ]

The megaraid_sas driver supports single LUN for RAID devices. That is LUN
0. All other LUNs are unsupported. When a device scan on a logical target
with invalid LUN number is invoked through sysfs, that target ends up
getting removed.

Add LUN ID validation in the slave destroy function to avoid the target
deletion.

Link: https://lore.kernel.org/r/20220324094711.48833-1-chandrakanth.patil@broadcom.com


Signed-off-by: default avatarChandrakanth patil <chandrakanth.patil@broadcom.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 3ecd43dc
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -2551,6 +2551,9 @@ struct megasas_instance_template {
#define MEGASAS_IS_LOGICAL(sdev)					\
	((sdev->channel < MEGASAS_MAX_PD_CHANNELS) ? 0 : 1)

#define MEGASAS_IS_LUN_VALID(sdev)					\
	(((sdev)->lun == 0) ? 1 : 0)

#define MEGASAS_DEV_INDEX(scp)						\
	(((scp->device->channel % 2) * MEGASAS_MAX_DEV_PER_CHANNEL) +	\
	scp->device->id)
+7 −0
Original line number Diff line number Diff line
@@ -2102,6 +2102,9 @@ static int megasas_slave_alloc(struct scsi_device *sdev)
			goto scan_target;
		}
		return -ENXIO;
	} else if (!MEGASAS_IS_LUN_VALID(sdev)) {
		sdev_printk(KERN_INFO, sdev, "%s: invalid LUN\n", __func__);
		return -ENXIO;
	}

scan_target:
@@ -2132,6 +2135,10 @@ static void megasas_slave_destroy(struct scsi_device *sdev)
	instance = megasas_lookup_instance(sdev->host->host_no);

	if (MEGASAS_IS_LOGICAL(sdev)) {
		if (!MEGASAS_IS_LUN_VALID(sdev)) {
			sdev_printk(KERN_INFO, sdev, "%s: invalid LUN\n", __func__);
			return;
		}
		ld_tgt_id = MEGASAS_TARGET_ID(sdev);
		instance->ld_tgtid_status[ld_tgt_id] = LD_TARGET_ID_DELETED;
		if (megasas_dbg_lvl & LD_PD_DEBUG)