aboutsummaryrefslogtreecommitdiff
path: root/drivers/scsi/scsi_transport_sas.c
diff options
context:
space:
mode:
authorJames Bottomley <James.Bottomley@steeleye.com>2007-07-20 18:22:17 -0500
committerJames Bottomley <jejb@mulgrave.localdomain>2007-07-21 08:58:23 -0500
commit39dca558a5b52b63e49bc234a7e887be092aa690 (patch)
tree31c3c412458e657fdbedc73f50b7de26c7ed0c4a /drivers/scsi/scsi_transport_sas.c
parent0e78d158b67fba3977f577f293c323359d80dd0e (diff)
[SCSI] bsg: make class backlinks
Currently, bsg doesn't make class backlinks (a process whereby you'd get a link to bsg in the device directory in the same way you get one for sg). This is because the bsg device is uninitialised, so the class device has nothing it can attach to. The fix is to make the bsg device point to the cdevice of the entity creating the bsg, necessitating changing the bsg_register_queue() prototype into a form that takes the generic device. Acked-by: FUJITA Tomonori <tomof@acm.org> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/scsi_transport_sas.c')
-rw-r--r--drivers/scsi/scsi_transport_sas.c32
1 files changed, 18 insertions, 14 deletions
diff --git a/drivers/scsi/scsi_transport_sas.c b/drivers/scsi/scsi_transport_sas.c
index 573f588154d..3120f4b3a11 100644
--- a/drivers/scsi/scsi_transport_sas.c
+++ b/drivers/scsi/scsi_transport_sas.c
@@ -191,25 +191,34 @@ static void sas_non_host_smp_request(struct request_queue *q)
sas_smp_request(q, rphy_to_shost(rphy), rphy);
}
-static int sas_bsg_initialize(struct Scsi_Host *shost, struct sas_rphy *rphy,
- char *name)
+static int sas_bsg_initialize(struct Scsi_Host *shost, struct sas_rphy *rphy)
{
struct request_queue *q;
int error;
+ struct device *dev;
+ char namebuf[BUS_ID_SIZE];
+ const char *name;
if (!to_sas_internal(shost->transportt)->f->smp_handler) {
printk("%s can't handle SMP requests\n", shost->hostt->name);
return 0;
}
- if (rphy)
+ if (rphy) {
q = blk_init_queue(sas_non_host_smp_request, NULL);
- else
+ dev = &rphy->dev;
+ name = dev->bus_id;
+ } else {
q = blk_init_queue(sas_host_smp_request, NULL);
+ dev = &shost->shost_gendev;
+ snprintf(namebuf, sizeof(namebuf),
+ "sas_host%d", shost->host_no);
+ name = namebuf;
+ }
if (!q)
return -ENOMEM;
- error = bsg_register_queue(q, name);
+ error = bsg_register_queue(q, dev, name);
if (error) {
blk_cleanup_queue(q);
return -ENOMEM;
@@ -255,7 +264,6 @@ static int sas_host_setup(struct transport_container *tc, struct device *dev,
{
struct Scsi_Host *shost = dev_to_shost(dev);
struct sas_host_attrs *sas_host = to_sas_host_attrs(shost);
- char name[BUS_ID_SIZE];
INIT_LIST_HEAD(&sas_host->rphy_list);
mutex_init(&sas_host->lock);
@@ -263,8 +271,7 @@ static int sas_host_setup(struct transport_container *tc, struct device *dev,
sas_host->next_expander_id = 0;
sas_host->next_port_id = 0;
- snprintf(name, sizeof(name), "sas_host%d", shost->host_no);
- if (sas_bsg_initialize(shost, NULL, name))
+ if (sas_bsg_initialize(shost, NULL))
dev_printk(KERN_ERR, dev, "fail to a bsg device %d\n",
shost->host_no);
@@ -1332,9 +1339,6 @@ struct sas_rphy *sas_end_device_alloc(struct sas_port *parent)
sas_rphy_initialize(&rdev->rphy);
transport_setup_device(&rdev->rphy.dev);
- if (sas_bsg_initialize(shost, &rdev->rphy, rdev->rphy.dev.bus_id))
- printk("fail to a bsg device %s\n", rdev->rphy.dev.bus_id);
-
return &rdev->rphy;
}
EXPORT_SYMBOL(sas_end_device_alloc);
@@ -1374,9 +1378,6 @@ struct sas_rphy *sas_expander_alloc(struct sas_port *parent,
sas_rphy_initialize(&rdev->rphy);
transport_setup_device(&rdev->rphy.dev);
- if (sas_bsg_initialize(shost, &rdev->rphy, rdev->rphy.dev.bus_id))
- printk("fail to a bsg device %s\n", rdev->rphy.dev.bus_id);
-
return &rdev->rphy;
}
EXPORT_SYMBOL(sas_expander_alloc);
@@ -1404,6 +1405,9 @@ int sas_rphy_add(struct sas_rphy *rphy)
return error;
transport_add_device(&rphy->dev);
transport_configure_device(&rphy->dev);
+ if (sas_bsg_initialize(shost, rphy))
+ printk("fail to a bsg device %s\n", rphy->dev.bus_id);
+
mutex_lock(&sas_host->lock);
list_add_tail(&rphy->list, &sas_host->rphy_list);