We setup a single emulated HBA for managing all IDE devices. To properly
deal with unloading of the driver, establish state to track who
should cleanup the emulated HBA.

Signed-off-by: K. Y. Srinivasan <[email protected]>
Signed-off-by: Haiyang Zhang <[email protected]>
Signed-off-by: Abhishek Kane <[email protected]>
Signed-off-by: Hank Janssen <[email protected]>
---
 drivers/staging/hv/hyperv_storage.h |    1 +
 drivers/staging/hv/storvsc.c        |    1 +
 drivers/staging/hv/storvsc_drv.c    |    9 ++++++++-
 3 files changed, 10 insertions(+), 1 deletions(-)

diff --git a/drivers/staging/hv/hyperv_storage.h 
b/drivers/staging/hv/hyperv_storage.h
index a15a53b..865ede1 100644
--- a/drivers/staging/hv/hyperv_storage.h
+++ b/drivers/staging/hv/hyperv_storage.h
@@ -281,6 +281,7 @@ struct storvsc_device {
        int      ref_count;
        bool     destroy;
        bool     drain_notify;
+       bool     hba_owner;
        atomic_t num_outstanding_req;
 
        wait_queue_head_t waiting_to_drain;
diff --git a/drivers/staging/hv/storvsc.c b/drivers/staging/hv/storvsc.c
index 4d13044..c06f750 100644
--- a/drivers/staging/hv/storvsc.c
+++ b/drivers/staging/hv/storvsc.c
@@ -42,6 +42,7 @@ static inline struct storvsc_device *alloc_stor_device(struct 
hv_device *device)
 
        stor_device->ref_count = 1;
        stor_device->destroy = false;
+       stor_device->hba_owner = false;
        init_waitqueue_head(&stor_device->waiting_to_drain);
        stor_device->device = device;
        device->ext = stor_device;
diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c
index fcc3f5d..898a311 100644
--- a/drivers/staging/hv/storvsc_drv.c
+++ b/drivers/staging/hv/storvsc_drv.c
@@ -349,6 +349,10 @@ static int storvsc_remove(struct hv_device *dev)
        struct Scsi_Host *host = dev_get_drvdata(&dev->device);
        struct hv_host_device *host_dev =
                        (struct hv_host_device *)host->hostdata;
+       struct storvsc_device *stor_dev = dev->ext;
+
+       if (!stor_dev->hba_owner)
+               return 0;
 
        scsi_remove_host(host);
 
@@ -743,7 +747,10 @@ static int storvsc_probe(struct hv_device *device)
                scsi_host_put(host);
                return -ENODEV;
        }
-
+       /*
+        * This stor device owns the HBA; capture that state.
+        */
+       ((struct storvsc_device *)device->ext)->hba_owner = true;
        host_dev->path = device_info.path_id;
        host_dev->target = device_info.target_id;
 
-- 
1.7.4.1

_______________________________________________
devel mailing list
[email protected]
http://driverdev.linuxdriverproject.org/mailman/listinfo/devel

Reply via email to