diff options
author | Al Viro <viro@ftp.linux.org.uk> | 2006-12-06 16:15:22 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.osdl.org> | 2006-12-06 17:51:14 -0500 |
commit | 2fdb611d3102509e31ef21c79fc91f97f300b9c3 (patch) | |
tree | 715f253eb5a3231fe0691b54a7d9a9b428363470 /drivers/scsi/ibmvscsi/ibmvstgt.c | |
parent | 91c7c56855855d63c46c854c38576135be31a4c9 (diff) |
[PATCH] ... and then some more work_struct-induced breakage (ibmvscsi)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/scsi/ibmvscsi/ibmvstgt.c')
-rw-r--r-- | drivers/scsi/ibmvscsi/ibmvstgt.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/scsi/ibmvscsi/ibmvstgt.c b/drivers/scsi/ibmvscsi/ibmvstgt.c index 0e74174a1b37..e28260f05d6b 100644 --- a/drivers/scsi/ibmvscsi/ibmvstgt.c +++ b/drivers/scsi/ibmvscsi/ibmvstgt.c | |||
@@ -67,6 +67,7 @@ struct vio_port { | |||
67 | 67 | ||
68 | unsigned long liobn; | 68 | unsigned long liobn; |
69 | unsigned long riobn; | 69 | unsigned long riobn; |
70 | struct srp_target *target; | ||
70 | }; | 71 | }; |
71 | 72 | ||
72 | static struct workqueue_struct *vtgtd; | 73 | static struct workqueue_struct *vtgtd; |
@@ -685,10 +686,10 @@ static inline struct viosrp_crq *next_crq(struct crq_queue *queue) | |||
685 | return crq; | 686 | return crq; |
686 | } | 687 | } |
687 | 688 | ||
688 | static void handle_crq(void *data) | 689 | static void handle_crq(struct work_struct *work) |
689 | { | 690 | { |
690 | struct srp_target *target = (struct srp_target *) data; | 691 | struct vio_port *vport = container_of(work, struct vio_port, crq_work); |
691 | struct vio_port *vport = target_to_port(target); | 692 | struct srp_target *target = vport->target; |
692 | struct viosrp_crq *crq; | 693 | struct viosrp_crq *crq; |
693 | int done = 0; | 694 | int done = 0; |
694 | 695 | ||
@@ -822,6 +823,7 @@ static int ibmvstgt_probe(struct vio_dev *dev, const struct vio_device_id *id) | |||
822 | target->shost = shost; | 823 | target->shost = shost; |
823 | vport->dma_dev = dev; | 824 | vport->dma_dev = dev; |
824 | target->ldata = vport; | 825 | target->ldata = vport; |
826 | vport->target = target; | ||
825 | err = srp_target_alloc(target, &dev->dev, INITIAL_SRP_LIMIT, | 827 | err = srp_target_alloc(target, &dev->dev, INITIAL_SRP_LIMIT, |
826 | SRP_MAX_IU_LEN); | 828 | SRP_MAX_IU_LEN); |
827 | if (err) | 829 | if (err) |
@@ -837,7 +839,7 @@ static int ibmvstgt_probe(struct vio_dev *dev, const struct vio_device_id *id) | |||
837 | vport->liobn = dma[0]; | 839 | vport->liobn = dma[0]; |
838 | vport->riobn = dma[5]; | 840 | vport->riobn = dma[5]; |
839 | 841 | ||
840 | INIT_WORK(&vport->crq_work, handle_crq, target); | 842 | INIT_WORK(&vport->crq_work, handle_crq); |
841 | 843 | ||
842 | err = crq_queue_create(&vport->crq_queue, target); | 844 | err = crq_queue_create(&vport->crq_queue, target); |
843 | if (err) | 845 | if (err) |