scsi_target_reap(starget);
 }
 
+static int __remove_child (struct device * dev, void * data)
+{
+       if (scsi_is_target_device(dev))
+               __scsi_remove_target(to_scsi_target(dev));
+       return 0;
+}
+
 /**
  * scsi_remove_target - try to remove a target and all its devices
  * @dev: generic starget or parent of generic stargets to be removed
  */
 void scsi_remove_target(struct device *dev)
 {
-       struct device *rdev, *idev, *next;
+       struct device *rdev;
 
        if (scsi_is_target_device(dev)) {
                __scsi_remove_target(to_scsi_target(dev));
        }
 
        rdev = get_device(dev);
-       list_for_each_entry_safe(idev, next, &dev->children, node) {
-               if (scsi_is_target_device(idev))
-                       __scsi_remove_target(to_scsi_target(idev));
-       }
+       device_for_each_child(dev, NULL, __remove_child);
        put_device(rdev);
 }
 EXPORT_SYMBOL(scsi_remove_target);