Re: [PATCH 1/3] hpsa: update check for logical volume status

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 6.3.2017 22:24, Don Brace wrote:
>  - Add in a new case for volume offline. Resolves internal
>    testing bug for multilun array management.
>  - Return correct status for failed TURs.
>
> Reviewed-by: Scott Benesh <scott.benesh@xxxxxxxxxxxxx>
> Reviewed-by: Scott Teel <scott.teel@xxxxxxxxxxxxx>
> Signed-off-by: Don Brace <don.brace@xxxxxxxxxxxxx>
> ---
>  drivers/scsi/hpsa.c     |   26 +++++++++++++-------------
>  drivers/scsi/hpsa_cmd.h |    2 ++
>  2 files changed, 15 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c
> index 524a0c7..1adc4ec 100644
> --- a/drivers/scsi/hpsa.c
> +++ b/drivers/scsi/hpsa.c
> @@ -3735,7 +3735,7 @@ static int hpsa_volume_offline(struct ctlr_info *h,
>  					DEFAULT_TIMEOUT);
>  	if (rc) {
>  		cmd_free(h, c);

Hi Don,
patch is ok, but this function returns a mix of either HPSA_LV_*
values or some magic numbers. 
Could you replace the 0xff with HPSA_VPD_LV_STATUS_UNSUPPORTED
(like it is in hpsa_get_volume_status)
and in case of success return HPSA_LV_OK ?

Also it would make sense to change the return value 
from 'int' to 'unsigned char' and to drop 
this test 
                volume_offline = hpsa_volume_offline(h, scsi3addr);
                if (volume_offline < 0 || volume_offline > 0xff)
                        volume_offline = HPSA_VPD_LV_STATUS_UNSUPPORTED;
		this_device->volume_offline = volume_offline & 0xff;

from hpsa_update_device_info since the condition is never met.
Switching volume_offline to an unsigned char everywhere might be also possible.

tomash

> -		return 0;
> +		return 0xff;
>  	}
>  	sense = c->err_info->SenseInfo;
>  	if (c->err_info->SenseLen > sizeof(c->err_info->SenseInfo))
> @@ -3746,19 +3746,13 @@ static int hpsa_volume_offline(struct ctlr_info *h,
>  	cmd_status = c->err_info->CommandStatus;
>  	scsi_status = c->err_info->ScsiStatus;
>  	cmd_free(h, c);
> -	/* Is the volume 'not ready'? */
> -	if (cmd_status != CMD_TARGET_STATUS ||
> -		scsi_status != SAM_STAT_CHECK_CONDITION ||
> -		sense_key != NOT_READY ||
> -		asc != ASC_LUN_NOT_READY)  {
> -		return 0;
> -	}
>  
>  	/* Determine the reason for not ready state */
>  	ldstat = hpsa_get_volume_status(h, scsi3addr);
>  
>  	/* Keep volume offline in certain cases: */
>  	switch (ldstat) {
> +	case HPSA_LV_FAILED:
>  	case HPSA_LV_UNDERGOING_ERASE:
>  	case HPSA_LV_NOT_AVAILABLE:
>  	case HPSA_LV_UNDERGOING_RPI:
> @@ -3853,10 +3847,10 @@ static int hpsa_update_device_info(struct ctlr_info *h,
>  	/* Do an inquiry to the device to see what it is. */
>  	if (hpsa_scsi_do_inquiry(h, scsi3addr, 0, inq_buff,
>  		(unsigned char) OBDR_TAPE_INQ_SIZE) != 0) {
> -		/* Inquiry failed (msg printed already) */
>  		dev_err(&h->pdev->dev,
> -			"hpsa_update_device_info: inquiry failed\n");
> -		rc = -EIO;
> +			"%s: inquiry failed, device will be skipped.\n",
> +			__func__);
> +		rc = HPSA_INQUIRY_FAILED;
>  		goto bail_out;
>  	}
>  
> @@ -3894,6 +3888,13 @@ static int hpsa_update_device_info(struct ctlr_info *h,
>  		if (volume_offline < 0 || volume_offline > 0xff)
>  			volume_offline = HPSA_VPD_LV_STATUS_UNSUPPORTED;
>  		this_device->volume_offline = volume_offline & 0xff;
> +		if (volume_offline == HPSA_LV_FAILED) {
> +			rc = HPSA_LV_FAILED;
> +			dev_err(&h->pdev->dev,
> +				"%s: LV failed, device will be skipped.\n",
> +				__func__);
> +			goto bail_out;
> +		}
>  	} else {
>  		this_device->raid_level = RAID_UNKNOWN;
>  		this_device->offload_config = 0;
> @@ -4379,8 +4380,7 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h)
>  			goto out;
>  		}
>  		if (rc) {
> -			dev_warn(&h->pdev->dev,
> -				"Inquiry failed, skipping device.\n");
> +			h->drv_req_rescan = 1;
>  			continue;
>  		}
>  
> diff --git a/drivers/scsi/hpsa_cmd.h b/drivers/scsi/hpsa_cmd.h
> index a584cdf..5961705 100644
> --- a/drivers/scsi/hpsa_cmd.h
> +++ b/drivers/scsi/hpsa_cmd.h
> @@ -156,6 +156,7 @@
>  #define CFGTBL_BusType_Fibre2G  0x00000200l
>  
>  /* VPD Inquiry types */
> +#define HPSA_INQUIRY_FAILED		0x02
>  #define HPSA_VPD_SUPPORTED_PAGES        0x00
>  #define HPSA_VPD_LV_DEVICE_ID           0x83
>  #define HPSA_VPD_LV_DEVICE_GEOMETRY     0xC1
> @@ -166,6 +167,7 @@
>  /* Logical volume states */
>  #define HPSA_VPD_LV_STATUS_UNSUPPORTED			0xff
>  #define HPSA_LV_OK                                      0x0
> +#define HPSA_LV_FAILED					0x01
>  #define HPSA_LV_NOT_AVAILABLE				0x0b
>  #define HPSA_LV_UNDERGOING_ERASE			0x0F
>  #define HPSA_LV_UNDERGOING_RPI				0x12
>




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]

  Powered by Linux