[PATCH 25/40] Staging: hv: storvsc: Add state to manage the lifecycle of emulated HBA

K. Y. Srinivasan kys at microsoft.com
Wed Jun 29 14:39:22 UTC 2011


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 <kys at microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com>
Signed-off-by: Abhishek Kane <v-abkane at microsoft.com>
Signed-off-by: Hank Janssen <hjanssen at microsoft.com>
---
 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




More information about the devel mailing list