Commit b6aff669 authored by James Bottomley's avatar James Bottomley Committed by James Bottomley

[SCSI] scsi_transport_sas: add destructor for bsg

There's currently no destructor for the bsg components.  If you insert
and remove the module, you see the bsg devices building up and up.  This
patch adds the destructor in the correct place in the transport class so
that the bsg and request queue are removed just before the device
destruction.
Acked-by: default avatarFUJITA Tomonori <tomof@acm.org>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent e7cbff13
...@@ -42,6 +42,7 @@ ...@@ -42,6 +42,7 @@
struct sas_host_attrs { struct sas_host_attrs {
struct list_head rphy_list; struct list_head rphy_list;
struct mutex lock; struct mutex lock;
struct request_queue *q;
u32 next_target_id; u32 next_target_id;
u32 next_expander_id; u32 next_expander_id;
int next_port_id; int next_port_id;
...@@ -214,6 +215,11 @@ static int sas_bsg_initialize(struct Scsi_Host *shost, struct sas_rphy *rphy, ...@@ -214,6 +215,11 @@ static int sas_bsg_initialize(struct Scsi_Host *shost, struct sas_rphy *rphy,
return -ENOMEM; return -ENOMEM;
} }
if (rphy)
rphy->q = q;
else
to_sas_host_attrs(shost)->q = q;
if (rphy) if (rphy)
q->queuedata = rphy; q->queuedata = rphy;
else else
...@@ -224,6 +230,22 @@ static int sas_bsg_initialize(struct Scsi_Host *shost, struct sas_rphy *rphy, ...@@ -224,6 +230,22 @@ static int sas_bsg_initialize(struct Scsi_Host *shost, struct sas_rphy *rphy,
return 0; return 0;
} }
static void sas_bsg_remove(struct Scsi_Host *shost, struct sas_rphy *rphy)
{
struct request_queue *q;
if (rphy)
q = rphy->q;
else
q = to_sas_host_attrs(shost)->q;
if (!q)
return;
bsg_unregister_queue(q);
blk_cleanup_queue(q);
}
/* /*
* SAS host attributes * SAS host attributes
*/ */
...@@ -249,8 +271,18 @@ static int sas_host_setup(struct transport_container *tc, struct device *dev, ...@@ -249,8 +271,18 @@ static int sas_host_setup(struct transport_container *tc, struct device *dev,
return 0; return 0;
} }
static int sas_host_remove(struct transport_container *tc, struct device *dev,
struct class_device *cdev)
{
struct Scsi_Host *shost = dev_to_shost(dev);
sas_bsg_remove(shost, NULL);
return 0;
}
static DECLARE_TRANSPORT_CLASS(sas_host_class, static DECLARE_TRANSPORT_CLASS(sas_host_class,
"sas_host", sas_host_setup, NULL, NULL); "sas_host", sas_host_setup, sas_host_remove, NULL);
static int sas_host_match(struct attribute_container *cont, static int sas_host_match(struct attribute_container *cont,
struct device *dev) struct device *dev)
...@@ -1414,6 +1446,8 @@ void sas_rphy_free(struct sas_rphy *rphy) ...@@ -1414,6 +1446,8 @@ void sas_rphy_free(struct sas_rphy *rphy)
list_del(&rphy->list); list_del(&rphy->list);
mutex_unlock(&sas_host->lock); mutex_unlock(&sas_host->lock);
sas_bsg_remove(shost, rphy);
transport_destroy_device(dev); transport_destroy_device(dev);
put_device(dev); put_device(dev);
......
...@@ -91,10 +91,12 @@ struct sas_phy { ...@@ -91,10 +91,12 @@ struct sas_phy {
#define phy_to_shost(phy) \ #define phy_to_shost(phy) \
dev_to_shost((phy)->dev.parent) dev_to_shost((phy)->dev.parent)
struct request_queue;
struct sas_rphy { struct sas_rphy {
struct device dev; struct device dev;
struct sas_identify identify; struct sas_identify identify;
struct list_head list; struct list_head list;
struct request_queue *q;
u32 scsi_target_id; u32 scsi_target_id;
}; };
......
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