Commit 41ce4c35 authored by Stephen Cameron's avatar Stephen Cameron Committed by James Bottomley

hpsa: add masked physical devices into h->dev[] array

Cache the ioaccel handle so that when we need to abort commands sent
down the ioaccel2 path, we can look up the LUN ID in h->dev[] instead of
having to do I/O to the controller.

Add a field to elements in h->dev[] to keep track of how the device is exposed
to the SCSI mid layer: Not at all, without an upper level driver
(no_uld_attach) or normally exposed.

Since masked physical devices are now present in h->dev[] array
it would be perfectly possible to do

	echo scsi add-single-device 2 2 0 0 > /proc/scsi/scsi

and bring them online.  This was previously not allowed for masked
physical devices.

Ensure that the mapping of physical disks to logical drives gets updated in a
consistent way when a RAID migration occurs and is not touched until updates
to it are complete.

now instead of doing CISS_REPORT_PHYSICAL to get the LUNID for
the physical disk in hpsa_get_pdisk_of_ioaccel2(), just get
it out of h->dev[] where we already have it cached.

do not touch phys_disk[] for ioaccel enabled logical drives during rescan
Reviewed-by: default avatarScott Teel <scott.teel@pmcs.com>
Reviewed-by: default avatarKevin Barnett <kevin.barnett@pmcs.com>
Reviewed-by: default avatarTomas Henzl <thenzl@redhat.com>
Reviewed-by: default avatarHannes Reinecke <hare@Suse.de>
Signed-off-by: default avatarDon Brace <don.brace@pmcs.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarJames Bottomley <JBottomley@Odin.com>
parent 6b6c1cd7
This diff is collapsed.
...@@ -54,6 +54,7 @@ struct hpsa_scsi_dev_t { ...@@ -54,6 +54,7 @@ struct hpsa_scsi_dev_t {
u32 ioaccel_handle; u32 ioaccel_handle;
int offload_config; /* I/O accel RAID offload configured */ int offload_config; /* I/O accel RAID offload configured */
int offload_enabled; /* I/O accel RAID offload enabled */ int offload_enabled; /* I/O accel RAID offload enabled */
int offload_to_be_enabled;
int offload_to_mirror; /* Send next I/O accelerator RAID int offload_to_mirror; /* Send next I/O accelerator RAID
* offload request to mirror drive * offload request to mirror drive
*/ */
...@@ -68,6 +69,11 @@ struct hpsa_scsi_dev_t { ...@@ -68,6 +69,11 @@ struct hpsa_scsi_dev_t {
* devices in order to honor physical device queue depth limits. * devices in order to honor physical device queue depth limits.
*/ */
struct hpsa_scsi_dev_t *phys_disk[RAID_MAP_MAX_ENTRIES]; struct hpsa_scsi_dev_t *phys_disk[RAID_MAP_MAX_ENTRIES];
#define HPSA_DO_NOT_EXPOSE 0x0
#define HPSA_SG_ATTACH 0x1
#define HPSA_ULD_ATTACH 0x2
#define HPSA_SCSI_ADD (HPSA_SG_ATTACH | HPSA_ULD_ATTACH)
u8 expose_state;
}; };
struct reply_queue_buffer { struct reply_queue_buffer {
......
...@@ -240,6 +240,7 @@ struct ReportLUNdata { ...@@ -240,6 +240,7 @@ struct ReportLUNdata {
struct ext_report_lun_entry { struct ext_report_lun_entry {
u8 lunid[8]; u8 lunid[8];
#define MASKED_DEVICE(x) ((x)[3] & 0xC0)
#define GET_BMIC_BUS(lunid) ((lunid)[7] & 0x3F) #define GET_BMIC_BUS(lunid) ((lunid)[7] & 0x3F)
#define GET_BMIC_LEVEL_TWO_TARGET(lunid) ((lunid)[6]) #define GET_BMIC_LEVEL_TWO_TARGET(lunid) ((lunid)[6])
#define GET_BMIC_DRIVE_NUMBER(lunid) (((GET_BMIC_BUS((lunid)) - 1) << 8) + \ #define GET_BMIC_DRIVE_NUMBER(lunid) (((GET_BMIC_BUS((lunid)) - 1) << 8) + \
...@@ -247,6 +248,8 @@ struct ext_report_lun_entry { ...@@ -247,6 +248,8 @@ struct ext_report_lun_entry {
u8 wwid[8]; u8 wwid[8];
u8 device_type; u8 device_type;
u8 device_flags; u8 device_flags;
#define NON_DISK_PHYS_DEV(x) ((x)[17] & 0x01)
#define PHYS_IOACCEL(x) ((x)[17] & 0x08)
u8 lun_count; /* multi-lun device, how many luns */ u8 lun_count; /* multi-lun device, how many luns */
u8 redundant_paths; u8 redundant_paths;
u32 ioaccel_handle; /* ioaccel1 only uses lower 16 bits */ u32 ioaccel_handle; /* ioaccel1 only uses lower 16 bits */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment