From: Markus Lidel - Add a new function __scsi_add_device, which has an additional parameter compared to scsi_add_device. This parameter is used to preset the hostdata pointer. Signed-off-by: Andrew Morton --- 25-akpm/drivers/scsi/scsi_scan.c | 25 ++++++++++++++----------- 25-akpm/drivers/scsi/scsi_syms.c | 2 +- 25-akpm/include/scsi/scsi_device.h | 6 ++++-- 3 files changed, 19 insertions(+), 14 deletions(-) diff -puN drivers/scsi/scsi_scan.c~i2o-add-functionality-to-scsi_add_device-to-preset-hostdata drivers/scsi/scsi_scan.c --- 25/drivers/scsi/scsi_scan.c~i2o-add-functionality-to-scsi_add_device-to-preset-hostdata 2004-08-22 00:09:23.272575192 -0700 +++ 25-akpm/drivers/scsi/scsi_scan.c 2004-08-22 00:09:23.280573976 -0700 @@ -200,7 +200,7 @@ static void print_inquiry(unsigned char * scsi_Device pointer, or NULL on failure. **/ static struct scsi_device *scsi_alloc_sdev(struct Scsi_Host *shost, - uint channel, uint id, uint lun) + uint channel, uint id, uint lun, void *hostdata) { struct scsi_device *sdev, *device; unsigned long flags; @@ -224,6 +224,8 @@ static struct scsi_device *scsi_alloc_sd INIT_LIST_HEAD(&sdev->starved_entry); spin_lock_init(&sdev->list_lock); + /* usually NULL and set by ->slave_alloc instead */ + sdev->hostdata = hostdata; /* if the device needs this changing, it may do so in the * slave_configure function */ @@ -704,7 +706,7 @@ static int scsi_add_lun(struct scsi_devi **/ static int scsi_probe_and_add_lun(struct Scsi_Host *host, uint channel, uint id, uint lun, int *bflagsp, - struct scsi_device **sdevp, int rescan) + struct scsi_device **sdevp, int rescan, void *hostdata) { struct scsi_device *sdev; struct scsi_request *sreq; @@ -733,7 +735,7 @@ static int scsi_probe_and_add_lun(struct } } - sdev = scsi_alloc_sdev(host, channel, id, lun); + sdev = scsi_alloc_sdev(host, channel, id, lun, hostdata); if (!sdev) goto out; sreq = scsi_allocate_request(sdev, GFP_ATOMIC); @@ -881,7 +883,7 @@ static void scsi_sequential_lun_scan(str */ for (lun = 1; lun < max_dev_lun; ++lun) if ((scsi_probe_and_add_lun(shost, channel, id, lun, - NULL, NULL, rescan) != SCSI_SCAN_LUN_PRESENT) && + NULL, NULL, rescan, NULL) != SCSI_SCAN_LUN_PRESENT) && !sparse_lun) return; } @@ -1092,7 +1094,7 @@ static int scsi_report_lun_scan(struct s int res; res = scsi_probe_and_add_lun(sdev->host, sdev->channel, - sdev->id, lun, NULL, NULL, rescan); + sdev->id, lun, NULL, NULL, rescan, NULL); if (res == SCSI_SCAN_NO_RESPONSE) { /* * Got some results, but now none, abort. @@ -1118,14 +1120,15 @@ static int scsi_report_lun_scan(struct s return 0; } -struct scsi_device *scsi_add_device(struct Scsi_Host *shost, - uint channel, uint id, uint lun) +struct scsi_device *__scsi_add_device(struct Scsi_Host *shost, uint channel, + uint id, uint lun, void *hostdata) { struct scsi_device *sdev; int res; down(&shost->scan_mutex); - res = scsi_probe_and_add_lun(shost, channel, id, lun, NULL, &sdev, 1); + res = scsi_probe_and_add_lun(shost, channel, id, lun, NULL, + &sdev, 1, hostdata); if (res != SCSI_SCAN_LUN_PRESENT) sdev = ERR_PTR(-ENODEV); up(&shost->scan_mutex); @@ -1185,7 +1188,7 @@ static void scsi_scan_target(struct Scsi * Scan for a specific host/chan/id/lun. */ scsi_probe_and_add_lun(shost, channel, id, lun, NULL, NULL, - rescan); + rescan, NULL); return; } @@ -1194,7 +1197,7 @@ static void scsi_scan_target(struct Scsi * would not configure LUN 0 until all LUNs are scanned. */ res = scsi_probe_and_add_lun(shost, channel, id, 0, &bflags, &sdev, - rescan); + rescan, NULL); if (res == SCSI_SCAN_LUN_PRESENT) { if (scsi_report_lun_scan(sdev, bflags, rescan) != 0) /* @@ -1323,7 +1326,7 @@ struct scsi_device *scsi_get_host_dev(st { struct scsi_device *sdev; - sdev = scsi_alloc_sdev(shost, 0, shost->this_id, 0); + sdev = scsi_alloc_sdev(shost, 0, shost->this_id, 0, NULL); if (sdev) { sdev->borken = 0; } diff -puN drivers/scsi/scsi_syms.c~i2o-add-functionality-to-scsi_add_device-to-preset-hostdata drivers/scsi/scsi_syms.c --- 25/drivers/scsi/scsi_syms.c~i2o-add-functionality-to-scsi_add_device-to-preset-hostdata 2004-08-22 00:09:23.273575040 -0700 +++ 25-akpm/drivers/scsi/scsi_syms.c 2004-08-22 00:09:23.280573976 -0700 @@ -71,7 +71,7 @@ EXPORT_SYMBOL(scsi_free_host_dev); EXPORT_SYMBOL(scsi_io_completion); -EXPORT_SYMBOL(scsi_add_device); +EXPORT_SYMBOL(__scsi_add_device); EXPORT_SYMBOL(scsi_remove_device); EXPORT_SYMBOL(scsi_device_cancel); diff -puN include/scsi/scsi_device.h~i2o-add-functionality-to-scsi_add_device-to-preset-hostdata include/scsi/scsi_device.h --- 25/include/scsi/scsi_device.h~i2o-add-functionality-to-scsi_add_device-to-preset-hostdata 2004-08-22 00:09:23.275574736 -0700 +++ 25-akpm/include/scsi/scsi_device.h 2004-08-22 00:09:23.281573824 -0700 @@ -133,8 +133,10 @@ struct scsi_device { #define transport_class_to_sdev(class_dev) \ container_of(class_dev, struct scsi_device, transport_classdev) -extern struct scsi_device *scsi_add_device(struct Scsi_Host *, - uint, uint, uint); +extern struct scsi_device *__scsi_add_device(struct Scsi_Host *, + uint, uint, uint, void *hostdata); +#define scsi_add_device(host, channel, target, lun) \ + __scsi_add_device(host, channel, target, lun, NULL) extern void scsi_remove_device(struct scsi_device *); extern int scsi_device_cancel(struct scsi_device *, int); _