Commit 653ba58d authored by Mark Haverkamp's avatar Mark Haverkamp Committed by James Bottomley

[SCSI] aacraid: expose physical devices

Received from Mark Salyzyn:

I am placing this functionality into an insmod parameter. Normally the physical
components are exported to sg, and are blocked from showing up in sd.

Note that the pass-through I/O path via the driver through the Firmware to the
physical disks is not an optimized path, the card is designed for Hardware
RAID, elevator sorting and caching. This should not be used as a means for
utilizing the aacraid based controllers as a generic scsi/SATA/SAS controller,
performance should suck by a few percentage points, any RAID meta-data on the
drives will confuse the controller about who owns the drives and there is a
high risk of destroying content in both directions. Unreliable and for
experimentation or strange controlled circumstances only.
Signed-off-by: default avatarMark Haverkamp <markh@osdl.org>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent 65101355
...@@ -169,6 +169,10 @@ MODULE_PARM_DESC(numacb, "Request a limit to the number of adapter control block ...@@ -169,6 +169,10 @@ MODULE_PARM_DESC(numacb, "Request a limit to the number of adapter control block
int acbsize = -1; int acbsize = -1;
module_param(acbsize, int, S_IRUGO|S_IWUSR); module_param(acbsize, int, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(acbsize, "Request a specific adapter control block (FIB) size. Valid values are 512, 2048, 4096 and 8192. Default is to use suggestion from Firmware."); MODULE_PARM_DESC(acbsize, "Request a specific adapter control block (FIB) size. Valid values are 512, 2048, 4096 and 8192. Default is to use suggestion from Firmware.");
int expose_physicals = 0;
module_param(expose_physicals, int, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(expose_physicals, "Expose physical components of the arrays. 0=off, 1=on");
/** /**
* aac_get_config_status - check the adapter configuration * aac_get_config_status - check the adapter configuration
* @common: adapter to query * @common: adapter to query
...@@ -1535,7 +1539,7 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd) ...@@ -1535,7 +1539,7 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
return 0; return 0;
} }
} else { /* check for physical non-dasd devices */ } else { /* check for physical non-dasd devices */
if(dev->nondasd_support == 1){ if ((dev->nondasd_support == 1) || expose_physicals) {
if (dev->in_reset) if (dev->in_reset)
return -1; return -1;
return aac_send_srb_fib(scsicmd); return aac_send_srb_fib(scsicmd);
......
...@@ -82,6 +82,8 @@ static LIST_HEAD(aac_devices); ...@@ -82,6 +82,8 @@ static LIST_HEAD(aac_devices);
static int aac_cfg_major = -1; static int aac_cfg_major = -1;
char aac_driver_version[] = AAC_DRIVER_FULL_VERSION; char aac_driver_version[] = AAC_DRIVER_FULL_VERSION;
extern int expose_physicals;
/* /*
* Because of the way Linux names scsi devices, the order in this table has * Because of the way Linux names scsi devices, the order in this table has
* become important. Check for on-board Raid first, add-in cards second. * become important. Check for on-board Raid first, add-in cards second.
...@@ -394,6 +396,7 @@ static int aac_slave_configure(struct scsi_device *sdev) ...@@ -394,6 +396,7 @@ static int aac_slave_configure(struct scsi_device *sdev)
sdev->skip_ms_page_3f = 1; sdev->skip_ms_page_3f = 1;
} }
if ((sdev->type == TYPE_DISK) && if ((sdev->type == TYPE_DISK) &&
!expose_physicals &&
(sdev_channel(sdev) != CONTAINER_CHANNEL)) { (sdev_channel(sdev) != CONTAINER_CHANNEL)) {
struct aac_dev *aac = (struct aac_dev *)sdev->host->hostdata; struct aac_dev *aac = (struct aac_dev *)sdev->host->hostdata;
if (!aac->raid_scsi_mode || (sdev_channel(sdev) != 2)) if (!aac->raid_scsi_mode || (sdev_channel(sdev) != 2))
...@@ -928,7 +931,7 @@ static int __devinit aac_probe_one(struct pci_dev *pdev, ...@@ -928,7 +931,7 @@ static int __devinit aac_probe_one(struct pci_dev *pdev,
* all containers are on the virtual channel 0 (CONTAINER_CHANNEL) * all containers are on the virtual channel 0 (CONTAINER_CHANNEL)
* physical channels are address by their actual physical number+1 * physical channels are address by their actual physical number+1
*/ */
if (aac->nondasd_support == 1) if ((aac->nondasd_support == 1) || expose_physicals)
shost->max_channel = aac->maximum_num_channels; shost->max_channel = aac->maximum_num_channels;
else else
shost->max_channel = 0; shost->max_channel = 0;
......
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