diff options
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/NCR5380.c | 11 | ||||
-rw-r--r-- | drivers/scsi/NCR5380.h | 4 | ||||
-rw-r--r-- | drivers/scsi/aha152x.c | 4 | ||||
-rw-r--r-- | drivers/scsi/aic94xx/aic94xx_scb.c | 9 | ||||
-rw-r--r-- | drivers/scsi/imm.c | 12 | ||||
-rw-r--r-- | drivers/scsi/ipr.c | 9 | ||||
-rw-r--r-- | drivers/scsi/libiscsi.c | 7 | ||||
-rw-r--r-- | drivers/scsi/libsas/sas_discover.c | 22 | ||||
-rw-r--r-- | drivers/scsi/libsas/sas_event.c | 14 | ||||
-rw-r--r-- | drivers/scsi/libsas/sas_init.c | 6 | ||||
-rw-r--r-- | drivers/scsi/libsas/sas_internal.h | 12 | ||||
-rw-r--r-- | drivers/scsi/libsas/sas_phy.c | 45 | ||||
-rw-r--r-- | drivers/scsi/libsas/sas_port.c | 30 | ||||
-rw-r--r-- | drivers/scsi/libsas/sas_scsi_host.c | 4 | ||||
-rw-r--r-- | drivers/scsi/ppa.c | 12 | ||||
-rw-r--r-- | drivers/scsi/qla4xxx/ql4_os.c | 7 | ||||
-rw-r--r-- | drivers/scsi/scsi_scan.c | 7 | ||||
-rw-r--r-- | drivers/scsi/scsi_sysfs.c | 10 | ||||
-rw-r--r-- | drivers/scsi/scsi_tgt_lib.c | 15 | ||||
-rw-r--r-- | drivers/scsi/scsi_transport_fc.c | 60 | ||||
-rw-r--r-- | drivers/scsi/scsi_transport_iscsi.c | 8 | ||||
-rw-r--r-- | drivers/scsi/scsi_transport_spi.c | 7 |
22 files changed, 180 insertions, 135 deletions
diff --git a/drivers/scsi/NCR5380.c b/drivers/scsi/NCR5380.c index a6aa91072880..bb3cb3360541 100644 --- a/drivers/scsi/NCR5380.c +++ b/drivers/scsi/NCR5380.c | |||
@@ -849,7 +849,7 @@ static int __devinit NCR5380_init(struct Scsi_Host *instance, int flags) | |||
849 | hostdata->issue_queue = NULL; | 849 | hostdata->issue_queue = NULL; |
850 | hostdata->disconnected_queue = NULL; | 850 | hostdata->disconnected_queue = NULL; |
851 | 851 | ||
852 | INIT_WORK(&hostdata->coroutine, NCR5380_main, hostdata); | 852 | INIT_DELAYED_WORK(&hostdata->coroutine, NCR5380_main); |
853 | 853 | ||
854 | #ifdef NCR5380_STATS | 854 | #ifdef NCR5380_STATS |
855 | for (i = 0; i < 8; ++i) { | 855 | for (i = 0; i < 8; ++i) { |
@@ -1016,7 +1016,7 @@ static int NCR5380_queue_command(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)) | |||
1016 | 1016 | ||
1017 | /* Run the coroutine if it isn't already running. */ | 1017 | /* Run the coroutine if it isn't already running. */ |
1018 | /* Kick off command processing */ | 1018 | /* Kick off command processing */ |
1019 | schedule_work(&hostdata->coroutine); | 1019 | schedule_delayed_work(&hostdata->coroutine, 0); |
1020 | return 0; | 1020 | return 0; |
1021 | } | 1021 | } |
1022 | 1022 | ||
@@ -1033,9 +1033,10 @@ static int NCR5380_queue_command(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)) | |||
1033 | * host lock and called routines may take the isa dma lock. | 1033 | * host lock and called routines may take the isa dma lock. |
1034 | */ | 1034 | */ |
1035 | 1035 | ||
1036 | static void NCR5380_main(void *p) | 1036 | static void NCR5380_main(struct work_struct *work) |
1037 | { | 1037 | { |
1038 | struct NCR5380_hostdata *hostdata = p; | 1038 | struct NCR5380_hostdata *hostdata = |
1039 | container_of(work, struct NCR5380_hostdata, coroutine.work); | ||
1039 | struct Scsi_Host *instance = hostdata->host; | 1040 | struct Scsi_Host *instance = hostdata->host; |
1040 | Scsi_Cmnd *tmp, *prev; | 1041 | Scsi_Cmnd *tmp, *prev; |
1041 | int done; | 1042 | int done; |
@@ -1221,7 +1222,7 @@ static irqreturn_t NCR5380_intr(int irq, void *dev_id) | |||
1221 | } /* if BASR_IRQ */ | 1222 | } /* if BASR_IRQ */ |
1222 | spin_unlock_irqrestore(instance->host_lock, flags); | 1223 | spin_unlock_irqrestore(instance->host_lock, flags); |
1223 | if(!done) | 1224 | if(!done) |
1224 | schedule_work(&hostdata->coroutine); | 1225 | schedule_delayed_work(&hostdata->coroutine, 0); |
1225 | } while (!done); | 1226 | } while (!done); |
1226 | return IRQ_HANDLED; | 1227 | return IRQ_HANDLED; |
1227 | } | 1228 | } |
diff --git a/drivers/scsi/NCR5380.h b/drivers/scsi/NCR5380.h index 1bc73de496b0..713a108c02ef 100644 --- a/drivers/scsi/NCR5380.h +++ b/drivers/scsi/NCR5380.h | |||
@@ -271,7 +271,7 @@ struct NCR5380_hostdata { | |||
271 | unsigned long time_expires; /* in jiffies, set prior to sleeping */ | 271 | unsigned long time_expires; /* in jiffies, set prior to sleeping */ |
272 | int select_time; /* timer in select for target response */ | 272 | int select_time; /* timer in select for target response */ |
273 | volatile Scsi_Cmnd *selecting; | 273 | volatile Scsi_Cmnd *selecting; |
274 | struct work_struct coroutine; /* our co-routine */ | 274 | struct delayed_work coroutine; /* our co-routine */ |
275 | #ifdef NCR5380_STATS | 275 | #ifdef NCR5380_STATS |
276 | unsigned timebase; /* Base for time calcs */ | 276 | unsigned timebase; /* Base for time calcs */ |
277 | long time_read[8]; /* time to do reads */ | 277 | long time_read[8]; /* time to do reads */ |
@@ -298,7 +298,7 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance); | |||
298 | #ifndef DONT_USE_INTR | 298 | #ifndef DONT_USE_INTR |
299 | static irqreturn_t NCR5380_intr(int irq, void *dev_id); | 299 | static irqreturn_t NCR5380_intr(int irq, void *dev_id); |
300 | #endif | 300 | #endif |
301 | static void NCR5380_main(void *ptr); | 301 | static void NCR5380_main(struct work_struct *work); |
302 | static void NCR5380_print_options(struct Scsi_Host *instance); | 302 | static void NCR5380_print_options(struct Scsi_Host *instance); |
303 | #ifdef NDEBUG | 303 | #ifdef NDEBUG |
304 | static void NCR5380_print_phase(struct Scsi_Host *instance); | 304 | static void NCR5380_print_phase(struct Scsi_Host *instance); |
diff --git a/drivers/scsi/aha152x.c b/drivers/scsi/aha152x.c index 306f46b85a55..0cec742d12e9 100644 --- a/drivers/scsi/aha152x.c +++ b/drivers/scsi/aha152x.c | |||
@@ -1443,7 +1443,7 @@ static struct work_struct aha152x_tq; | |||
1443 | * Run service completions on the card with interrupts enabled. | 1443 | * Run service completions on the card with interrupts enabled. |
1444 | * | 1444 | * |
1445 | */ | 1445 | */ |
1446 | static void run(void) | 1446 | static void run(struct work_struct *work) |
1447 | { | 1447 | { |
1448 | struct aha152x_hostdata *hd; | 1448 | struct aha152x_hostdata *hd; |
1449 | 1449 | ||
@@ -1499,7 +1499,7 @@ static irqreturn_t intr(int irqno, void *dev_id) | |||
1499 | HOSTDATA(shpnt)->service=1; | 1499 | HOSTDATA(shpnt)->service=1; |
1500 | 1500 | ||
1501 | /* Poke the BH handler */ | 1501 | /* Poke the BH handler */ |
1502 | INIT_WORK(&aha152x_tq, (void *) run, NULL); | 1502 | INIT_WORK(&aha152x_tq, run); |
1503 | schedule_work(&aha152x_tq); | 1503 | schedule_work(&aha152x_tq); |
1504 | } | 1504 | } |
1505 | DO_UNLOCK(flags); | 1505 | DO_UNLOCK(flags); |
diff --git a/drivers/scsi/aic94xx/aic94xx_scb.c b/drivers/scsi/aic94xx/aic94xx_scb.c index 14d5d8c2ee13..75ed6b0569d1 100644 --- a/drivers/scsi/aic94xx/aic94xx_scb.c +++ b/drivers/scsi/aic94xx/aic94xx_scb.c | |||
@@ -414,9 +414,10 @@ void asd_invalidate_edb(struct asd_ascb *ascb, int edb_id) | |||
414 | } | 414 | } |
415 | 415 | ||
416 | /* hard reset a phy later */ | 416 | /* hard reset a phy later */ |
417 | static void do_phy_reset_later(void *data) | 417 | static void do_phy_reset_later(struct work_struct *work) |
418 | { | 418 | { |
419 | struct sas_phy *sas_phy = data; | 419 | struct sas_phy *sas_phy = |
420 | container_of(work, struct sas_phy, reset_work); | ||
420 | int error; | 421 | int error; |
421 | 422 | ||
422 | ASD_DPRINTK("%s: About to hard reset phy %d\n", __FUNCTION__, | 423 | ASD_DPRINTK("%s: About to hard reset phy %d\n", __FUNCTION__, |
@@ -430,7 +431,7 @@ static void do_phy_reset_later(void *data) | |||
430 | 431 | ||
431 | static void phy_reset_later(struct sas_phy *sas_phy, struct Scsi_Host *shost) | 432 | static void phy_reset_later(struct sas_phy *sas_phy, struct Scsi_Host *shost) |
432 | { | 433 | { |
433 | INIT_WORK(&sas_phy->reset_work, do_phy_reset_later, sas_phy); | 434 | INIT_WORK(&sas_phy->reset_work, do_phy_reset_later); |
434 | queue_work(shost->work_q, &sas_phy->reset_work); | 435 | queue_work(shost->work_q, &sas_phy->reset_work); |
435 | } | 436 | } |
436 | 437 | ||
@@ -442,7 +443,7 @@ static void task_kill_later(struct asd_ascb *ascb) | |||
442 | struct Scsi_Host *shost = sas_ha->core.shost; | 443 | struct Scsi_Host *shost = sas_ha->core.shost; |
443 | struct sas_task *task = ascb->uldd_task; | 444 | struct sas_task *task = ascb->uldd_task; |
444 | 445 | ||
445 | INIT_WORK(&task->abort_work, (void (*)(void *))sas_task_abort, task); | 446 | INIT_WORK(&task->abort_work, sas_task_abort); |
446 | queue_work(shost->work_q, &task->abort_work); | 447 | queue_work(shost->work_q, &task->abort_work); |
447 | } | 448 | } |
448 | 449 | ||
diff --git a/drivers/scsi/imm.c b/drivers/scsi/imm.c index e31f6122106f..0464c182c577 100644 --- a/drivers/scsi/imm.c +++ b/drivers/scsi/imm.c | |||
@@ -36,7 +36,7 @@ typedef struct { | |||
36 | int base_hi; /* Hi Base address for ECP-ISA chipset */ | 36 | int base_hi; /* Hi Base address for ECP-ISA chipset */ |
37 | int mode; /* Transfer mode */ | 37 | int mode; /* Transfer mode */ |
38 | struct scsi_cmnd *cur_cmd; /* Current queued command */ | 38 | struct scsi_cmnd *cur_cmd; /* Current queued command */ |
39 | struct work_struct imm_tq; /* Polling interrupt stuff */ | 39 | struct delayed_work imm_tq; /* Polling interrupt stuff */ |
40 | unsigned long jstart; /* Jiffies at start */ | 40 | unsigned long jstart; /* Jiffies at start */ |
41 | unsigned failed:1; /* Failure flag */ | 41 | unsigned failed:1; /* Failure flag */ |
42 | unsigned dp:1; /* Data phase present */ | 42 | unsigned dp:1; /* Data phase present */ |
@@ -733,9 +733,9 @@ static int imm_completion(struct scsi_cmnd *cmd) | |||
733 | * the scheduler's task queue to generate a stream of call-backs and | 733 | * the scheduler's task queue to generate a stream of call-backs and |
734 | * complete the request when the drive is ready. | 734 | * complete the request when the drive is ready. |
735 | */ | 735 | */ |
736 | static void imm_interrupt(void *data) | 736 | static void imm_interrupt(struct work_struct *work) |
737 | { | 737 | { |
738 | imm_struct *dev = (imm_struct *) data; | 738 | imm_struct *dev = container_of(work, imm_struct, imm_tq.work); |
739 | struct scsi_cmnd *cmd = dev->cur_cmd; | 739 | struct scsi_cmnd *cmd = dev->cur_cmd; |
740 | struct Scsi_Host *host = cmd->device->host; | 740 | struct Scsi_Host *host = cmd->device->host; |
741 | unsigned long flags; | 741 | unsigned long flags; |
@@ -745,7 +745,6 @@ static void imm_interrupt(void *data) | |||
745 | return; | 745 | return; |
746 | } | 746 | } |
747 | if (imm_engine(dev, cmd)) { | 747 | if (imm_engine(dev, cmd)) { |
748 | INIT_WORK(&dev->imm_tq, imm_interrupt, (void *) dev); | ||
749 | schedule_delayed_work(&dev->imm_tq, 1); | 748 | schedule_delayed_work(&dev->imm_tq, 1); |
750 | return; | 749 | return; |
751 | } | 750 | } |
@@ -953,8 +952,7 @@ static int imm_queuecommand(struct scsi_cmnd *cmd, | |||
953 | cmd->result = DID_ERROR << 16; /* default return code */ | 952 | cmd->result = DID_ERROR << 16; /* default return code */ |
954 | cmd->SCp.phase = 0; /* bus free */ | 953 | cmd->SCp.phase = 0; /* bus free */ |
955 | 954 | ||
956 | INIT_WORK(&dev->imm_tq, imm_interrupt, dev); | 955 | schedule_delayed_work(&dev->imm_tq, 0); |
957 | schedule_work(&dev->imm_tq); | ||
958 | 956 | ||
959 | imm_pb_claim(dev); | 957 | imm_pb_claim(dev); |
960 | 958 | ||
@@ -1225,7 +1223,7 @@ static int __imm_attach(struct parport *pb) | |||
1225 | else | 1223 | else |
1226 | ports = 8; | 1224 | ports = 8; |
1227 | 1225 | ||
1228 | INIT_WORK(&dev->imm_tq, imm_interrupt, dev); | 1226 | INIT_DELAYED_WORK(&dev->imm_tq, imm_interrupt); |
1229 | 1227 | ||
1230 | err = -ENOMEM; | 1228 | err = -ENOMEM; |
1231 | host = scsi_host_alloc(&imm_template, sizeof(imm_struct *)); | 1229 | host = scsi_host_alloc(&imm_template, sizeof(imm_struct *)); |
diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c index 2d83fbb806a5..ccd4dafce8e2 100644 --- a/drivers/scsi/ipr.c +++ b/drivers/scsi/ipr.c | |||
@@ -2307,7 +2307,7 @@ static void ipr_release_dump(struct kref *kref) | |||
2307 | 2307 | ||
2308 | /** | 2308 | /** |
2309 | * ipr_worker_thread - Worker thread | 2309 | * ipr_worker_thread - Worker thread |
2310 | * @data: ioa config struct | 2310 | * @work: ioa config struct |
2311 | * | 2311 | * |
2312 | * Called at task level from a work thread. This function takes care | 2312 | * Called at task level from a work thread. This function takes care |
2313 | * of adding and removing device from the mid-layer as configuration | 2313 | * of adding and removing device from the mid-layer as configuration |
@@ -2316,13 +2316,14 @@ static void ipr_release_dump(struct kref *kref) | |||
2316 | * Return value: | 2316 | * Return value: |
2317 | * nothing | 2317 | * nothing |
2318 | **/ | 2318 | **/ |
2319 | static void ipr_worker_thread(void *data) | 2319 | static void ipr_worker_thread(struct work_struct *work) |
2320 | { | 2320 | { |
2321 | unsigned long lock_flags; | 2321 | unsigned long lock_flags; |
2322 | struct ipr_resource_entry *res; | 2322 | struct ipr_resource_entry *res; |
2323 | struct scsi_device *sdev; | 2323 | struct scsi_device *sdev; |
2324 | struct ipr_dump *dump; | 2324 | struct ipr_dump *dump; |
2325 | struct ipr_ioa_cfg *ioa_cfg = data; | 2325 | struct ipr_ioa_cfg *ioa_cfg = |
2326 | container_of(work, struct ipr_ioa_cfg, work_q); | ||
2326 | u8 bus, target, lun; | 2327 | u8 bus, target, lun; |
2327 | int did_work; | 2328 | int did_work; |
2328 | 2329 | ||
@@ -7121,7 +7122,7 @@ static void __devinit ipr_init_ioa_cfg(struct ipr_ioa_cfg *ioa_cfg, | |||
7121 | INIT_LIST_HEAD(&ioa_cfg->hostrcb_pending_q); | 7122 | INIT_LIST_HEAD(&ioa_cfg->hostrcb_pending_q); |
7122 | INIT_LIST_HEAD(&ioa_cfg->free_res_q); | 7123 | INIT_LIST_HEAD(&ioa_cfg->free_res_q); |
7123 | INIT_LIST_HEAD(&ioa_cfg->used_res_q); | 7124 | INIT_LIST_HEAD(&ioa_cfg->used_res_q); |
7124 | INIT_WORK(&ioa_cfg->work_q, ipr_worker_thread, ioa_cfg); | 7125 | INIT_WORK(&ioa_cfg->work_q, ipr_worker_thread); |
7125 | init_waitqueue_head(&ioa_cfg->reset_wait_q); | 7126 | init_waitqueue_head(&ioa_cfg->reset_wait_q); |
7126 | ioa_cfg->sdt_state = INACTIVE; | 7127 | ioa_cfg->sdt_state = INACTIVE; |
7127 | if (ipr_enable_cache) | 7128 | if (ipr_enable_cache) |
diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c index 5d8862189485..e11b23c641e2 100644 --- a/drivers/scsi/libiscsi.c +++ b/drivers/scsi/libiscsi.c | |||
@@ -719,9 +719,10 @@ again: | |||
719 | return rc; | 719 | return rc; |
720 | } | 720 | } |
721 | 721 | ||
722 | static void iscsi_xmitworker(void *data) | 722 | static void iscsi_xmitworker(struct work_struct *work) |
723 | { | 723 | { |
724 | struct iscsi_conn *conn = data; | 724 | struct iscsi_conn *conn = |
725 | container_of(work, struct iscsi_conn, xmitwork); | ||
725 | int rc; | 726 | int rc; |
726 | /* | 727 | /* |
727 | * serialize Xmit worker on a per-connection basis. | 728 | * serialize Xmit worker on a per-connection basis. |
@@ -1512,7 +1513,7 @@ iscsi_conn_setup(struct iscsi_cls_session *cls_session, uint32_t conn_idx) | |||
1512 | if (conn->mgmtqueue == ERR_PTR(-ENOMEM)) | 1513 | if (conn->mgmtqueue == ERR_PTR(-ENOMEM)) |
1513 | goto mgmtqueue_alloc_fail; | 1514 | goto mgmtqueue_alloc_fail; |
1514 | 1515 | ||
1515 | INIT_WORK(&conn->xmitwork, iscsi_xmitworker, conn); | 1516 | INIT_WORK(&conn->xmitwork, iscsi_xmitworker); |
1516 | 1517 | ||
1517 | /* allocate login_mtask used for the login/text sequences */ | 1518 | /* allocate login_mtask used for the login/text sequences */ |
1518 | spin_lock_bh(&session->lock); | 1519 | spin_lock_bh(&session->lock); |
diff --git a/drivers/scsi/libsas/sas_discover.c b/drivers/scsi/libsas/sas_discover.c index d977bd492d8d..fb7df7b75811 100644 --- a/drivers/scsi/libsas/sas_discover.c +++ b/drivers/scsi/libsas/sas_discover.c | |||
@@ -647,10 +647,12 @@ void sas_unregister_domain_devices(struct asd_sas_port *port) | |||
647 | * Discover process only interrogates devices in order to discover the | 647 | * Discover process only interrogates devices in order to discover the |
648 | * domain. | 648 | * domain. |
649 | */ | 649 | */ |
650 | static void sas_discover_domain(void *data) | 650 | static void sas_discover_domain(struct work_struct *work) |
651 | { | 651 | { |
652 | int error = 0; | 652 | int error = 0; |
653 | struct asd_sas_port *port = data; | 653 | struct sas_discovery_event *ev = |
654 | container_of(work, struct sas_discovery_event, work); | ||
655 | struct asd_sas_port *port = ev->port; | ||
654 | 656 | ||
655 | sas_begin_event(DISCE_DISCOVER_DOMAIN, &port->disc.disc_event_lock, | 657 | sas_begin_event(DISCE_DISCOVER_DOMAIN, &port->disc.disc_event_lock, |
656 | &port->disc.pending); | 658 | &port->disc.pending); |
@@ -692,10 +694,12 @@ static void sas_discover_domain(void *data) | |||
692 | current->pid, error); | 694 | current->pid, error); |
693 | } | 695 | } |
694 | 696 | ||
695 | static void sas_revalidate_domain(void *data) | 697 | static void sas_revalidate_domain(struct work_struct *work) |
696 | { | 698 | { |
697 | int res = 0; | 699 | int res = 0; |
698 | struct asd_sas_port *port = data; | 700 | struct sas_discovery_event *ev = |
701 | container_of(work, struct sas_discovery_event, work); | ||
702 | struct asd_sas_port *port = ev->port; | ||
699 | 703 | ||
700 | sas_begin_event(DISCE_REVALIDATE_DOMAIN, &port->disc.disc_event_lock, | 704 | sas_begin_event(DISCE_REVALIDATE_DOMAIN, &port->disc.disc_event_lock, |
701 | &port->disc.pending); | 705 | &port->disc.pending); |
@@ -722,7 +726,7 @@ int sas_discover_event(struct asd_sas_port *port, enum discover_event ev) | |||
722 | BUG_ON(ev >= DISC_NUM_EVENTS); | 726 | BUG_ON(ev >= DISC_NUM_EVENTS); |
723 | 727 | ||
724 | sas_queue_event(ev, &disc->disc_event_lock, &disc->pending, | 728 | sas_queue_event(ev, &disc->disc_event_lock, &disc->pending, |
725 | &disc->disc_work[ev], port->ha->core.shost); | 729 | &disc->disc_work[ev].work, port->ha->core.shost); |
726 | 730 | ||
727 | return 0; | 731 | return 0; |
728 | } | 732 | } |
@@ -737,13 +741,15 @@ void sas_init_disc(struct sas_discovery *disc, struct asd_sas_port *port) | |||
737 | { | 741 | { |
738 | int i; | 742 | int i; |
739 | 743 | ||
740 | static void (*sas_event_fns[DISC_NUM_EVENTS])(void *) = { | 744 | static const work_func_t sas_event_fns[DISC_NUM_EVENTS] = { |
741 | [DISCE_DISCOVER_DOMAIN] = sas_discover_domain, | 745 | [DISCE_DISCOVER_DOMAIN] = sas_discover_domain, |
742 | [DISCE_REVALIDATE_DOMAIN] = sas_revalidate_domain, | 746 | [DISCE_REVALIDATE_DOMAIN] = sas_revalidate_domain, |
743 | }; | 747 | }; |
744 | 748 | ||
745 | spin_lock_init(&disc->disc_event_lock); | 749 | spin_lock_init(&disc->disc_event_lock); |
746 | disc->pending = 0; | 750 | disc->pending = 0; |
747 | for (i = 0; i < DISC_NUM_EVENTS; i++) | 751 | for (i = 0; i < DISC_NUM_EVENTS; i++) { |
748 | INIT_WORK(&disc->disc_work[i], sas_event_fns[i], port); | 752 | INIT_WORK(&disc->disc_work[i].work, sas_event_fns[i]); |
753 | disc->disc_work[i].port = port; | ||
754 | } | ||
749 | } | 755 | } |
diff --git a/drivers/scsi/libsas/sas_event.c b/drivers/scsi/libsas/sas_event.c index 19110ed1c89c..d83392ee6823 100644 --- a/drivers/scsi/libsas/sas_event.c +++ b/drivers/scsi/libsas/sas_event.c | |||
@@ -31,7 +31,7 @@ static void notify_ha_event(struct sas_ha_struct *sas_ha, enum ha_event event) | |||
31 | BUG_ON(event >= HA_NUM_EVENTS); | 31 | BUG_ON(event >= HA_NUM_EVENTS); |
32 | 32 | ||
33 | sas_queue_event(event, &sas_ha->event_lock, &sas_ha->pending, | 33 | sas_queue_event(event, &sas_ha->event_lock, &sas_ha->pending, |
34 | &sas_ha->ha_events[event], sas_ha->core.shost); | 34 | &sas_ha->ha_events[event].work, sas_ha->core.shost); |
35 | } | 35 | } |
36 | 36 | ||
37 | static void notify_port_event(struct asd_sas_phy *phy, enum port_event event) | 37 | static void notify_port_event(struct asd_sas_phy *phy, enum port_event event) |
@@ -41,7 +41,7 @@ static void notify_port_event(struct asd_sas_phy *phy, enum port_event event) | |||
41 | BUG_ON(event >= PORT_NUM_EVENTS); | 41 | BUG_ON(event >= PORT_NUM_EVENTS); |
42 | 42 | ||
43 | sas_queue_event(event, &ha->event_lock, &phy->port_events_pending, | 43 | sas_queue_event(event, &ha->event_lock, &phy->port_events_pending, |
44 | &phy->port_events[event], ha->core.shost); | 44 | &phy->port_events[event].work, ha->core.shost); |
45 | } | 45 | } |
46 | 46 | ||
47 | static void notify_phy_event(struct asd_sas_phy *phy, enum phy_event event) | 47 | static void notify_phy_event(struct asd_sas_phy *phy, enum phy_event event) |
@@ -51,12 +51,12 @@ static void notify_phy_event(struct asd_sas_phy *phy, enum phy_event event) | |||
51 | BUG_ON(event >= PHY_NUM_EVENTS); | 51 | BUG_ON(event >= PHY_NUM_EVENTS); |
52 | 52 | ||
53 | sas_queue_event(event, &ha->event_lock, &phy->phy_events_pending, | 53 | sas_queue_event(event, &ha->event_lock, &phy->phy_events_pending, |
54 | &phy->phy_events[event], ha->core.shost); | 54 | &phy->phy_events[event].work, ha->core.shost); |
55 | } | 55 | } |
56 | 56 | ||
57 | int sas_init_events(struct sas_ha_struct *sas_ha) | 57 | int sas_init_events(struct sas_ha_struct *sas_ha) |
58 | { | 58 | { |
59 | static void (*sas_ha_event_fns[HA_NUM_EVENTS])(void *) = { | 59 | static const work_func_t sas_ha_event_fns[HA_NUM_EVENTS] = { |
60 | [HAE_RESET] = sas_hae_reset, | 60 | [HAE_RESET] = sas_hae_reset, |
61 | }; | 61 | }; |
62 | 62 | ||
@@ -64,8 +64,10 @@ int sas_init_events(struct sas_ha_struct *sas_ha) | |||
64 | 64 | ||
65 | spin_lock_init(&sas_ha->event_lock); | 65 | spin_lock_init(&sas_ha->event_lock); |
66 | 66 | ||
67 | for (i = 0; i < HA_NUM_EVENTS; i++) | 67 | for (i = 0; i < HA_NUM_EVENTS; i++) { |
68 | INIT_WORK(&sas_ha->ha_events[i], sas_ha_event_fns[i], sas_ha); | 68 | INIT_WORK(&sas_ha->ha_events[i].work, sas_ha_event_fns[i]); |
69 | sas_ha->ha_events[i].ha = sas_ha; | ||
70 | } | ||
69 | 71 | ||
70 | sas_ha->notify_ha_event = notify_ha_event; | 72 | sas_ha->notify_ha_event = notify_ha_event; |
71 | sas_ha->notify_port_event = notify_port_event; | 73 | sas_ha->notify_port_event = notify_port_event; |
diff --git a/drivers/scsi/libsas/sas_init.c b/drivers/scsi/libsas/sas_init.c index 0fb347b4b1a2..d65bc4e0f214 100644 --- a/drivers/scsi/libsas/sas_init.c +++ b/drivers/scsi/libsas/sas_init.c | |||
@@ -65,9 +65,11 @@ void sas_hash_addr(u8 *hashed, const u8 *sas_addr) | |||
65 | 65 | ||
66 | /* ---------- HA events ---------- */ | 66 | /* ---------- HA events ---------- */ |
67 | 67 | ||
68 | void sas_hae_reset(void *data) | 68 | void sas_hae_reset(struct work_struct *work) |
69 | { | 69 | { |
70 | struct sas_ha_struct *ha = data; | 70 | struct sas_ha_event *ev = |
71 | container_of(work, struct sas_ha_event, work); | ||
72 | struct sas_ha_struct *ha = ev->ha; | ||
71 | 73 | ||
72 | sas_begin_event(HAE_RESET, &ha->event_lock, | 74 | sas_begin_event(HAE_RESET, &ha->event_lock, |
73 | &ha->pending); | 75 | &ha->pending); |
diff --git a/drivers/scsi/libsas/sas_internal.h b/drivers/scsi/libsas/sas_internal.h index bffcee474921..137d7e496b6d 100644 --- a/drivers/scsi/libsas/sas_internal.h +++ b/drivers/scsi/libsas/sas_internal.h | |||
@@ -60,11 +60,11 @@ void sas_shutdown_queue(struct sas_ha_struct *sas_ha); | |||
60 | 60 | ||
61 | void sas_deform_port(struct asd_sas_phy *phy); | 61 | void sas_deform_port(struct asd_sas_phy *phy); |
62 | 62 | ||
63 | void sas_porte_bytes_dmaed(void *); | 63 | void sas_porte_bytes_dmaed(struct work_struct *work); |
64 | void sas_porte_broadcast_rcvd(void *); | 64 | void sas_porte_broadcast_rcvd(struct work_struct *work); |
65 | void sas_porte_link_reset_err(void *); | 65 | void sas_porte_link_reset_err(struct work_struct *work); |
66 | void sas_porte_timer_event(void *); | 66 | void sas_porte_timer_event(struct work_struct *work); |
67 | void sas_porte_hard_reset(void *); | 67 | void sas_porte_hard_reset(struct work_struct *work); |
68 | 68 | ||
69 | int sas_notify_lldd_dev_found(struct domain_device *); | 69 | int sas_notify_lldd_dev_found(struct domain_device *); |
70 | void sas_notify_lldd_dev_gone(struct domain_device *); | 70 | void sas_notify_lldd_dev_gone(struct domain_device *); |
@@ -75,7 +75,7 @@ int sas_smp_get_phy_events(struct sas_phy *phy); | |||
75 | 75 | ||
76 | struct domain_device *sas_find_dev_by_rphy(struct sas_rphy *rphy); | 76 | struct domain_device *sas_find_dev_by_rphy(struct sas_rphy *rphy); |
77 | 77 | ||
78 | void sas_hae_reset(void *); | 78 | void sas_hae_reset(struct work_struct *work); |
79 | 79 | ||
80 | static inline void sas_queue_event(int event, spinlock_t *lock, | 80 | static inline void sas_queue_event(int event, spinlock_t *lock, |
81 | unsigned long *pending, | 81 | unsigned long *pending, |
diff --git a/drivers/scsi/libsas/sas_phy.c b/drivers/scsi/libsas/sas_phy.c index 9340cdbae4a3..b459c4b635b1 100644 --- a/drivers/scsi/libsas/sas_phy.c +++ b/drivers/scsi/libsas/sas_phy.c | |||
@@ -30,9 +30,11 @@ | |||
30 | 30 | ||
31 | /* ---------- Phy events ---------- */ | 31 | /* ---------- Phy events ---------- */ |
32 | 32 | ||
33 | static void sas_phye_loss_of_signal(void *data) | 33 | static void sas_phye_loss_of_signal(struct work_struct *work) |
34 | { | 34 | { |
35 | struct asd_sas_phy *phy = data; | 35 | struct asd_sas_event *ev = |
36 | container_of(work, struct asd_sas_event, work); | ||
37 | struct asd_sas_phy *phy = ev->phy; | ||
36 | 38 | ||
37 | sas_begin_event(PHYE_LOSS_OF_SIGNAL, &phy->ha->event_lock, | 39 | sas_begin_event(PHYE_LOSS_OF_SIGNAL, &phy->ha->event_lock, |
38 | &phy->phy_events_pending); | 40 | &phy->phy_events_pending); |
@@ -40,18 +42,22 @@ static void sas_phye_loss_of_signal(void *data) | |||
40 | sas_deform_port(phy); | 42 | sas_deform_port(phy); |
41 | } | 43 | } |
42 | 44 | ||
43 | static void sas_phye_oob_done(void *data) | 45 | static void sas_phye_oob_done(struct work_struct *work) |
44 | { | 46 | { |
45 | struct asd_sas_phy *phy = data; | 47 | struct asd_sas_event *ev = |
48 | container_of(work, struct asd_sas_event, work); | ||
49 | struct asd_sas_phy *phy = ev->phy; | ||
46 | 50 | ||
47 | sas_begin_event(PHYE_OOB_DONE, &phy->ha->event_lock, | 51 | sas_begin_event(PHYE_OOB_DONE, &phy->ha->event_lock, |
48 | &phy->phy_events_pending); | 52 | &phy->phy_events_pending); |
49 | phy->error = 0; | 53 | phy->error = 0; |
50 | } | 54 | } |
51 | 55 | ||
52 | static void sas_phye_oob_error(void *data) | 56 | static void sas_phye_oob_error(struct work_struct *work) |
53 | { | 57 | { |
54 | struct asd_sas_phy *phy = data; | 58 | struct asd_sas_event *ev = |
59 | container_of(work, struct asd_sas_event, work); | ||
60 | struct asd_sas_phy *phy = ev->phy; | ||
55 | struct sas_ha_struct *sas_ha = phy->ha; | 61 | struct sas_ha_struct *sas_ha = phy->ha; |
56 | struct asd_sas_port *port = phy->port; | 62 | struct asd_sas_port *port = phy->port; |
57 | struct sas_internal *i = | 63 | struct sas_internal *i = |
@@ -80,9 +86,11 @@ static void sas_phye_oob_error(void *data) | |||
80 | } | 86 | } |
81 | } | 87 | } |
82 | 88 | ||
83 | static void sas_phye_spinup_hold(void *data) | 89 | static void sas_phye_spinup_hold(struct work_struct *work) |
84 | { | 90 | { |
85 | struct asd_sas_phy *phy = data; | 91 | struct asd_sas_event *ev = |
92 | container_of(work, struct asd_sas_event, work); | ||
93 | struct asd_sas_phy *phy = ev->phy; | ||
86 | struct sas_ha_struct *sas_ha = phy->ha; | 94 | struct sas_ha_struct *sas_ha = phy->ha; |
87 | struct sas_internal *i = | 95 | struct sas_internal *i = |
88 | to_sas_internal(sas_ha->core.shost->transportt); | 96 | to_sas_internal(sas_ha->core.shost->transportt); |
@@ -100,14 +108,14 @@ int sas_register_phys(struct sas_ha_struct *sas_ha) | |||
100 | { | 108 | { |
101 | int i; | 109 | int i; |
102 | 110 | ||
103 | static void (*sas_phy_event_fns[PHY_NUM_EVENTS])(void *) = { | 111 | static const work_func_t sas_phy_event_fns[PHY_NUM_EVENTS] = { |
104 | [PHYE_LOSS_OF_SIGNAL] = sas_phye_loss_of_signal, | 112 | [PHYE_LOSS_OF_SIGNAL] = sas_phye_loss_of_signal, |
105 | [PHYE_OOB_DONE] = sas_phye_oob_done, | 113 | [PHYE_OOB_DONE] = sas_phye_oob_done, |
106 | [PHYE_OOB_ERROR] = sas_phye_oob_error, | 114 | [PHYE_OOB_ERROR] = sas_phye_oob_error, |
107 | [PHYE_SPINUP_HOLD] = sas_phye_spinup_hold, | 115 | [PHYE_SPINUP_HOLD] = sas_phye_spinup_hold, |
108 | }; | 116 | }; |
109 | 117 | ||
110 | static void (*sas_port_event_fns[PORT_NUM_EVENTS])(void *) = { | 118 | static const work_func_t sas_port_event_fns[PORT_NUM_EVENTS] = { |
111 | [PORTE_BYTES_DMAED] = sas_porte_bytes_dmaed, | 119 | [PORTE_BYTES_DMAED] = sas_porte_bytes_dmaed, |
112 | [PORTE_BROADCAST_RCVD] = sas_porte_broadcast_rcvd, | 120 | [PORTE_BROADCAST_RCVD] = sas_porte_broadcast_rcvd, |
113 | [PORTE_LINK_RESET_ERR] = sas_porte_link_reset_err, | 121 | [PORTE_LINK_RESET_ERR] = sas_porte_link_reset_err, |
@@ -122,13 +130,18 @@ int sas_register_phys(struct sas_ha_struct *sas_ha) | |||
122 | 130 | ||
123 | phy->error = 0; | 131 | phy->error = 0; |
124 | INIT_LIST_HEAD(&phy->port_phy_el); | 132 | INIT_LIST_HEAD(&phy->port_phy_el); |
125 | for (k = 0; k < PORT_NUM_EVENTS; k++) | 133 | for (k = 0; k < PORT_NUM_EVENTS; k++) { |
126 | INIT_WORK(&phy->port_events[k], sas_port_event_fns[k], | 134 | INIT_WORK(&phy->port_events[k].work, |
127 | phy); | 135 | sas_port_event_fns[k]); |
136 | phy->port_events[k].phy = phy; | ||
137 | } | ||
138 | |||
139 | for (k = 0; k < PHY_NUM_EVENTS; k++) { | ||
140 | INIT_WORK(&phy->phy_events[k].work, | ||
141 | sas_phy_event_fns[k]); | ||
142 | phy->phy_events[k].phy = phy; | ||
143 | } | ||
128 | 144 | ||
129 | for (k = 0; k < PHY_NUM_EVENTS; k++) | ||
130 | INIT_WORK(&phy->phy_events[k], sas_phy_event_fns[k], | ||
131 | phy); | ||
132 | phy->port = NULL; | 145 | phy->port = NULL; |
133 | phy->ha = sas_ha; | 146 | phy->ha = sas_ha; |
134 | spin_lock_init(&phy->frame_rcvd_lock); | 147 | spin_lock_init(&phy->frame_rcvd_lock); |
diff --git a/drivers/scsi/libsas/sas_port.c b/drivers/scsi/libsas/sas_port.c index 253cdcf306a2..971c37ceecb4 100644 --- a/drivers/scsi/libsas/sas_port.c +++ b/drivers/scsi/libsas/sas_port.c | |||
@@ -181,9 +181,11 @@ void sas_deform_port(struct asd_sas_phy *phy) | |||
181 | 181 | ||
182 | /* ---------- SAS port events ---------- */ | 182 | /* ---------- SAS port events ---------- */ |
183 | 183 | ||
184 | void sas_porte_bytes_dmaed(void *data) | 184 | void sas_porte_bytes_dmaed(struct work_struct *work) |
185 | { | 185 | { |
186 | struct asd_sas_phy *phy = data; | 186 | struct asd_sas_event *ev = |
187 | container_of(work, struct asd_sas_event, work); | ||
188 | struct asd_sas_phy *phy = ev->phy; | ||
187 | 189 | ||
188 | sas_begin_event(PORTE_BYTES_DMAED, &phy->ha->event_lock, | 190 | sas_begin_event(PORTE_BYTES_DMAED, &phy->ha->event_lock, |
189 | &phy->port_events_pending); | 191 | &phy->port_events_pending); |
@@ -191,11 +193,13 @@ void sas_porte_bytes_dmaed(void *data) | |||
191 | sas_form_port(phy); | 193 | sas_form_port(phy); |
192 | } | 194 | } |
193 | 195 | ||
194 | void sas_porte_broadcast_rcvd(void *data) | 196 | void sas_porte_broadcast_rcvd(struct work_struct *work) |
195 | { | 197 | { |
198 | struct asd_sas_event *ev = | ||
199 | container_of(work, struct asd_sas_event, work); | ||
200 | struct asd_sas_phy *phy = ev->phy; | ||
196 | unsigned long flags; | 201 | unsigned long flags; |
197 | u32 prim; | 202 | u32 prim; |
198 | struct asd_sas_phy *phy = data; | ||
199 | 203 | ||
200 | sas_begin_event(PORTE_BROADCAST_RCVD, &phy->ha->event_lock, | 204 | sas_begin_event(PORTE_BROADCAST_RCVD, &phy->ha->event_lock, |
201 | &phy->port_events_pending); | 205 | &phy->port_events_pending); |
@@ -208,9 +212,11 @@ void sas_porte_broadcast_rcvd(void *data) | |||
208 | sas_discover_event(phy->port, DISCE_REVALIDATE_DOMAIN); | 212 | sas_discover_event(phy->port, DISCE_REVALIDATE_DOMAIN); |
209 | } | 213 | } |
210 | 214 | ||
211 | void sas_porte_link_reset_err(void *data) | 215 | void sas_porte_link_reset_err(struct work_struct *work) |
212 | { | 216 | { |
213 | struct asd_sas_phy *phy = data; | 217 | struct asd_sas_event *ev = |
218 | container_of(work, struct asd_sas_event, work); | ||
219 | struct asd_sas_phy *phy = ev->phy; | ||
214 | 220 | ||
215 | sas_begin_event(PORTE_LINK_RESET_ERR, &phy->ha->event_lock, | 221 | sas_begin_event(PORTE_LINK_RESET_ERR, &phy->ha->event_lock, |
216 | &phy->port_events_pending); | 222 | &phy->port_events_pending); |
@@ -218,9 +224,11 @@ void sas_porte_link_reset_err(void *data) | |||
218 | sas_deform_port(phy); | 224 | sas_deform_port(phy); |
219 | } | 225 | } |
220 | 226 | ||
221 | void sas_porte_timer_event(void *data) | 227 | void sas_porte_timer_event(struct work_struct *work) |
222 | { | 228 | { |
223 | struct asd_sas_phy *phy = data; | 229 | struct asd_sas_event *ev = |
230 | container_of(work, struct asd_sas_event, work); | ||
231 | struct asd_sas_phy *phy = ev->phy; | ||
224 | 232 | ||
225 | sas_begin_event(PORTE_TIMER_EVENT, &phy->ha->event_lock, | 233 | sas_begin_event(PORTE_TIMER_EVENT, &phy->ha->event_lock, |
226 | &phy->port_events_pending); | 234 | &phy->port_events_pending); |
@@ -228,9 +236,11 @@ void sas_porte_timer_event(void *data) | |||
228 | sas_deform_port(phy); | 236 | sas_deform_port(phy); |
229 | } | 237 | } |
230 | 238 | ||
231 | void sas_porte_hard_reset(void *data) | 239 | void sas_porte_hard_reset(struct work_struct *work) |
232 | { | 240 | { |
233 | struct asd_sas_phy *phy = data; | 241 | struct asd_sas_event *ev = |
242 | container_of(work, struct asd_sas_event, work); | ||
243 | struct asd_sas_phy *phy = ev->phy; | ||
234 | 244 | ||
235 | sas_begin_event(PORTE_HARD_RESET, &phy->ha->event_lock, | 245 | sas_begin_event(PORTE_HARD_RESET, &phy->ha->event_lock, |
236 | &phy->port_events_pending); | 246 | &phy->port_events_pending); |
diff --git a/drivers/scsi/libsas/sas_scsi_host.c b/drivers/scsi/libsas/sas_scsi_host.c index e064aac06b90..22672d54aa27 100644 --- a/drivers/scsi/libsas/sas_scsi_host.c +++ b/drivers/scsi/libsas/sas_scsi_host.c | |||
@@ -846,8 +846,10 @@ static int do_sas_task_abort(struct sas_task *task) | |||
846 | return -EAGAIN; | 846 | return -EAGAIN; |
847 | } | 847 | } |
848 | 848 | ||
849 | void sas_task_abort(struct sas_task *task) | 849 | void sas_task_abort(struct work_struct *work) |
850 | { | 850 | { |
851 | struct sas_task *task = | ||
852 | container_of(work, struct sas_task, abort_work); | ||
851 | int i; | 853 | int i; |
852 | 854 | ||
853 | for (i = 0; i < 5; i++) | 855 | for (i = 0; i < 5; i++) |
diff --git a/drivers/scsi/ppa.c b/drivers/scsi/ppa.c index 89a2a9f11e41..584ba4d6e038 100644 --- a/drivers/scsi/ppa.c +++ b/drivers/scsi/ppa.c | |||
@@ -31,7 +31,7 @@ typedef struct { | |||
31 | int base; /* Actual port address */ | 31 | int base; /* Actual port address */ |
32 | int mode; /* Transfer mode */ | 32 | int mode; /* Transfer mode */ |
33 | struct scsi_cmnd *cur_cmd; /* Current queued command */ | 33 | struct scsi_cmnd *cur_cmd; /* Current queued command */ |
34 | struct work_struct ppa_tq; /* Polling interrupt stuff */ | 34 | struct delayed_work ppa_tq; /* Polling interrupt stuff */ |
35 | unsigned long jstart; /* Jiffies at start */ | 35 | unsigned long jstart; /* Jiffies at start */ |
36 | unsigned long recon_tmo; /* How many usecs to wait for reconnection (6th bit) */ | 36 | unsigned long recon_tmo; /* How many usecs to wait for reconnection (6th bit) */ |
37 | unsigned int failed:1; /* Failure flag */ | 37 | unsigned int failed:1; /* Failure flag */ |
@@ -627,9 +627,9 @@ static int ppa_completion(struct scsi_cmnd *cmd) | |||
627 | * the scheduler's task queue to generate a stream of call-backs and | 627 | * the scheduler's task queue to generate a stream of call-backs and |
628 | * complete the request when the drive is ready. | 628 | * complete the request when the drive is ready. |
629 | */ | 629 | */ |
630 | static void ppa_interrupt(void *data) | 630 | static void ppa_interrupt(struct work_struct *work) |
631 | { | 631 | { |
632 | ppa_struct *dev = (ppa_struct *) data; | 632 | ppa_struct *dev = container_of(work, ppa_struct, ppa_tq.work); |
633 | struct scsi_cmnd *cmd = dev->cur_cmd; | 633 | struct scsi_cmnd *cmd = dev->cur_cmd; |
634 | 634 | ||
635 | if (!cmd) { | 635 | if (!cmd) { |
@@ -637,7 +637,6 @@ static void ppa_interrupt(void *data) | |||
637 | return; | 637 | return; |
638 | } | 638 | } |
639 | if (ppa_engine(dev, cmd)) { | 639 | if (ppa_engine(dev, cmd)) { |
640 | dev->ppa_tq.data = (void *) dev; | ||
641 | schedule_delayed_work(&dev->ppa_tq, 1); | 640 | schedule_delayed_work(&dev->ppa_tq, 1); |
642 | return; | 641 | return; |
643 | } | 642 | } |
@@ -822,8 +821,7 @@ static int ppa_queuecommand(struct scsi_cmnd *cmd, | |||
822 | cmd->result = DID_ERROR << 16; /* default return code */ | 821 | cmd->result = DID_ERROR << 16; /* default return code */ |
823 | cmd->SCp.phase = 0; /* bus free */ | 822 | cmd->SCp.phase = 0; /* bus free */ |
824 | 823 | ||
825 | dev->ppa_tq.data = dev; | 824 | schedule_delayed_work(&dev->ppa_tq, 0); |
826 | schedule_work(&dev->ppa_tq); | ||
827 | 825 | ||
828 | ppa_pb_claim(dev); | 826 | ppa_pb_claim(dev); |
829 | 827 | ||
@@ -1086,7 +1084,7 @@ static int __ppa_attach(struct parport *pb) | |||
1086 | else | 1084 | else |
1087 | ports = 8; | 1085 | ports = 8; |
1088 | 1086 | ||
1089 | INIT_WORK(&dev->ppa_tq, ppa_interrupt, dev); | 1087 | INIT_DELAYED_WORK(&dev->ppa_tq, ppa_interrupt); |
1090 | 1088 | ||
1091 | err = -ENOMEM; | 1089 | err = -ENOMEM; |
1092 | host = scsi_host_alloc(&ppa_template, sizeof(ppa_struct *)); | 1090 | host = scsi_host_alloc(&ppa_template, sizeof(ppa_struct *)); |
diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c index db9d88e7bee7..969c9e431028 100644 --- a/drivers/scsi/qla4xxx/ql4_os.c +++ b/drivers/scsi/qla4xxx/ql4_os.c | |||
@@ -961,9 +961,10 @@ static int qla4xxx_recover_adapter(struct scsi_qla_host *ha, | |||
961 | * the mid-level tries to sleep when it reaches the driver threshold | 961 | * the mid-level tries to sleep when it reaches the driver threshold |
962 | * "host->can_queue". This can cause a panic if we were in our interrupt code. | 962 | * "host->can_queue". This can cause a panic if we were in our interrupt code. |
963 | **/ | 963 | **/ |
964 | static void qla4xxx_do_dpc(void *data) | 964 | static void qla4xxx_do_dpc(struct work_struct *work) |
965 | { | 965 | { |
966 | struct scsi_qla_host *ha = (struct scsi_qla_host *) data; | 966 | struct scsi_qla_host *ha = |
967 | container_of(work, struct scsi_qla_host, dpc_work); | ||
967 | struct ddb_entry *ddb_entry, *dtemp; | 968 | struct ddb_entry *ddb_entry, *dtemp; |
968 | 969 | ||
969 | DEBUG2(printk("scsi%ld: %s: DPC handler waking up." | 970 | DEBUG2(printk("scsi%ld: %s: DPC handler waking up." |
@@ -1253,7 +1254,7 @@ static int __devinit qla4xxx_probe_adapter(struct pci_dev *pdev, | |||
1253 | ret = -ENODEV; | 1254 | ret = -ENODEV; |
1254 | goto probe_failed; | 1255 | goto probe_failed; |
1255 | } | 1256 | } |
1256 | INIT_WORK(&ha->dpc_work, qla4xxx_do_dpc, ha); | 1257 | INIT_WORK(&ha->dpc_work, qla4xxx_do_dpc); |
1257 | 1258 | ||
1258 | ret = request_irq(pdev->irq, qla4xxx_intr_handler, | 1259 | ret = request_irq(pdev->irq, qla4xxx_intr_handler, |
1259 | SA_INTERRUPT|SA_SHIRQ, "qla4xxx", ha); | 1260 | SA_INTERRUPT|SA_SHIRQ, "qla4xxx", ha); |
diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c index 4d656148bd67..14e635aa44ce 100644 --- a/drivers/scsi/scsi_scan.c +++ b/drivers/scsi/scsi_scan.c | |||
@@ -437,9 +437,10 @@ static struct scsi_target *scsi_alloc_target(struct device *parent, | |||
437 | goto retry; | 437 | goto retry; |
438 | } | 438 | } |
439 | 439 | ||
440 | static void scsi_target_reap_usercontext(void *data) | 440 | static void scsi_target_reap_usercontext(struct work_struct *work) |
441 | { | 441 | { |
442 | struct scsi_target *starget = data; | 442 | struct scsi_target *starget = |
443 | container_of(work, struct scsi_target, ew.work); | ||
443 | struct Scsi_Host *shost = dev_to_shost(starget->dev.parent); | 444 | struct Scsi_Host *shost = dev_to_shost(starget->dev.parent); |
444 | unsigned long flags; | 445 | unsigned long flags; |
445 | 446 | ||
@@ -475,7 +476,7 @@ void scsi_target_reap(struct scsi_target *starget) | |||
475 | starget->state = STARGET_DEL; | 476 | starget->state = STARGET_DEL; |
476 | spin_unlock_irqrestore(shost->host_lock, flags); | 477 | spin_unlock_irqrestore(shost->host_lock, flags); |
477 | execute_in_process_context(scsi_target_reap_usercontext, | 478 | execute_in_process_context(scsi_target_reap_usercontext, |
478 | starget, &starget->ew); | 479 | &starget->ew); |
479 | return; | 480 | return; |
480 | 481 | ||
481 | } | 482 | } |
diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c index e1a91665d1c2..259c90cfa367 100644 --- a/drivers/scsi/scsi_sysfs.c +++ b/drivers/scsi/scsi_sysfs.c | |||
@@ -218,16 +218,16 @@ static void scsi_device_cls_release(struct class_device *class_dev) | |||
218 | put_device(&sdev->sdev_gendev); | 218 | put_device(&sdev->sdev_gendev); |
219 | } | 219 | } |
220 | 220 | ||
221 | static void scsi_device_dev_release_usercontext(void *data) | 221 | static void scsi_device_dev_release_usercontext(struct work_struct *work) |
222 | { | 222 | { |
223 | struct device *dev = data; | ||
224 | struct scsi_device *sdev; | 223 | struct scsi_device *sdev; |
225 | struct device *parent; | 224 | struct device *parent; |
226 | struct scsi_target *starget; | 225 | struct scsi_target *starget; |
227 | unsigned long flags; | 226 | unsigned long flags; |
228 | 227 | ||
229 | parent = dev->parent; | 228 | sdev = container_of(work, struct scsi_device, ew.work); |
230 | sdev = to_scsi_device(dev); | 229 | |
230 | parent = sdev->sdev_gendev.parent; | ||
231 | starget = to_scsi_target(parent); | 231 | starget = to_scsi_target(parent); |
232 | 232 | ||
233 | spin_lock_irqsave(sdev->host->host_lock, flags); | 233 | spin_lock_irqsave(sdev->host->host_lock, flags); |
@@ -258,7 +258,7 @@ static void scsi_device_dev_release_usercontext(void *data) | |||
258 | static void scsi_device_dev_release(struct device *dev) | 258 | static void scsi_device_dev_release(struct device *dev) |
259 | { | 259 | { |
260 | struct scsi_device *sdp = to_scsi_device(dev); | 260 | struct scsi_device *sdp = to_scsi_device(dev); |
261 | execute_in_process_context(scsi_device_dev_release_usercontext, dev, | 261 | execute_in_process_context(scsi_device_dev_release_usercontext, |
262 | &sdp->ew); | 262 | &sdp->ew); |
263 | } | 263 | } |
264 | 264 | ||
diff --git a/drivers/scsi/scsi_tgt_lib.c b/drivers/scsi/scsi_tgt_lib.c index 39da5cd6fb6f..386dbae17b44 100644 --- a/drivers/scsi/scsi_tgt_lib.c +++ b/drivers/scsi/scsi_tgt_lib.c | |||
@@ -185,10 +185,11 @@ static void cmd_hashlist_del(struct scsi_cmnd *cmd) | |||
185 | spin_unlock_irqrestore(&qdata->cmd_hash_lock, flags); | 185 | spin_unlock_irqrestore(&qdata->cmd_hash_lock, flags); |
186 | } | 186 | } |
187 | 187 | ||
188 | static void scsi_tgt_cmd_destroy(void *data) | 188 | static void scsi_tgt_cmd_destroy(struct work_struct *work) |
189 | { | 189 | { |
190 | struct scsi_cmnd *cmd = data; | 190 | struct scsi_tgt_cmd *tcmd = |
191 | struct scsi_tgt_cmd *tcmd = cmd->request->end_io_data; | 191 | container_of(work, struct scsi_tgt_cmd, work); |
192 | struct scsi_cmnd *cmd = tcmd->rq->special; | ||
192 | 193 | ||
193 | dprintk("cmd %p %d %lu\n", cmd, cmd->sc_data_direction, | 194 | dprintk("cmd %p %d %lu\n", cmd, cmd->sc_data_direction, |
194 | rq_data_dir(cmd->request)); | 195 | rq_data_dir(cmd->request)); |
@@ -214,6 +215,7 @@ static void init_scsi_tgt_cmd(struct request *rq, struct scsi_tgt_cmd *tcmd, | |||
214 | struct list_head *head; | 215 | struct list_head *head; |
215 | 216 | ||
216 | tcmd->tag = tag; | 217 | tcmd->tag = tag; |
218 | INIT_WORK(&tcmd->work, scsi_tgt_cmd_destroy); | ||
217 | spin_lock_irqsave(&qdata->cmd_hash_lock, flags); | 219 | spin_lock_irqsave(&qdata->cmd_hash_lock, flags); |
218 | head = &qdata->cmd_hash[cmd_hashfn(tag)]; | 220 | head = &qdata->cmd_hash[cmd_hashfn(tag)]; |
219 | list_add(&tcmd->hash_list, head); | 221 | list_add(&tcmd->hash_list, head); |
@@ -303,7 +305,7 @@ void scsi_tgt_free_queue(struct Scsi_Host *shost) | |||
303 | cmd = tcmd->rq->special; | 305 | cmd = tcmd->rq->special; |
304 | 306 | ||
305 | shost->hostt->eh_abort_handler(cmd); | 307 | shost->hostt->eh_abort_handler(cmd); |
306 | scsi_tgt_cmd_destroy(cmd); | 308 | scsi_tgt_cmd_destroy(&tcmd->work); |
307 | } | 309 | } |
308 | } | 310 | } |
309 | EXPORT_SYMBOL_GPL(scsi_tgt_free_queue); | 311 | EXPORT_SYMBOL_GPL(scsi_tgt_free_queue); |
@@ -347,7 +349,6 @@ static void scsi_tgt_cmd_done(struct scsi_cmnd *cmd) | |||
347 | dprintk("cmd %p %lu\n", cmd, rq_data_dir(cmd->request)); | 349 | dprintk("cmd %p %lu\n", cmd, rq_data_dir(cmd->request)); |
348 | 350 | ||
349 | scsi_tgt_uspace_send_status(cmd, tcmd->tag); | 351 | scsi_tgt_uspace_send_status(cmd, tcmd->tag); |
350 | INIT_WORK(&tcmd->work, scsi_tgt_cmd_destroy, cmd); | ||
351 | queue_work(scsi_tgtd, &tcmd->work); | 352 | queue_work(scsi_tgtd, &tcmd->work); |
352 | } | 353 | } |
353 | 354 | ||
@@ -549,13 +550,15 @@ static int scsi_tgt_copy_sense(struct scsi_cmnd *cmd, unsigned long uaddr, | |||
549 | 550 | ||
550 | static int scsi_tgt_abort_cmd(struct Scsi_Host *shost, struct scsi_cmnd *cmd) | 551 | static int scsi_tgt_abort_cmd(struct Scsi_Host *shost, struct scsi_cmnd *cmd) |
551 | { | 552 | { |
553 | struct scsi_tgt_cmd *tcmd; | ||
552 | int err; | 554 | int err; |
553 | 555 | ||
554 | err = shost->hostt->eh_abort_handler(cmd); | 556 | err = shost->hostt->eh_abort_handler(cmd); |
555 | if (err) | 557 | if (err) |
556 | eprintk("fail to abort %p\n", cmd); | 558 | eprintk("fail to abort %p\n", cmd); |
557 | 559 | ||
558 | scsi_tgt_cmd_destroy(cmd); | 560 | tcmd = cmd->request->end_io_data; |
561 | scsi_tgt_cmd_destroy(&tcmd->work); | ||
559 | return err; | 562 | return err; |
560 | } | 563 | } |
561 | 564 | ||
diff --git a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c index 38c215a78f69..3571ce8934e7 100644 --- a/drivers/scsi/scsi_transport_fc.c +++ b/drivers/scsi/scsi_transport_fc.c | |||
@@ -241,9 +241,9 @@ fc_bitfield_name_search(remote_port_roles, fc_remote_port_role_names) | |||
241 | #define FC_MGMTSRVR_PORTID 0x00000a | 241 | #define FC_MGMTSRVR_PORTID 0x00000a |
242 | 242 | ||
243 | 243 | ||
244 | static void fc_timeout_deleted_rport(void *data); | 244 | static void fc_timeout_deleted_rport(struct work_struct *work); |
245 | static void fc_timeout_fail_rport_io(void *data); | 245 | static void fc_timeout_fail_rport_io(struct work_struct *work); |
246 | static void fc_scsi_scan_rport(void *data); | 246 | static void fc_scsi_scan_rport(struct work_struct *work); |
247 | 247 | ||
248 | /* | 248 | /* |
249 | * Attribute counts pre object type... | 249 | * Attribute counts pre object type... |
@@ -1613,7 +1613,7 @@ fc_flush_work(struct Scsi_Host *shost) | |||
1613 | * 1 on success / 0 already queued / < 0 for error | 1613 | * 1 on success / 0 already queued / < 0 for error |
1614 | **/ | 1614 | **/ |
1615 | static int | 1615 | static int |
1616 | fc_queue_devloss_work(struct Scsi_Host *shost, struct work_struct *work, | 1616 | fc_queue_devloss_work(struct Scsi_Host *shost, struct delayed_work *work, |
1617 | unsigned long delay) | 1617 | unsigned long delay) |
1618 | { | 1618 | { |
1619 | if (unlikely(!fc_host_devloss_work_q(shost))) { | 1619 | if (unlikely(!fc_host_devloss_work_q(shost))) { |
@@ -1625,9 +1625,6 @@ fc_queue_devloss_work(struct Scsi_Host *shost, struct work_struct *work, | |||
1625 | return -EINVAL; | 1625 | return -EINVAL; |
1626 | } | 1626 | } |
1627 | 1627 | ||
1628 | if (delay == 0) | ||
1629 | return queue_work(fc_host_devloss_work_q(shost), work); | ||
1630 | |||
1631 | return queue_delayed_work(fc_host_devloss_work_q(shost), work, delay); | 1628 | return queue_delayed_work(fc_host_devloss_work_q(shost), work, delay); |
1632 | } | 1629 | } |
1633 | 1630 | ||
@@ -1712,12 +1709,13 @@ EXPORT_SYMBOL(fc_remove_host); | |||
1712 | * fc_starget_delete - called to delete the scsi decendents of an rport | 1709 | * fc_starget_delete - called to delete the scsi decendents of an rport |
1713 | * (target and all sdevs) | 1710 | * (target and all sdevs) |
1714 | * | 1711 | * |
1715 | * @data: remote port to be operated on. | 1712 | * @work: remote port to be operated on. |
1716 | **/ | 1713 | **/ |
1717 | static void | 1714 | static void |
1718 | fc_starget_delete(void *data) | 1715 | fc_starget_delete(struct work_struct *work) |
1719 | { | 1716 | { |
1720 | struct fc_rport *rport = (struct fc_rport *)data; | 1717 | struct fc_rport *rport = |
1718 | container_of(work, struct fc_rport, stgt_delete_work); | ||
1721 | struct Scsi_Host *shost = rport_to_shost(rport); | 1719 | struct Scsi_Host *shost = rport_to_shost(rport); |
1722 | unsigned long flags; | 1720 | unsigned long flags; |
1723 | struct fc_internal *i = to_fc_internal(shost->transportt); | 1721 | struct fc_internal *i = to_fc_internal(shost->transportt); |
@@ -1751,12 +1749,13 @@ fc_starget_delete(void *data) | |||
1751 | /** | 1749 | /** |
1752 | * fc_rport_final_delete - finish rport termination and delete it. | 1750 | * fc_rport_final_delete - finish rport termination and delete it. |
1753 | * | 1751 | * |
1754 | * @data: remote port to be deleted. | 1752 | * @work: remote port to be deleted. |
1755 | **/ | 1753 | **/ |
1756 | static void | 1754 | static void |
1757 | fc_rport_final_delete(void *data) | 1755 | fc_rport_final_delete(struct work_struct *work) |
1758 | { | 1756 | { |
1759 | struct fc_rport *rport = (struct fc_rport *)data; | 1757 | struct fc_rport *rport = |
1758 | container_of(work, struct fc_rport, rport_delete_work); | ||
1760 | struct device *dev = &rport->dev; | 1759 | struct device *dev = &rport->dev; |
1761 | struct Scsi_Host *shost = rport_to_shost(rport); | 1760 | struct Scsi_Host *shost = rport_to_shost(rport); |
1762 | struct fc_internal *i = to_fc_internal(shost->transportt); | 1761 | struct fc_internal *i = to_fc_internal(shost->transportt); |
@@ -1770,7 +1769,7 @@ fc_rport_final_delete(void *data) | |||
1770 | 1769 | ||
1771 | /* Delete SCSI target and sdevs */ | 1770 | /* Delete SCSI target and sdevs */ |
1772 | if (rport->scsi_target_id != -1) | 1771 | if (rport->scsi_target_id != -1) |
1773 | fc_starget_delete(data); | 1772 | fc_starget_delete(&rport->stgt_delete_work); |
1774 | else if (i->f->dev_loss_tmo_callbk) | 1773 | else if (i->f->dev_loss_tmo_callbk) |
1775 | i->f->dev_loss_tmo_callbk(rport); | 1774 | i->f->dev_loss_tmo_callbk(rport); |
1776 | else if (i->f->terminate_rport_io) | 1775 | else if (i->f->terminate_rport_io) |
@@ -1829,11 +1828,11 @@ fc_rport_create(struct Scsi_Host *shost, int channel, | |||
1829 | rport->channel = channel; | 1828 | rport->channel = channel; |
1830 | rport->fast_io_fail_tmo = -1; | 1829 | rport->fast_io_fail_tmo = -1; |
1831 | 1830 | ||
1832 | INIT_WORK(&rport->dev_loss_work, fc_timeout_deleted_rport, rport); | 1831 | INIT_DELAYED_WORK(&rport->dev_loss_work, fc_timeout_deleted_rport); |
1833 | INIT_WORK(&rport->fail_io_work, fc_timeout_fail_rport_io, rport); | 1832 | INIT_DELAYED_WORK(&rport->fail_io_work, fc_timeout_fail_rport_io); |
1834 | INIT_WORK(&rport->scan_work, fc_scsi_scan_rport, rport); | 1833 | INIT_WORK(&rport->scan_work, fc_scsi_scan_rport); |
1835 | INIT_WORK(&rport->stgt_delete_work, fc_starget_delete, rport); | 1834 | INIT_WORK(&rport->stgt_delete_work, fc_starget_delete); |
1836 | INIT_WORK(&rport->rport_delete_work, fc_rport_final_delete, rport); | 1835 | INIT_WORK(&rport->rport_delete_work, fc_rport_final_delete); |
1837 | 1836 | ||
1838 | spin_lock_irqsave(shost->host_lock, flags); | 1837 | spin_lock_irqsave(shost->host_lock, flags); |
1839 | 1838 | ||
@@ -1963,7 +1962,7 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel, | |||
1963 | } | 1962 | } |
1964 | 1963 | ||
1965 | if (match) { | 1964 | if (match) { |
1966 | struct work_struct *work = | 1965 | struct delayed_work *work = |
1967 | &rport->dev_loss_work; | 1966 | &rport->dev_loss_work; |
1968 | 1967 | ||
1969 | memcpy(&rport->node_name, &ids->node_name, | 1968 | memcpy(&rport->node_name, &ids->node_name, |
@@ -2267,12 +2266,13 @@ EXPORT_SYMBOL(fc_remote_port_rolechg); | |||
2267 | * was a SCSI target (thus was blocked), and failed | 2266 | * was a SCSI target (thus was blocked), and failed |
2268 | * to return in the alloted time. | 2267 | * to return in the alloted time. |
2269 | * | 2268 | * |
2270 | * @data: rport target that failed to reappear in the alloted time. | 2269 | * @work: rport target that failed to reappear in the alloted time. |
2271 | **/ | 2270 | **/ |
2272 | static void | 2271 | static void |
2273 | fc_timeout_deleted_rport(void *data) | 2272 | fc_timeout_deleted_rport(struct work_struct *work) |
2274 | { | 2273 | { |
2275 | struct fc_rport *rport = (struct fc_rport *)data; | 2274 | struct fc_rport *rport = |
2275 | container_of(work, struct fc_rport, dev_loss_work.work); | ||
2276 | struct Scsi_Host *shost = rport_to_shost(rport); | 2276 | struct Scsi_Host *shost = rport_to_shost(rport); |
2277 | struct fc_host_attrs *fc_host = shost_to_fc_host(shost); | 2277 | struct fc_host_attrs *fc_host = shost_to_fc_host(shost); |
2278 | unsigned long flags; | 2278 | unsigned long flags; |
@@ -2366,15 +2366,16 @@ fc_timeout_deleted_rport(void *data) | |||
2366 | * fc_timeout_fail_rport_io - Timeout handler for a fast io failing on a | 2366 | * fc_timeout_fail_rport_io - Timeout handler for a fast io failing on a |
2367 | * disconnected SCSI target. | 2367 | * disconnected SCSI target. |
2368 | * | 2368 | * |
2369 | * @data: rport to terminate io on. | 2369 | * @work: rport to terminate io on. |
2370 | * | 2370 | * |
2371 | * Notes: Only requests the failure of the io, not that all are flushed | 2371 | * Notes: Only requests the failure of the io, not that all are flushed |
2372 | * prior to returning. | 2372 | * prior to returning. |
2373 | **/ | 2373 | **/ |
2374 | static void | 2374 | static void |
2375 | fc_timeout_fail_rport_io(void *data) | 2375 | fc_timeout_fail_rport_io(struct work_struct *work) |
2376 | { | 2376 | { |
2377 | struct fc_rport *rport = (struct fc_rport *)data; | 2377 | struct fc_rport *rport = |
2378 | container_of(work, struct fc_rport, fail_io_work.work); | ||
2378 | struct Scsi_Host *shost = rport_to_shost(rport); | 2379 | struct Scsi_Host *shost = rport_to_shost(rport); |
2379 | struct fc_internal *i = to_fc_internal(shost->transportt); | 2380 | struct fc_internal *i = to_fc_internal(shost->transportt); |
2380 | 2381 | ||
@@ -2387,12 +2388,13 @@ fc_timeout_fail_rport_io(void *data) | |||
2387 | /** | 2388 | /** |
2388 | * fc_scsi_scan_rport - called to perform a scsi scan on a remote port. | 2389 | * fc_scsi_scan_rport - called to perform a scsi scan on a remote port. |
2389 | * | 2390 | * |
2390 | * @data: remote port to be scanned. | 2391 | * @work: remote port to be scanned. |
2391 | **/ | 2392 | **/ |
2392 | static void | 2393 | static void |
2393 | fc_scsi_scan_rport(void *data) | 2394 | fc_scsi_scan_rport(struct work_struct *work) |
2394 | { | 2395 | { |
2395 | struct fc_rport *rport = (struct fc_rport *)data; | 2396 | struct fc_rport *rport = |
2397 | container_of(work, struct fc_rport, scan_work); | ||
2396 | struct Scsi_Host *shost = rport_to_shost(rport); | 2398 | struct Scsi_Host *shost = rport_to_shost(rport); |
2397 | unsigned long flags; | 2399 | unsigned long flags; |
2398 | 2400 | ||
diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c index 9b25124a989e..9c22f1342715 100644 --- a/drivers/scsi/scsi_transport_iscsi.c +++ b/drivers/scsi/scsi_transport_iscsi.c | |||
@@ -234,9 +234,11 @@ static int iscsi_user_scan(struct Scsi_Host *shost, uint channel, | |||
234 | return 0; | 234 | return 0; |
235 | } | 235 | } |
236 | 236 | ||
237 | static void session_recovery_timedout(void *data) | 237 | static void session_recovery_timedout(struct work_struct *work) |
238 | { | 238 | { |
239 | struct iscsi_cls_session *session = data; | 239 | struct iscsi_cls_session *session = |
240 | container_of(work, struct iscsi_cls_session, | ||
241 | recovery_work.work); | ||
240 | 242 | ||
241 | dev_printk(KERN_INFO, &session->dev, "iscsi: session recovery timed " | 243 | dev_printk(KERN_INFO, &session->dev, "iscsi: session recovery timed " |
242 | "out after %d secs\n", session->recovery_tmo); | 244 | "out after %d secs\n", session->recovery_tmo); |
@@ -276,7 +278,7 @@ iscsi_alloc_session(struct Scsi_Host *shost, | |||
276 | 278 | ||
277 | session->transport = transport; | 279 | session->transport = transport; |
278 | session->recovery_tmo = 120; | 280 | session->recovery_tmo = 120; |
279 | INIT_WORK(&session->recovery_work, session_recovery_timedout, session); | 281 | INIT_DELAYED_WORK(&session->recovery_work, session_recovery_timedout); |
280 | INIT_LIST_HEAD(&session->host_list); | 282 | INIT_LIST_HEAD(&session->host_list); |
281 | INIT_LIST_HEAD(&session->sess_list); | 283 | INIT_LIST_HEAD(&session->sess_list); |
282 | 284 | ||
diff --git a/drivers/scsi/scsi_transport_spi.c b/drivers/scsi/scsi_transport_spi.c index 9f070f0d0f2b..3fded4831460 100644 --- a/drivers/scsi/scsi_transport_spi.c +++ b/drivers/scsi/scsi_transport_spi.c | |||
@@ -964,9 +964,10 @@ struct work_queue_wrapper { | |||
964 | }; | 964 | }; |
965 | 965 | ||
966 | static void | 966 | static void |
967 | spi_dv_device_work_wrapper(void *data) | 967 | spi_dv_device_work_wrapper(struct work_struct *work) |
968 | { | 968 | { |
969 | struct work_queue_wrapper *wqw = (struct work_queue_wrapper *)data; | 969 | struct work_queue_wrapper *wqw = |
970 | container_of(work, struct work_queue_wrapper, work); | ||
970 | struct scsi_device *sdev = wqw->sdev; | 971 | struct scsi_device *sdev = wqw->sdev; |
971 | 972 | ||
972 | kfree(wqw); | 973 | kfree(wqw); |
@@ -1006,7 +1007,7 @@ spi_schedule_dv_device(struct scsi_device *sdev) | |||
1006 | return; | 1007 | return; |
1007 | } | 1008 | } |
1008 | 1009 | ||
1009 | INIT_WORK(&wqw->work, spi_dv_device_work_wrapper, wqw); | 1010 | INIT_WORK(&wqw->work, spi_dv_device_work_wrapper); |
1010 | wqw->sdev = sdev; | 1011 | wqw->sdev = sdev; |
1011 | 1012 | ||
1012 | schedule_work(&wqw->work); | 1013 | schedule_work(&wqw->work); |