diff mbox

megaraid_sas: boot hangs while LD is offline

Message ID 1452865396-9887-1-git-send-email-hare@suse.de (mailing list archive)
State Rejected, archived
Headers show

Commit Message

Hannes Reinecke Jan. 15, 2016, 1:43 p.m. UTC
Offline Logical drives (LDs) should not allowed to be visible
to the OS, as the OS will hang trying to send commands to it.
This patch skips offline LDs like it already does for
non-system physical drives (PDs).

Signed-off-by: Hannes Reinecke <hare@suse.com>
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

Comments

Kashyap Desai Jan. 18, 2016, 5:48 a.m. UTC | #1
> -----Original Message-----
> From: Hannes Reinecke [mailto:hare@suse.de]
> Sent: Friday, January 15, 2016 7:13 PM
> To: Sumit Saxena
> Cc: Kashyap Desai; megaraidlinux.pdl@avagotech.com; Martin K. Petersen;
> James Bottomley; linux-scsi@vger.kernel.org; Hannes Reinecke; Hannes
> Reinecke
> Subject: [PATCH] megaraid_sas: boot hangs while LD is offline
>
> Offline Logical drives (LDs) should not allowed to be visible to the OS,
as the
> OS will hang trying to send commands to it.
> This patch skips offline LDs like it already does for non-system
physical
> drives (PDs).
>
> Signed-off-by: Hannes Reinecke <hare@suse.com>
> ---
>  drivers/scsi/megaraid/megaraid_sas_base.c | 7 ++++++-
>  1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c
> b/drivers/scsi/megaraid/megaraid_sas_base.c
> index 97a1c1c..f32831b 100644
> --- a/drivers/scsi/megaraid/megaraid_sas_base.c
> +++ b/drivers/scsi/megaraid/megaraid_sas_base.c
> @@ -1760,7 +1760,7 @@ static void megasas_set_dma_alignment(struct
> scsi_device *sdev)
>
>  static int megasas_slave_configure(struct scsi_device *sdev)  {
> -	u16 pd_index = 0;
> +	u16 pd_index = 0, ld_index;
>  	struct megasas_instance *instance;
>
>  	instance = megasas_lookup_instance(sdev->host->host_no);
> @@ -1772,6 +1772,11 @@ static int megasas_slave_configure(struct
> scsi_device *sdev)
>  			if (instance->pd_list[pd_index].driveState !=
>  				MR_PD_STATE_SYSTEM)
>  				return -ENXIO;
> +		} else {
> +			ld_index = ((sdev->channel -
> MEGASAS_MAX_PD_CHANNELS) *
> +				    MEGASAS_MAX_DEV_PER_CHANNEL) +
> sdev->id;
> +			if (instance->ld_ids[ld_index] == 0xff)
> +				return -ENXIO;

Hannes - We attempted this code change for one of the issue in past. This
code drop was just a quick workaround to unblock that customer issue.
Avago provided FW fix for this issue as new FW (again fix was done 2 years
before, so many latest FW will have this fix) return below sense key for
TUR.
SenseKey=0x2, asc=0x4, ascq=0x3(LOGICAL UNIT NOT READY, MANUAL
INTERVENTION REQUIRED)

Have you seen any issue w.r.t VD Offline or trying to optimize code in
megaraid driver ?

>  		}
>  	}
>  	megasas_set_dma_alignment(sdev);
> --
> 1.8.5.6
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Hannes Reinecke Jan. 18, 2016, 6:54 a.m. UTC | #2
On 01/18/2016 06:48 AM, Kashyap Desai wrote:
>> -----Original Message-----
>> From: Hannes Reinecke [mailto:hare@suse.de]
>> Sent: Friday, January 15, 2016 7:13 PM
>> To: Sumit Saxena
>> Cc: Kashyap Desai; megaraidlinux.pdl@avagotech.com; Martin K. Petersen;
>> James Bottomley; linux-scsi@vger.kernel.org; Hannes Reinecke; Hannes
>> Reinecke
>> Subject: [PATCH] megaraid_sas: boot hangs while LD is offline
>>
>> Offline Logical drives (LDs) should not allowed to be visible to the OS,
> as the
>> OS will hang trying to send commands to it.
>> This patch skips offline LDs like it already does for non-system
> physical
>> drives (PDs).
>>
>> Signed-off-by: Hannes Reinecke <hare@suse.com>
>> ---
>>   drivers/scsi/megaraid/megaraid_sas_base.c | 7 ++++++-
>>   1 file changed, 6 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c
>> b/drivers/scsi/megaraid/megaraid_sas_base.c
>> index 97a1c1c..f32831b 100644
>> --- a/drivers/scsi/megaraid/megaraid_sas_base.c
>> +++ b/drivers/scsi/megaraid/megaraid_sas_base.c
>> @@ -1760,7 +1760,7 @@ static void megasas_set_dma_alignment(struct
>> scsi_device *sdev)
>>
>>   static int megasas_slave_configure(struct scsi_device *sdev)  {
>> -	u16 pd_index = 0;
>> +	u16 pd_index = 0, ld_index;
>>   	struct megasas_instance *instance;
>>
>>   	instance = megasas_lookup_instance(sdev->host->host_no);
>> @@ -1772,6 +1772,11 @@ static int megasas_slave_configure(struct
>> scsi_device *sdev)
>>   			if (instance->pd_list[pd_index].driveState !=
>>   				MR_PD_STATE_SYSTEM)
>>   				return -ENXIO;
>> +		} else {
>> +			ld_index = ((sdev->channel -
>> MEGASAS_MAX_PD_CHANNELS) *
>> +				    MEGASAS_MAX_DEV_PER_CHANNEL) +
>> sdev->id;
>> +			if (instance->ld_ids[ld_index] == 0xff)
>> +				return -ENXIO;
>
> Hannes - We attempted this code change for one of the issue in past. This
> code drop was just a quick workaround to unblock that customer issue.
> Avago provided FW fix for this issue as new FW (again fix was done 2 years
> before, so many latest FW will have this fix) return below sense key for
> TUR.
> SenseKey=0x2, asc=0x4, ascq=0x3(LOGICAL UNIT NOT READY, MANUAL
> INTERVENTION REQUIRED)
>
> Have you seen any issue w.r.t VD Offline or trying to optimize code in
> megaraid driver ?
>
Currently I'm in the process to review all non-mainstream SLES 
patches. And this is one of them which do not have a clear 
equivalent in mainline.
But as all are customers are running _with_ this patch, we wouldn't 
know if the upstream fix resolves this issue, too.

But thanks for the review, I'll drop this patch.

Cheers,

Hannes
diff mbox

Patch

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c
index 97a1c1c..f32831b 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -1760,7 +1760,7 @@  static void megasas_set_dma_alignment(struct scsi_device *sdev)
 
 static int megasas_slave_configure(struct scsi_device *sdev)
 {
-	u16 pd_index = 0;
+	u16 pd_index = 0, ld_index;
 	struct megasas_instance *instance;
 
 	instance = megasas_lookup_instance(sdev->host->host_no);
@@ -1772,6 +1772,11 @@  static int megasas_slave_configure(struct scsi_device *sdev)
 			if (instance->pd_list[pd_index].driveState !=
 				MR_PD_STATE_SYSTEM)
 				return -ENXIO;
+		} else {
+			ld_index = ((sdev->channel - MEGASAS_MAX_PD_CHANNELS) *
+				    MEGASAS_MAX_DEV_PER_CHANNEL) + sdev->id;
+			if (instance->ld_ids[ld_index] == 0xff)
+				return -ENXIO;
 		}
 	}
 	megasas_set_dma_alignment(sdev);