[PATCH] ... and then some more work_struct-induced breakage (ibmvscsi)
authorAl Viro <viro@ftp.linux.org.uk>
Wed, 6 Dec 2006 21:15:22 +0000 (21:15 +0000)
committerLinus Torvalds <torvalds@woody.osdl.org>
Wed, 6 Dec 2006 22:51:14 +0000 (14:51 -0800)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
drivers/scsi/ibmvscsi/ibmvstgt.c

index 0e74174a1b371a1737e8742ce48387fc3ab180dd..e28260f05d6be7fa511824d9cf6815ec0d280b11 100644 (file)
@@ -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)