[PATCH 25/40] Staging: hv: storvsc: Add state to manage the lifecycle of emulated HBA
From: "K. Y. Srinivasan" <kys@microsoft.com>
Date: 2011-06-29 14:23:20
Also in:
lkml
Subsystem:
staging subsystem, the rest · Maintainers:
Greg Kroah-Hartman, Linus Torvalds
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@microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com> Signed-off-by: Abhishek Kane <redacted> Signed-off-by: Hank Janssen <redacted> --- 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