]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/s390/cio/device.c
[S390] cio: Fix refcount after moving devices.
[linux-2.6-omap-h63xx.git] / drivers / s390 / cio / device.c
index 95b92dfec5a815435630b1e7692591aa2dedad0c..4e4008325e281edc58f11b3a211506b3f8bac35a 100644 (file)
@@ -874,11 +874,15 @@ void ccw_device_move_to_orphanage(struct work_struct *work)
        replacing_cdev = get_disc_ccwdev_by_dev_id(&dev_id, cdev);
        if (replacing_cdev) {
                sch_attach_disconnected_device(sch, replacing_cdev);
+               /* Release reference from get_disc_ccwdev_by_dev_id() */
+               put_device(&cdev->dev);
                return;
        }
        replacing_cdev = get_orphaned_ccwdev_by_dev_id(css, &dev_id);
        if (replacing_cdev) {
                sch_attach_orphaned_device(sch, replacing_cdev);
+               /* Release reference from get_orphaned_ccwdev_by_dev_id() */
+               put_device(&cdev->dev);
                return;
        }
        sch_create_and_recog_new_device(sch);
@@ -1035,8 +1039,11 @@ io_subchannel_recog(struct ccw_device *cdev, struct subchannel *sch)
        init_timer(&priv->timer);
 
        /* Set an initial name for the device. */
-       snprintf (cdev->dev.bus_id, BUS_ID_SIZE, "0.%x.%04x",
-                 sch->schid.ssid, sch->schib.pmcw.dev);
+       if (cio_is_console(sch->schid))
+               cdev->dev.init_name = cio_get_console_cdev_name(sch);
+       else
+               dev_set_name(&cdev->dev, "0.%x.%04x",
+                            sch->schid.ssid, sch->schib.pmcw.dev);
 
        /* Increase counter of devices currently in recognition. */
        atomic_inc(&ccw_device_init_count);
@@ -1526,7 +1533,7 @@ void ccw_device_set_notoper(struct ccw_device *cdev)
        struct subchannel *sch = to_subchannel(cdev->dev.parent);
 
        CIO_TRACE_EVENT(2, "notoper");
-       CIO_TRACE_EVENT(2, sch->dev.bus_id);
+       CIO_TRACE_EVENT(2, dev_name(&sch->dev));
        ccw_device_set_timeout(cdev, 0);
        cio_disable_subchannel(sch);
        cdev->private->state = DEV_STATE_NOT_OPER;
@@ -1625,6 +1632,7 @@ static int io_subchannel_sch_event(struct subchannel *sch, int slow)
 
 #ifdef CONFIG_CCW_CONSOLE
 static struct ccw_device console_cdev;
+static char console_cdev_name[10] = "0.x.xxxx";
 static struct ccw_device_private console_private;
 static int console_cdev_in_use;
 
@@ -1695,6 +1703,14 @@ ccw_device_probe_console(void)
        console_cdev.online = 1;
        return &console_cdev;
 }
+
+
+const char *cio_get_console_cdev_name(struct subchannel *sch)
+{
+       snprintf(console_cdev_name, 10, "0.%x.%04x",
+                sch->schid.ssid, sch->schib.pmcw.dev);
+       return (const char *)console_cdev_name;
+}
 #endif
 
 /*