[PATCH] Add debugging output to SCSI disk initalisation to trace LBP testing.

From: Sitsofe Wheeler
Date: Wed Jul 23 2014 - 11:41:31 EST


---
drivers/scsi/scsi.c | 5 +++++
drivers/scsi/scsi_devinfo.c | 7 +++++++
drivers/scsi/scsi_scan.c | 10 ++++++++--
drivers/scsi/sd.c | 28 ++++++++++++++++++++++++++++
drivers/scsi/storvsc_drv.c | 1 +
5 files changed, 49 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
index 88d46fe..6a7a854 100644
--- a/drivers/scsi/scsi.c
+++ b/drivers/scsi/scsi.c
@@ -992,11 +992,13 @@ int scsi_get_vpd_page(struct scsi_device *sdev, u8 page, unsigned char *buf,
if (sdev->skip_vpd_pages)
goto fail;

+ printk(KERN_NOTICE "Don't skip\n");
/* Ask for all the pages supported by this device */
result = scsi_vpd_inquiry(sdev, buf, 0, buf_len);
if (result < 4)
goto fail;

+ printk(KERN_NOTICE "Got all pages\n");
/* If the user actually wanted this page, we can skip the rest */
if (page == 0)
return 0;
@@ -1008,13 +1010,16 @@ int scsi_get_vpd_page(struct scsi_device *sdev, u8 page, unsigned char *buf,
if (i < result && i >= buf_len)
/* ran off the end of the buffer, give us benefit of doubt */
goto found;
+ printk(KERN_NOTICE "Couldn't find page\n");
/* The device claims it doesn't support the requested page */
goto fail;

found:
+ printk(KERN_NOTICE "Read vpd page\n");
result = scsi_vpd_inquiry(sdev, buf, page, buf_len);
if (result < 0)
goto fail;
+ printk(KERN_NOTICE "Read vpd page success\n");

return 0;

diff --git a/drivers/scsi/scsi_devinfo.c b/drivers/scsi/scsi_devinfo.c
index f969aca..cbde61f 100644
--- a/drivers/scsi/scsi_devinfo.c
+++ b/drivers/scsi/scsi_devinfo.c
@@ -619,14 +619,21 @@ int scsi_get_device_flags_keyed(struct scsi_device *sdev,
return devinfo->flags;
}
}
+ sdev_printk(KERN_NOTICE, sdev,
+ "scsi_get_device_flags_keyed: key: %d\n",
+ sdev->scsi_level);
/* nothing found, return nothing */
if (key != SCSI_DEVINFO_GLOBAL)
return 0;

+ sdev_printk(KERN_NOTICE, sdev,
+ "scsi_get_device_flags_keyed: Post SCSI_DEVINFO_GLOBAL\n");
/* except for the global list, where we have an exception */
if (sdev->sdev_bflags)
return sdev->sdev_bflags;

+ sdev_printk(KERN_NOTICE, sdev,
+ "scsi_get_device_flags_keyed: No sdev_bflags\n");
return scsi_default_dev_flags;
}
EXPORT_SYMBOL(scsi_get_device_flags_keyed);
diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c
index 492cd70..7de78b8 100644
--- a/drivers/scsi/scsi_scan.c
+++ b/drivers/scsi/scsi_scan.c
@@ -734,6 +734,7 @@ static int scsi_probe_lun(struct scsi_device *sdev, unsigned char *inq_result,
(sdev->scsi_level == 1 && (inq_result[3] & 0x0f) == 1))
sdev->scsi_level++;
sdev->sdev_target->scsi_level = sdev->scsi_level;
+ sdev_printk(KERN_NOTICE, sdev, "sdev->scsi_level: %d\n", sdev->scsi_level);

return 0;
}
@@ -950,9 +951,14 @@ static int scsi_add_lun(struct scsi_device *sdev, unsigned char *inq_result,

sdev->eh_timeout = SCSI_DEFAULT_EH_TIMEOUT;

- if (*bflags & BLIST_TRY_VPD_PAGES)
+ sdev_printk(KERN_NOTICE, sdev,
+ "scsi_add_lun: Have BLIST_TRY_VPD_PAGES? %s",
+ ((*bflags & BLIST_TRY_VPD_PAGES) ? "Yes" : "No"));
+ if (*bflags & BLIST_TRY_VPD_PAGES) {
sdev->try_vpd_pages = 1;
- else if (*bflags & BLIST_SKIP_VPD_PAGES)
+ sdev_printk(KERN_NOTICE, sdev,
+ "scsi_add_lun: Set try_vpd_pages");
+ } else if (*bflags & BLIST_SKIP_VPD_PAGES)
sdev->skip_vpd_pages = 1;

transport_configure_device(&sdev->sdev_gendev);
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index ed2e99e..b905e1e 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -636,6 +636,8 @@ static void sd_config_discard(struct scsi_disk *sdkp, unsigned int mode)

sdkp->provisioning_mode = mode;

+ //dump_stack();
+ sd_printk(KERN_NOTICE, sdkp, "Discard mode: %u\n", mode);
switch (mode) {

case SD_LBP_DISABLE:
@@ -1947,6 +1949,7 @@ static int read_capacity_16(struct scsi_disk *sdkp, struct scsi_device *sdp,
unsigned long long lba;
unsigned sector_size;

+ sd_printk(KERN_NOTICE, sdkp, "Entered read_capacity_16\n");
if (sdp->no_read_capacity_16)
return -EINVAL;

@@ -1985,6 +1988,7 @@ static int read_capacity_16(struct scsi_disk *sdkp, struct scsi_device *sdp,
retries--;

} while (the_result && retries);
+ sd_printk(KERN_ERR, sdkp, "Past illegal req\n");

if (the_result) {
sd_printk(KERN_NOTICE, sdkp, "READ CAPACITY(16) failed\n");
@@ -1995,10 +1999,13 @@ static int read_capacity_16(struct scsi_disk *sdkp, struct scsi_device *sdp,
sector_size = get_unaligned_be32(&buffer[8]);
lba = get_unaligned_be64(&buffer[0]);

+ sd_printk(KERN_ERR, sdkp, "Protection check\n");
if (sd_read_protection_type(sdkp, buffer) < 0) {
+ sd_printk(KERN_ERR, sdkp, "Protection %d\n", sd_read_protection_type(sdkp, buffer));
sdkp->capacity = 0;
return -ENODEV;
}
+ sd_printk(KERN_ERR, sdkp, "Got past protection check\n");

if ((sizeof(sdkp->capacity) == 4) && (lba >= 0xffffffffULL)) {
sd_printk(KERN_ERR, sdkp, "Too big for this kernel. Use a "
@@ -2018,8 +2025,10 @@ static int read_capacity_16(struct scsi_disk *sdkp, struct scsi_device *sdp,
sd_printk(KERN_NOTICE, sdkp,
"physical block alignment offset: %u\n", alignment);

+ sd_printk(KERN_NOTICE, sdkp, "Checking LBPME\n");
if (buffer[14] & 0x80) { /* LBPME */
sdkp->lbpme = 1;
+ sd_printk(KERN_NOTICE, sdkp, "LBPME OK!\n");

if (buffer[14] & 0x40) /* LBPRZ */
sdkp->lbprz = 1;
@@ -2109,6 +2118,9 @@ static int sd_try_rc16_first(struct scsi_device *sdp)
return 1;
if (scsi_device_protection(sdp))
return 1;
+ sdev_printk(KERN_NOTICE, sdp,
+ "sd_try_rc16_first: sdp->scsi_level: %d\n",
+ sdp->scsi_level);
return 0;
}

@@ -2542,24 +2554,29 @@ static void sd_read_block_limits(struct scsi_disk *sdkp)
const int vpd_len = 64;
unsigned char *buffer = kmalloc(vpd_len, GFP_KERNEL);

+ sd_printk(KERN_NOTICE, sdkp, "Entered block limits\n");
if (!buffer ||
/* Block Limits VPD */
scsi_get_vpd_page(sdkp->device, 0xb0, buffer, vpd_len))
goto out;
+ sd_printk(KERN_NOTICE, sdkp, "Started block limits\n");

blk_queue_io_min(sdkp->disk->queue,
get_unaligned_be16(&buffer[6]) * sector_sz);
blk_queue_io_opt(sdkp->disk->queue,
get_unaligned_be32(&buffer[12]) * sector_sz);

+ sd_printk(KERN_NOTICE, sdkp, "0x3c...\n");
if (buffer[3] == 0x3c) {
unsigned int lba_count, desc_count;

sdkp->max_ws_blocks = (u32)get_unaligned_be64(&buffer[36]);

+ sd_printk(KERN_NOTICE, sdkp, "Testing lbpme...\n");
if (!sdkp->lbpme)
goto out;

+ sd_printk(KERN_NOTICE, sdkp, "...lbpme test done\n");
lba_count = get_unaligned_be32(&buffer[20]);
desc_count = get_unaligned_be32(&buffer[24]);

@@ -2574,6 +2591,7 @@ static void sd_read_block_limits(struct scsi_disk *sdkp)

if (!sdkp->lbpvpd) { /* LBP VPD page not provided */

+ sd_printk(KERN_NOTICE, sdkp, "Entering discard switch with NO LBP VPD\n");
if (sdkp->max_unmap_blocks)
sd_config_discard(sdkp, SD_LBP_UNMAP);
else
@@ -2581,6 +2599,7 @@ static void sd_read_block_limits(struct scsi_disk *sdkp)

} else { /* LBP VPD page tells us what to use */

+ sd_printk(KERN_NOTICE, sdkp, "Entering discard switch via LBP VPD\n");
if (sdkp->lbpu && sdkp->max_unmap_blocks)
sd_config_discard(sdkp, SD_LBP_UNMAP);
else if (sdkp->lbpws)
@@ -2631,14 +2650,19 @@ static void sd_read_block_provisioning(struct scsi_disk *sdkp)
unsigned char *buffer;
const int vpd_len = 8;

+ sd_printk(KERN_NOTICE, sdkp,
+ "sd_read_block_provisioning: Entered, lbmpe: %u\n",
+ sdkp->lbpme);
if (sdkp->lbpme == 0)
return;
+ sd_printk(KERN_NOTICE, sdkp, "sd_read_block_provisioning: Passed lbmpe test\n");

buffer = kmalloc(vpd_len, GFP_KERNEL);

if (!buffer || scsi_get_vpd_page(sdkp->device, 0xb2, buffer, vpd_len))
goto out;

+ sd_printk(KERN_NOTICE, sdkp, "sd_read_block_provisioning: Setting block provisioning\n");
sdkp->lbpvpd = 1;
sdkp->lbpu = (buffer[5] >> 7) & 1; /* UNMAP */
sdkp->lbpws = (buffer[5] >> 6) & 1; /* WRITE SAME(16) with UNMAP */
@@ -2734,10 +2758,14 @@ static int sd_revalidate_disk(struct gendisk *disk)
if (sdkp->media_present) {
sd_read_capacity(sdkp, buffer);

+ sd_printk(KERN_NOTICE, sdkp, "sd_revalidate_disk: Extended inquiry check...\n");
if (sd_try_extended_inquiry(sdp)) {
+ sd_printk(KERN_NOTICE, sdkp, "sd_revalidate_disk: Performing extended inquiries\n");
sd_read_block_provisioning(sdkp);
sd_read_block_limits(sdkp);
sd_read_block_characteristics(sdkp);
+ } else {
+ sd_printk(KERN_NOTICE, sdkp, "sd_revalidate_disk: Skipped extended inquiries\n");
}

sd_read_write_protect_flag(sdkp, buffer);
diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c
index 5ad2810..5f733c7 100644
--- a/drivers/scsi/storvsc_drv.c
+++ b/drivers/scsi/storvsc_drv.c
@@ -1450,6 +1450,7 @@ static int storvsc_device_configure(struct scsi_device *sdevice)
* With this patch we can correctly handle WRITE_SAME_16 issues.
*/
sdevice->sdev_bflags |= msft_blist_flags;
+ sdev_printk(KERN_NOTICE, sdevice, "storvsc_device_configure: Added BLIST_TRY_VPD_PAGES\n");

return 0;
}
--
1.9.3


--fdj2RfSjLxBAspz7--
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/