Limit max_luns to 16k
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
@@ -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
@@ -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