Skip to contentSkip to conversation

Limit max_luns to 16k

PATCH New Hannes Reinecke 1 participant 1 message Jul 4, 2006

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Limit max_luns to 16k

Hi all,

I have encountered a really nice aliasing error in the SCSI stack.
(I only hope Luben is not reading this, it'll be just the thing he'd want to hear :-)

Some device allow for a max lun number larger than 16k. Eg qla2xxx has this:

#define MAX_FIBRE_LUNS 0xFFFF

If we encounter a SCSI-2 device with has BLIST_SPARSELUN | BLIST_LARGELUN
set we'll end up doing a sequential scan of all 64k luns.

However, according to SAM the top two bits are reserved for hierarchical addressing. So if we're using a lun _number_ larger than 16k we'll infact are using the flat addressing model of the LUN with mask 0xC000.

So essentially a device at LUN 0x0 will be aliased to LUN 0xC000 et al and hence will be seen detected several times from SCSI ML.

The easy way out here is to _not_ scan past 16k; this will 'fix' this issue. Affected drivers are qla2xxx and lpfc.

However, I feel in the long run we should at least detect hierarchical luns and issue a warning there. Just think of hierarchical LUNs being returned from REPORT_LUNS ...

Cheers,

Hannes

Signature · 4 lines
Dr. Hannes Reinecke			[email protected]
SuSE Linux Products GmbH		S390 & zSeries
Maxfeldstraße 5				+49 911 74053 688
90409 Nürnberg				http://www.suse.de
drivers/scsi/lpfc/lpfc_attr.c +2 -2
index b62a72d..af4dd6f 100644
@@ -696,10 +696,10 @@ LPFC_ATTR(discovery_threads, 32, 1, 64, 
 
 /*
 # lpfc_max_luns: maximum number of LUNs per target driver will support
-# Value range is [1,32768]. Default value is 256.
+# Value range is [1,16384]. Default value is 256.
 # NOTE: The SCSI layer will scan each target for this many luns
 */
-LPFC_ATTR_R(max_luns, 256, 1, 32768,
+LPFC_ATTR_R(max_luns, 256, 1, 16384,
 	     "Maximum number of LUNs per target driver will support");
 
 /*
drivers/scsi/qla2xxx/qla_def.h +1 -1
index 139ea0e..3183ad7 100644
@@ -119,7 +119,7 @@ #define WRT_REG_WORD_PIO(addr, data)	(ou
  */
 #define WWN_SIZE		8	/* Size of WWPN, WWN & WWNN */
 #define MAX_FIBRE_DEVICES	512
-#define MAX_FIBRE_LUNS  	0xFFFF
+#define MAX_FIBRE_LUNS  	0x3FFF
 #define	MAX_RSCN_COUNT		32
 #define	MAX_HOST_COUNT		16