Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

hpsa: fix handling of hpsa_volume_offline return value

Make return value an int instead of an unsigned char so that
we do not lose negative error return values.

Signed-off-by: Stephen M. Cameron <scameron@beardog.cce.hp.com>
Reviewed-by: Webb Scales <webb.scales@hp.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>

authored by

Stephen M. Cameron and committed by
Christoph Hellwig
67955ba3 a84d794d

+9 -5
+8 -4
drivers/scsi/hpsa.c
··· 2543 2543 /* Determine offline status of a volume. 2544 2544 * Return either: 2545 2545 * 0 (not offline) 2546 - * -1 (offline for unknown reasons) 2546 + * 0xff (offline for unknown reasons) 2547 2547 * # (integer code indicating one of several NOT READY states 2548 2548 * describing why a volume is to be kept offline) 2549 2549 */ 2550 - static unsigned char hpsa_volume_offline(struct ctlr_info *h, 2550 + static int hpsa_volume_offline(struct ctlr_info *h, 2551 2551 unsigned char scsi3addr[]) 2552 2552 { 2553 2553 struct CommandList *c; ··· 2646 2646 2647 2647 if (this_device->devtype == TYPE_DISK && 2648 2648 is_logical_dev_addr_mode(scsi3addr)) { 2649 + int volume_offline; 2650 + 2649 2651 hpsa_get_raid_level(h, scsi3addr, &this_device->raid_level); 2650 2652 if (h->fw_support & MISC_FW_RAID_OFFLOAD_BASIC) 2651 2653 hpsa_get_ioaccel_status(h, scsi3addr, this_device); 2652 - this_device->volume_offline = 2653 - hpsa_volume_offline(h, scsi3addr); 2654 + volume_offline = hpsa_volume_offline(h, scsi3addr); 2655 + if (volume_offline < 0 || volume_offline > 0xff) 2656 + volume_offline = HPSA_VPD_LV_STATUS_UNSUPPORTED; 2657 + this_device->volume_offline = volume_offline & 0xff; 2654 2658 } else { 2655 2659 this_device->raid_level = RAID_UNKNOWN; 2656 2660 this_device->offload_config = 0;
+1 -1
drivers/scsi/hpsa_cmd.h
··· 151 151 #define HPSA_VPD_HEADER_SZ 4 152 152 153 153 /* Logical volume states */ 154 - #define HPSA_VPD_LV_STATUS_UNSUPPORTED -1 154 + #define HPSA_VPD_LV_STATUS_UNSUPPORTED 0xff 155 155 #define HPSA_LV_OK 0x0 156 156 #define HPSA_LV_UNDERGOING_ERASE 0x0F 157 157 #define HPSA_LV_UNDERGOING_RPI 0x12