aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen M. Cameron <scameron@beardog.cce.hp.com>2011-08-09 09:17:30 -0400
committerJames Bottomley <JBottomley@Parallels.com>2011-08-26 15:49:04 -0400
commit0b0e1d6cbcc8627970e0399df8f06edd690ec7d9 (patch)
tree18f4f39869347d5ea5b61d7f7fe4503663ba2e16
parent98e2a5a3a125608505783bdb95744997f76b3c30 (diff)
[SCSI] hpsa: fix problem that OBDR devices are not detected
The test to detect OBDR ("One Button Disaster Recovery") cd-rom devices was comparing against uninitialized data. Fixed by moving the test for the device to where the inquiry data is collected, and uninitialized variable altogether as it wasn't really being used. Signed-off-by: Stephen M. Cameron <scameron@beardog.cce.hp.com> Cc: stable@kernel.org Signed-off-by: James Bottomley <JBottomley@Parallels.com>
-rw-r--r--drivers/scsi/hpsa.c47
1 files changed, 27 insertions, 20 deletions
diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c
index ec61bdb833a..1f32f0610bc 100644
--- a/drivers/scsi/hpsa.c
+++ b/drivers/scsi/hpsa.c
@@ -1548,10 +1548,17 @@ static inline void hpsa_set_bus_target_lun(struct hpsa_scsi_dev_t *device,
1548} 1548}
1549 1549
1550static int hpsa_update_device_info(struct ctlr_info *h, 1550static int hpsa_update_device_info(struct ctlr_info *h,
1551 unsigned char scsi3addr[], struct hpsa_scsi_dev_t *this_device) 1551 unsigned char scsi3addr[], struct hpsa_scsi_dev_t *this_device,
1552 unsigned char *is_OBDR_device)
1552{ 1553{
1553#define OBDR_TAPE_INQ_SIZE 49 1554
1555#define OBDR_SIG_OFFSET 43
1556#define OBDR_TAPE_SIG "$DR-10"
1557#define OBDR_SIG_LEN (sizeof(OBDR_TAPE_SIG) - 1)
1558#define OBDR_TAPE_INQ_SIZE (OBDR_SIG_OFFSET + OBDR_SIG_LEN)
1559
1554 unsigned char *inq_buff; 1560 unsigned char *inq_buff;
1561 unsigned char *obdr_sig;
1555 1562
1556 inq_buff = kzalloc(OBDR_TAPE_INQ_SIZE, GFP_KERNEL); 1563 inq_buff = kzalloc(OBDR_TAPE_INQ_SIZE, GFP_KERNEL);
1557 if (!inq_buff) 1564 if (!inq_buff)
@@ -1583,6 +1590,16 @@ static int hpsa_update_device_info(struct ctlr_info *h,
1583 else 1590 else
1584 this_device->raid_level = RAID_UNKNOWN; 1591 this_device->raid_level = RAID_UNKNOWN;
1585 1592
1593 if (is_OBDR_device) {
1594 /* See if this is a One-Button-Disaster-Recovery device
1595 * by looking for "$DR-10" at offset 43 in inquiry data.
1596 */
1597 obdr_sig = &inq_buff[OBDR_SIG_OFFSET];
1598 *is_OBDR_device = (this_device->devtype == TYPE_ROM &&
1599 strncmp(obdr_sig, OBDR_TAPE_SIG,
1600 OBDR_SIG_LEN) == 0);
1601 }
1602
1586 kfree(inq_buff); 1603 kfree(inq_buff);
1587 return 0; 1604 return 0;
1588 1605
@@ -1716,7 +1733,7 @@ static int add_msa2xxx_enclosure_device(struct ctlr_info *h,
1716 return 0; 1733 return 0;
1717 } 1734 }
1718 1735
1719 if (hpsa_update_device_info(h, scsi3addr, this_device)) 1736 if (hpsa_update_device_info(h, scsi3addr, this_device, NULL))
1720 return 0; 1737 return 0;
1721 (*nmsa2xxx_enclosures)++; 1738 (*nmsa2xxx_enclosures)++;
1722 hpsa_set_bus_target_lun(this_device, bus, target, 0); 1739 hpsa_set_bus_target_lun(this_device, bus, target, 0);
@@ -1808,7 +1825,6 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h, int hostno)
1808 */ 1825 */
1809 struct ReportLUNdata *physdev_list = NULL; 1826 struct ReportLUNdata *physdev_list = NULL;
1810 struct ReportLUNdata *logdev_list = NULL; 1827 struct ReportLUNdata *logdev_list = NULL;
1811 unsigned char *inq_buff = NULL;
1812 u32 nphysicals = 0; 1828 u32 nphysicals = 0;
1813 u32 nlogicals = 0; 1829 u32 nlogicals = 0;
1814 u32 ndev_allocated = 0; 1830 u32 ndev_allocated = 0;
@@ -1824,11 +1840,9 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h, int hostno)
1824 GFP_KERNEL); 1840 GFP_KERNEL);
1825 physdev_list = kzalloc(reportlunsize, GFP_KERNEL); 1841 physdev_list = kzalloc(reportlunsize, GFP_KERNEL);
1826 logdev_list = kzalloc(reportlunsize, GFP_KERNEL); 1842 logdev_list = kzalloc(reportlunsize, GFP_KERNEL);
1827 inq_buff = kmalloc(OBDR_TAPE_INQ_SIZE, GFP_KERNEL);
1828 tmpdevice = kzalloc(sizeof(*tmpdevice), GFP_KERNEL); 1843 tmpdevice = kzalloc(sizeof(*tmpdevice), GFP_KERNEL);
1829 1844
1830 if (!currentsd || !physdev_list || !logdev_list || 1845 if (!currentsd || !physdev_list || !logdev_list || !tmpdevice) {
1831 !inq_buff || !tmpdevice) {
1832 dev_err(&h->pdev->dev, "out of memory\n"); 1846 dev_err(&h->pdev->dev, "out of memory\n");
1833 goto out; 1847 goto out;
1834 } 1848 }
@@ -1863,7 +1877,7 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h, int hostno)
1863 /* adjust our table of devices */ 1877 /* adjust our table of devices */
1864 nmsa2xxx_enclosures = 0; 1878 nmsa2xxx_enclosures = 0;
1865 for (i = 0; i < nphysicals + nlogicals + 1; i++) { 1879 for (i = 0; i < nphysicals + nlogicals + 1; i++) {
1866 u8 *lunaddrbytes; 1880 u8 *lunaddrbytes, is_OBDR = 0;
1867 1881
1868 /* Figure out where the LUN ID info is coming from */ 1882 /* Figure out where the LUN ID info is coming from */
1869 lunaddrbytes = figure_lunaddrbytes(h, raid_ctlr_position, 1883 lunaddrbytes = figure_lunaddrbytes(h, raid_ctlr_position,
@@ -1874,7 +1888,8 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h, int hostno)
1874 continue; 1888 continue;
1875 1889
1876 /* Get device type, vendor, model, device id */ 1890 /* Get device type, vendor, model, device id */
1877 if (hpsa_update_device_info(h, lunaddrbytes, tmpdevice)) 1891 if (hpsa_update_device_info(h, lunaddrbytes, tmpdevice,
1892 &is_OBDR))
1878 continue; /* skip it if we can't talk to it. */ 1893 continue; /* skip it if we can't talk to it. */
1879 figure_bus_target_lun(h, lunaddrbytes, &bus, &target, &lun, 1894 figure_bus_target_lun(h, lunaddrbytes, &bus, &target, &lun,
1880 tmpdevice); 1895 tmpdevice);
@@ -1898,7 +1913,7 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h, int hostno)
1898 hpsa_set_bus_target_lun(this_device, bus, target, lun); 1913 hpsa_set_bus_target_lun(this_device, bus, target, lun);
1899 1914
1900 switch (this_device->devtype) { 1915 switch (this_device->devtype) {
1901 case TYPE_ROM: { 1916 case TYPE_ROM:
1902 /* We don't *really* support actual CD-ROM devices, 1917 /* We don't *really* support actual CD-ROM devices,
1903 * just "One Button Disaster Recovery" tape drive 1918 * just "One Button Disaster Recovery" tape drive
1904 * which temporarily pretends to be a CD-ROM drive. 1919 * which temporarily pretends to be a CD-ROM drive.
@@ -1906,15 +1921,8 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h, int hostno)
1906 * device by checking for "$DR-10" in bytes 43-48 of 1921 * device by checking for "$DR-10" in bytes 43-48 of
1907 * the inquiry data. 1922 * the inquiry data.
1908 */ 1923 */
1909 char obdr_sig[7]; 1924 if (is_OBDR)
1910#define OBDR_TAPE_SIG "$DR-10" 1925 ncurrent++;
1911 strncpy(obdr_sig, &inq_buff[43], 6);
1912 obdr_sig[6] = '\0';
1913 if (strncmp(obdr_sig, OBDR_TAPE_SIG, 6) != 0)
1914 /* Not OBDR device, ignore it. */
1915 break;
1916 }
1917 ncurrent++;
1918 break; 1926 break;
1919 case TYPE_DISK: 1927 case TYPE_DISK:
1920 if (i < nphysicals) 1928 if (i < nphysicals)
@@ -1947,7 +1955,6 @@ out:
1947 for (i = 0; i < ndev_allocated; i++) 1955 for (i = 0; i < ndev_allocated; i++)
1948 kfree(currentsd[i]); 1956 kfree(currentsd[i]);
1949 kfree(currentsd); 1957 kfree(currentsd);
1950 kfree(inq_buff);
1951 kfree(physdev_list); 1958 kfree(physdev_list);
1952 kfree(logdev_list); 1959 kfree(logdev_list);
1953} 1960}