[SCSI] Alter the scsi_add_device() API to conform to what users expect

The original API returned either an ERR_PTR() or a refcounted sdev.
Unfortunately, if it's successful, you need to do a scsi_device_put() on
the sdev otherwise the refcounting is wrong.

Everyone seems to expect that scsi_add_device() should be callable
without doing the ref put, so alter the API so it is (we still have
__scsi_add_device with the original behaviour).

The only actual caller that needs altering is the one in firewire ...
not because it gets this right, but because it acts on the error if one
is returned.

Acked-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>

authored by James Bottomley and committed by James Bottomley 146f7262 b70d37bf

+19 -6
+4 -4
drivers/ieee1394/sbp2.c
··· 790 static int sbp2_start_device(struct scsi_id_instance_data *scsi_id) 791 { 792 struct sbp2scsi_host_info *hi = scsi_id->hi; 793 - struct scsi_device *sdev; 794 795 SBP2_DEBUG("sbp2_start_device"); 796 ··· 939 sbp2_max_speed_and_size(scsi_id); 940 941 /* Add this device to the scsi layer now */ 942 - sdev = scsi_add_device(scsi_id->scsi_host, 0, scsi_id->ud->id, 0); 943 - if (IS_ERR(sdev)) { 944 SBP2_ERR("scsi_add_device failed"); 945 - return PTR_ERR(sdev); 946 } 947 948 return 0;
··· 790 static int sbp2_start_device(struct scsi_id_instance_data *scsi_id) 791 { 792 struct sbp2scsi_host_info *hi = scsi_id->hi; 793 + int error; 794 795 SBP2_DEBUG("sbp2_start_device"); 796 ··· 939 sbp2_max_speed_and_size(scsi_id); 940 941 /* Add this device to the scsi layer now */ 942 + error = scsi_add_device(scsi_id->scsi_host, 0, scsi_id->ud->id, 0); 943 + if (error) { 944 SBP2_ERR("scsi_add_device failed"); 945 + return error; 946 } 947 948 return 0;
+13
drivers/scsi/scsi_scan.c
··· 1264 } 1265 EXPORT_SYMBOL(__scsi_add_device); 1266 1267 void scsi_rescan_device(struct device *dev) 1268 { 1269 struct scsi_driver *drv;
··· 1264 } 1265 EXPORT_SYMBOL(__scsi_add_device); 1266 1267 + int scsi_add_device(struct Scsi_Host *host, uint channel, 1268 + uint target, uint lun) 1269 + { 1270 + struct scsi_device *sdev = 1271 + __scsi_add_device(host, channel, target, lun, NULL); 1272 + if (IS_ERR(sdev)) 1273 + return PTR_ERR(sdev); 1274 + 1275 + scsi_device_put(sdev); 1276 + return 0; 1277 + } 1278 + EXPORT_SYMBOL(scsi_add_device); 1279 + 1280 void scsi_rescan_device(struct device *dev) 1281 { 1282 struct scsi_driver *drv;
+2 -2
include/scsi/scsi_device.h
··· 178 179 extern struct scsi_device *__scsi_add_device(struct Scsi_Host *, 180 uint, uint, uint, void *hostdata); 181 - #define scsi_add_device(host, channel, target, lun) \ 182 - __scsi_add_device(host, channel, target, lun, NULL) 183 extern void scsi_remove_device(struct scsi_device *); 184 extern int scsi_device_cancel(struct scsi_device *, int); 185
··· 178 179 extern struct scsi_device *__scsi_add_device(struct Scsi_Host *, 180 uint, uint, uint, void *hostdata); 181 + extern int scsi_add_device(struct Scsi_Host *host, uint channel, 182 + uint target, uint lun); 183 extern void scsi_remove_device(struct scsi_device *); 184 extern int scsi_device_cancel(struct scsi_device *, int); 185