]> git.karo-electronics.de Git - linux-beck.git/commitdiff
megaraid_sas: fix the problem of non-existing VD exposed to host
authorSumit.Saxena@avagotech.com <Sumit.Saxena@avagotech.com>
Mon, 5 Jan 2015 14:36:08 +0000 (20:06 +0530)
committerChristoph Hellwig <hch@lst.de>
Fri, 9 Jan 2015 14:44:34 +0000 (15:44 +0100)
This patch will address the issue of SCSI device created at OS level for
non existing VD. ldTgtIdtoLd[] array has size 256 for Extended VD firmware
and 128 for legacy firmware. Accessing indices beyond array size (OS will
send TUR, INQUIRY.. commands upto device index 255), may return valid LD
value and that particular SCSI command will be SUCCESS and creating SCSI
device for non existing target(VD).

For legacy firmware (64 VD firmware), invalidates LD (by setting LD value
to 0xff) in LdTgtIdtoLd[] array for device index beyond 127, so that
invalid LD(0xff) value should be returned beyond device index beyond 127.

Cc: <stable@vger.kernel.org>
Signed-off-by: Kashyap Desai <kashyap.desai@avagotech.com>
Signed-off-by: Sumit Saxena <sumit.saxena@avagotech.com>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/scsi/megaraid/megaraid_sas_fp.c
drivers/scsi/megaraid/megaraid_sas_fusion.c

index 7cae1c25c9a9c6f0abf140740a5c6d7d16b066d8..4f72287860eeea45005301d6fde70507ba4427be 100644 (file)
@@ -212,6 +212,9 @@ void MR_PopulateDrvRaidMap(struct megasas_instance *instance)
                for (i = 0; i < MAX_RAIDMAP_LOGICAL_DRIVES + MAX_RAIDMAP_VIEWS; i++)
                        pDrvRaidMap->ldTgtIdToLd[i] =
                                (u8)pFwRaidMap->ldTgtIdToLd[i];
+               for (i = (MAX_RAIDMAP_LOGICAL_DRIVES + MAX_RAIDMAP_VIEWS);
+                       i < MAX_LOGICAL_DRIVES_EXT; i++)
+                       pDrvRaidMap->ldTgtIdToLd[i] = 0xff;
                for (i = 0; i < ld_count; i++) {
                        pDrvRaidMap->ldSpanMap[i] = pFwRaidMap->ldSpanMap[i];
 #if VD_EXT_DEBUG
index af5ab9e5e8e5c239e39168218aae3c85c423f9f9..7b23d347b69c659156acde68c0c143e99a35916e 100644 (file)
@@ -1725,9 +1725,19 @@ megasas_build_dcdb_fusion(struct megasas_instance *instance,
                if (scmd->device->channel < MEGASAS_MAX_PD_CHANNELS)
                        goto NonFastPath;
 
+               /*
+                * For older firmware, Driver should not access ldTgtIdToLd
+                * beyond index 127 and for Extended VD firmware, ldTgtIdToLd
+                * should not go beyond 255.
+                */
+
+               if ((!fusion->fast_path_io) ||
+                       (device_id >= instance->fw_supported_vd_count))
+                       goto NonFastPath;
+
                ld = MR_TargetIdToLdGet(device_id, local_map_ptr);
-               if ((ld >= instance->fw_supported_vd_count) ||
-                       (!fusion->fast_path_io))
+
+               if (ld >= instance->fw_supported_vd_count)
                        goto NonFastPath;
 
                raid = MR_LdRaidGet(ld, local_map_ptr);