aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJames Bottomley <jejb@mulgrave.(none)>2005-01-11 22:06:41 -0600
committerJames Bottomley <jejb@mulgrave.(none)>2005-01-11 22:06:41 -0600
commit65c333c9425f7914ec3cf8fa5e18b1f08abb812a (patch)
treec6adb3ee3043f96a813c036ace00bdeb92a9bdb6 /drivers
parent09cb5719cb505df414346fd96c8e0641fd078092 (diff)
downloadhistory-65c333c9425f7914ec3cf8fa5e18b1f08abb812a.tar.gz
SCSI: add starget_for_each_device
From: James.Smart@Emulex.Com This patch deprecates the use of device_for_each_child() with stargets. The reasoning behind this is due to issues regarding: Semaphores that device_for_each_child() takes Implicit assumptions that each child is an sdev device. The patch adds a new helper function, starget_for_each_device(), and replaces all previous uses of device_for_each_child(). Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/scsi/scsi.c22
-rw-r--r--drivers/scsi/scsi_lib.c18
-rw-r--r--drivers/scsi/scsi_transport_fc.c16
3 files changed, 37 insertions, 19 deletions
diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
index 82c7b0ab404739..63e5224eee0a0c 100644
--- a/drivers/scsi/scsi.c
+++ b/drivers/scsi/scsi.c
@@ -1083,6 +1083,28 @@ struct scsi_device *__scsi_iterate_devices(struct Scsi_Host *shost,
EXPORT_SYMBOL(__scsi_iterate_devices);
/**
+ * starget_for_each_device - helper to walk all devices of a target
+ * @starget: target whose devices we want to iterate over.
+ *
+ * This traverses over each devices of @shost. The devices have
+ * a reference that must be released by scsi_host_put when breaking
+ * out of the loop.
+ */
+void starget_for_each_device(struct scsi_target *starget, void * data,
+ void (*fn)(struct scsi_device *, void *))
+{
+ struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
+ struct scsi_device *sdev;
+
+ shost_for_each_device(sdev, shost) {
+ if ((sdev->channel == starget->channel) &&
+ (sdev->id == starget->id))
+ fn(sdev, data);
+ }
+}
+EXPORT_SYMBOL(starget_for_each_device);
+
+/**
* scsi_device_lookup - find a device given the host (UNLOCKED)
* @shost: SCSI host pointer
* @channel: SCSI channel (zero if only one channel)
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 73660628b520a2..38f165070c9434 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -1782,31 +1782,29 @@ scsi_device_resume(struct scsi_device *sdev)
}
EXPORT_SYMBOL(scsi_device_resume);
-static int
-device_quiesce_fn(struct device *dev, void *data)
+static void
+device_quiesce_fn(struct scsi_device *sdev, void *data)
{
- scsi_device_quiesce(to_scsi_device(dev));
- return 0;
+ scsi_device_quiesce(sdev);
}
void
scsi_target_quiesce(struct scsi_target *starget)
{
- device_for_each_child(&starget->dev, NULL, device_quiesce_fn);
+ starget_for_each_device(starget, NULL, device_quiesce_fn);
}
EXPORT_SYMBOL(scsi_target_quiesce);
-static int
-device_resume_fn(struct device *dev, void *data)
+static void
+device_resume_fn(struct scsi_device *sdev, void *data)
{
- scsi_device_resume(to_scsi_device(dev));
- return 0;
+ scsi_device_resume(sdev);
}
void
scsi_target_resume(struct scsi_target *starget)
{
- device_for_each_child(&starget->dev, NULL, device_resume_fn);
+ starget_for_each_device(starget, NULL, device_resume_fn);
}
EXPORT_SYMBOL(scsi_target_resume);
diff --git a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c
index 926cec15e5f2d8..2fddf2c24b6752 100644
--- a/drivers/scsi/scsi_transport_fc.c
+++ b/drivers/scsi/scsi_transport_fc.c
@@ -808,10 +808,9 @@ EXPORT_SYMBOL(fc_release_transport);
* @dev: scsi device
* @data: unused
**/
-static int fc_device_block(struct device *dev, void *data)
+static void fc_device_block(struct scsi_device *sdev, void *data)
{
- scsi_internal_device_block(to_scsi_device(dev));
- return 0;
+ scsi_internal_device_block(sdev);
}
/**
@@ -819,10 +818,9 @@ static int fc_device_block(struct device *dev, void *data)
* @dev: scsi device
* @data: unused
**/
-static int fc_device_unblock(struct device *dev, void *data)
+static void fc_device_unblock(struct scsi_device *sdev, void *data)
{
- scsi_internal_device_unblock(to_scsi_device(dev));
- return 0;
+ scsi_internal_device_unblock(sdev);
}
/**
@@ -842,7 +840,7 @@ static void fc_timeout_blocked_tgt(void *data)
* unblock this device, then IO errors will probably
* result if the host still isn't ready.
*/
- device_for_each_child(&starget->dev, NULL, fc_device_unblock);
+ starget_for_each_device(starget, NULL, fc_device_unblock);
}
/**
@@ -870,7 +868,7 @@ fc_target_block(struct scsi_target *starget)
if (timeout < 0 || timeout > SCSI_DEVICE_BLOCK_MAX_TIMEOUT)
return -EINVAL;
- device_for_each_child(&starget->dev, NULL, fc_device_block);
+ starget_for_each_device(starget, NULL, fc_device_block);
/* The scsi lld blocks this target for the timeout period only. */
schedule_delayed_work(work, timeout * HZ);
@@ -901,7 +899,7 @@ fc_target_unblock(struct scsi_target *starget)
if (cancel_delayed_work(&fc_starget_dev_loss_work(starget)))
flush_scheduled_work();
- device_for_each_child(&starget->dev, NULL, fc_device_unblock);
+ starget_for_each_device(starget, NULL, fc_device_unblock);
}
EXPORT_SYMBOL(fc_target_unblock);