Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=b6aff66953a29e40e0683be9b39c369ade143a5b
Commit:     b6aff66953a29e40e0683be9b39c369ade143a5b
Parent:     e7cbff13ec1f236a3f8341c503a2e1bd0cf692e5
Author:     James Bottomley <[EMAIL PROTECTED]>
AuthorDate: Fri Jul 20 11:10:05 2007 -0500
Committer:  James Bottomley <[EMAIL PROTECTED]>
CommitDate: Fri Jul 20 12:29:07 2007 -0500

    [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: FUJITA Tomonori <[EMAIL PROTECTED]>
    Signed-off-by: James Bottomley <[EMAIL PROTECTED]>
---
 drivers/scsi/scsi_transport_sas.c |   36 +++++++++++++++++++++++++++++++++++-
 include/scsi/scsi_transport_sas.h |    2 ++
 2 files changed, 37 insertions(+), 1 deletions(-)

diff --git a/drivers/scsi/scsi_transport_sas.c 
b/drivers/scsi/scsi_transport_sas.c
index 2871fd0..573f588 100644
--- a/drivers/scsi/scsi_transport_sas.c
+++ b/drivers/scsi/scsi_transport_sas.c
@@ -42,6 +42,7 @@
 struct sas_host_attrs {
        struct list_head rphy_list;
        struct mutex lock;
+       struct request_queue *q;
        u32 next_target_id;
        u32 next_expander_id;
        int next_port_id;
@@ -215,6 +216,11 @@ static int sas_bsg_initialize(struct Scsi_Host *shost, 
struct sas_rphy *rphy,
        }
 
        if (rphy)
+               rphy->q = q;
+       else
+               to_sas_host_attrs(shost)->q = q;
+
+       if (rphy)
                q->queuedata = rphy;
        else
                q->queuedata = shost;
@@ -224,6 +230,22 @@ static int sas_bsg_initialize(struct Scsi_Host *shost, 
struct sas_rphy *rphy,
        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
  */
@@ -249,8 +271,18 @@ static int sas_host_setup(struct transport_container *tc, 
struct device *dev,
        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,
-               "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,
                            struct device *dev)
@@ -1414,6 +1446,8 @@ void sas_rphy_free(struct sas_rphy *rphy)
        list_del(&rphy->list);
        mutex_unlock(&sas_host->lock);
 
+       sas_bsg_remove(shost, rphy);
+
        transport_destroy_device(dev);
 
        put_device(dev);
diff --git a/include/scsi/scsi_transport_sas.h 
b/include/scsi/scsi_transport_sas.h
index af304fb..abdfd2e 100644
--- a/include/scsi/scsi_transport_sas.h
+++ b/include/scsi/scsi_transport_sas.h
@@ -91,10 +91,12 @@ struct sas_phy {
 #define phy_to_shost(phy) \
        dev_to_shost((phy)->dev.parent)
 
+struct request_queue;
 struct sas_rphy {
        struct device           dev;
        struct sas_identify     identify;
        struct list_head        list;
+       struct request_queue    *q;
        u32                     scsi_target_id;
 };
 
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to