From 2fdb611d3102509e31ef21c79fc91f97f300b9c3 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Wed, 6 Dec 2006 21:15:22 +0000 Subject: [PATCH] [PATCH] ... and then some more work_struct-induced breakage (ibmvscsi) Signed-off-by: Al Viro Signed-off-by: Linus Torvalds --- drivers/scsi/ibmvscsi/ibmvstgt.c | 10 ++++++---- 1 file 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 { unsigned long liobn; unsigned long riobn; + struct srp_target *target; }; static struct workqueue_struct *vtgtd; @@ -685,10 +686,10 @@ static inline struct viosrp_crq *next_crq(struct crq_queue *queue) return crq; } -static void handle_crq(void *data) +static void handle_crq(struct work_struct *work) { - struct srp_target *target = (struct srp_target *) data; - struct vio_port *vport = target_to_port(target); + struct vio_port *vport = container_of(work, struct vio_port, crq_work); + struct srp_target *target = vport->target; struct viosrp_crq *crq; int done = 0; @@ -822,6 +823,7 @@ static int ibmvstgt_probe(struct vio_dev *dev, const struct vio_device_id *id) target->shost = shost; vport->dma_dev = dev; target->ldata = vport; + vport->target = target; err = srp_target_alloc(target, &dev->dev, INITIAL_SRP_LIMIT, SRP_MAX_IU_LEN); if (err) @@ -837,7 +839,7 @@ static int ibmvstgt_probe(struct vio_dev *dev, const struct vio_device_id *id) vport->liobn = dma[0]; vport->riobn = dma[5]; - INIT_WORK(&vport->crq_work, handle_crq, target); + INIT_WORK(&vport->crq_work, handle_crq); err = crq_queue_create(&vport->crq_queue, target); if (err) -- 2.39.5