[S390] css: move io_private to drv_data
authorSebastian Ott <sebott@linux.vnet.ibm.com>
Tue, 15 Mar 2011 16:08:27 +0000 (17:08 +0100)
committerMartin Schwidefsky <sky@mschwide.boeblingen.de.ibm.com>
Tue, 15 Mar 2011 16:08:23 +0000 (17:08 +0100)
Use the subchannels drv_data to access io_subchannel_private
for io subchannels.

Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
drivers/s390/cio/device.c
drivers/s390/cio/io_sch.h

index b7eaff9..7582a1e 100644 (file)
@@ -1030,6 +1030,7 @@ static void io_subchannel_init_fields(struct subchannel *sch)
  */
 static int io_subchannel_probe(struct subchannel *sch)
 {
+       struct io_subchannel_private *io_priv;
        struct ccw_device *cdev;
        int rc;
 
@@ -1073,10 +1074,11 @@ static int io_subchannel_probe(struct subchannel *sch)
        if (rc)
                goto out_schedule;
        /* Allocate I/O subchannel private data. */
-       sch->private = kzalloc(sizeof(struct io_subchannel_private),
-                              GFP_KERNEL | GFP_DMA);
-       if (!sch->private)
+       io_priv = kzalloc(sizeof(*io_priv), GFP_KERNEL | GFP_DMA);
+       if (!io_priv)
                goto out_schedule;
+
+       set_io_private(sch, io_priv);
        css_schedule_eval(sch->schid);
        return 0;
 
@@ -1090,6 +1092,7 @@ out_schedule:
 static int
 io_subchannel_remove (struct subchannel *sch)
 {
+       struct io_subchannel_private *io_priv = to_io_private(sch);
        struct ccw_device *cdev;
 
        cdev = sch_get_cdev(sch);
@@ -1099,11 +1102,12 @@ io_subchannel_remove (struct subchannel *sch)
        /* Set ccw device to not operational and drop reference. */
        spin_lock_irq(cdev->ccwlock);
        sch_set_cdev(sch, NULL);
+       set_io_private(sch, NULL);
        cdev->private->state = DEV_STATE_NOT_OPER;
        spin_unlock_irq(cdev->ccwlock);
        ccw_device_unregister(cdev);
 out_free:
-       kfree(sch->private);
+       kfree(io_priv);
        sysfs_remove_group(&sch->dev.kobj, &io_subchannel_attr_group);
        return 0;
 }
@@ -1553,11 +1557,12 @@ spinlock_t * cio_get_console_lock(void)
 static int ccw_device_console_enable(struct ccw_device *cdev,
                                     struct subchannel *sch)
 {
+       struct io_subchannel_private *io_priv = cio_get_console_priv();
        int rc;
 
        /* Attach subchannel private data. */
-       sch->private = cio_get_console_priv();
-       memset(sch->private, 0, sizeof(struct io_subchannel_private));
+       memset(io_priv, 0, sizeof(*io_priv));
+       set_io_private(sch, io_priv);
        io_subchannel_init_fields(sch);
        rc = cio_commit_config(sch);
        if (rc)
index 23f50ba..ba31ad8 100644 (file)
@@ -18,7 +18,9 @@ struct io_subchannel_private {
        } __packed options;
 } __aligned(8);
 
-#define to_io_private(n) ((struct io_subchannel_private *)n->private)
+#define to_io_private(n) ((struct io_subchannel_private *) \
+                         dev_get_drvdata(&(n)->dev))
+#define set_io_private(n, p) (dev_set_drvdata(&(n)->dev, p))
 
 static inline struct ccw_device *sch_get_cdev(struct subchannel *sch)
 {