diff options
author | Kurt Garloff <garloff@suse.de> | 2006-04-03 09:16:48 -0400 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.il.steeleye.com> | 2006-04-14 14:53:43 -0400 |
commit | 4186ab1973758190916703eb8889ebe8002c5c8f (patch) | |
tree | e25a6c46e49ea9c310f2c7af8698d022fb7a2d4d | |
parent | 907d91d708d9999bec0185d630062576ac4181a7 (diff) |
[SCSI] Try LUN 1 and use bflags
Some devices report a peripheral qualifier of 3 for LUN 0; with the original
code, we would still try a REPORT_LUNS scan (if SCSI level is >= 3 or if we
have the BLIST_REPORTLUNS2 passed in), but NOT any sequential scan.
Also, the device at LUN 0 (which is not connected according to the PQ) is not
registered with the OS.
Unfortunately, SANs exist that are SCSI-2 and do NOT support REPORT_LUNS, but
report a unknown device with PQ 3 on LUN 0. We still need to scan them, and
most probably we even need BLIST_SPARSELUN (and BLIST_LARGELUN). See the bug
reference for an infamous example.
This is patch 1/3:
If we end up in sequential scan, at least try LUN 1 for devices
that reported a PQ of 3 for LUN 0.
Also return blacklist flags, even for PQ3 devices.
Signed-off-by: Kurt Garloff <garloff@suse.de>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
-rw-r--r-- | drivers/scsi/scsi_scan.c | 17 |
1 files changed, 4 insertions, 13 deletions
diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c index f14945996ede..820c4ad7b581 100644 --- a/drivers/scsi/scsi_scan.c +++ b/drivers/scsi/scsi_scan.c | |||
@@ -872,6 +872,8 @@ static int scsi_probe_and_add_lun(struct scsi_target *starget, | |||
872 | if (scsi_probe_lun(sdev, result, result_len, &bflags)) | 872 | if (scsi_probe_lun(sdev, result, result_len, &bflags)) |
873 | goto out_free_result; | 873 | goto out_free_result; |
874 | 874 | ||
875 | if (bflagsp) | ||
876 | *bflagsp = bflags; | ||
875 | /* | 877 | /* |
876 | * result contains valid SCSI INQUIRY data. | 878 | * result contains valid SCSI INQUIRY data. |
877 | */ | 879 | */ |
@@ -912,8 +914,6 @@ static int scsi_probe_and_add_lun(struct scsi_target *starget, | |||
912 | sdev->lockable = 0; | 914 | sdev->lockable = 0; |
913 | scsi_unlock_floptical(sdev, result); | 915 | scsi_unlock_floptical(sdev, result); |
914 | } | 916 | } |
915 | if (bflagsp) | ||
916 | *bflagsp = bflags; | ||
917 | } | 917 | } |
918 | 918 | ||
919 | out_free_result: | 919 | out_free_result: |
@@ -938,7 +938,6 @@ static int scsi_probe_and_add_lun(struct scsi_target *starget, | |||
938 | * scsi_sequential_lun_scan - sequentially scan a SCSI target | 938 | * scsi_sequential_lun_scan - sequentially scan a SCSI target |
939 | * @starget: pointer to target structure to scan | 939 | * @starget: pointer to target structure to scan |
940 | * @bflags: black/white list flag for LUN 0 | 940 | * @bflags: black/white list flag for LUN 0 |
941 | * @lun0_res: result of scanning LUN 0 | ||
942 | * | 941 | * |
943 | * Description: | 942 | * Description: |
944 | * Generally, scan from LUN 1 (LUN 0 is assumed to already have been | 943 | * Generally, scan from LUN 1 (LUN 0 is assumed to already have been |
@@ -948,8 +947,7 @@ static int scsi_probe_and_add_lun(struct scsi_target *starget, | |||
948 | * Modifies sdevscan->lun. | 947 | * Modifies sdevscan->lun. |
949 | **/ | 948 | **/ |
950 | static void scsi_sequential_lun_scan(struct scsi_target *starget, | 949 | static void scsi_sequential_lun_scan(struct scsi_target *starget, |
951 | int bflags, int lun0_res, int scsi_level, | 950 | int bflags, int scsi_level, int rescan) |
952 | int rescan) | ||
953 | { | 951 | { |
954 | unsigned int sparse_lun, lun, max_dev_lun; | 952 | unsigned int sparse_lun, lun, max_dev_lun; |
955 | struct Scsi_Host *shost = dev_to_shost(starget->dev.parent); | 953 | struct Scsi_Host *shost = dev_to_shost(starget->dev.parent); |
@@ -970,13 +968,6 @@ static void scsi_sequential_lun_scan(struct scsi_target *starget, | |||
970 | sparse_lun = 0; | 968 | sparse_lun = 0; |
971 | 969 | ||
972 | /* | 970 | /* |
973 | * If not sparse lun and no device attached at LUN 0 do not scan | ||
974 | * any further. | ||
975 | */ | ||
976 | if (!sparse_lun && (lun0_res != SCSI_SCAN_LUN_PRESENT)) | ||
977 | return; | ||
978 | |||
979 | /* | ||
980 | * If less than SCSI_1_CSS, and no special lun scaning, stop | 971 | * If less than SCSI_1_CSS, and no special lun scaning, stop |
981 | * scanning; this matches 2.4 behaviour, but could just be a bug | 972 | * scanning; this matches 2.4 behaviour, but could just be a bug |
982 | * (to continue scanning a SCSI_1_CSS device). | 973 | * (to continue scanning a SCSI_1_CSS device). |
@@ -1384,7 +1375,7 @@ static void __scsi_scan_target(struct device *parent, unsigned int channel, | |||
1384 | * do a sequential scan. | 1375 | * do a sequential scan. |
1385 | */ | 1376 | */ |
1386 | scsi_sequential_lun_scan(starget, bflags, | 1377 | scsi_sequential_lun_scan(starget, bflags, |
1387 | res, starget->scsi_level, rescan); | 1378 | starget->scsi_level, rescan); |
1388 | } | 1379 | } |
1389 | 1380 | ||
1390 | out_reap: | 1381 | out_reap: |