From dd48f61c89be55bb944d4034938b89b5a86823f2 Mon Sep 17 00:00:00 2001 From: Sebastian Ott Date: Mon, 7 Dec 2009 12:51:34 +0100 Subject: [PATCH] --- yaml --- r: 173245 b: refs/heads/master c: 24a1872d6411c7cce82c0888a4fbea23e993e051 h: refs/heads/master i: 173243: d485a5f5af7efada934152eb7b21456d6f3c14c3 v: v3 --- [refs] | 2 +- trunk/drivers/s390/cio/device.c | 6 ++++++ trunk/drivers/s390/cio/io_sch.h | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 001a6c77518a..5c947b02d774 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 7d253b9a1aaf5192808e641659f4feb122faa536 +refs/heads/master: 24a1872d6411c7cce82c0888a4fbea23e993e051 diff --git a/trunk/drivers/s390/cio/device.c b/trunk/drivers/s390/cio/device.c index f4401ede768a..e8cb99a63cc6 100644 --- a/trunk/drivers/s390/cio/device.c +++ b/trunk/drivers/s390/cio/device.c @@ -304,7 +304,11 @@ int ccw_device_is_orphan(struct ccw_device *cdev) static void ccw_device_unregister(struct ccw_device *cdev) { if (device_is_registered(&cdev->dev)) { + /* Undo device_add(). */ device_del(&cdev->dev); + } + if (cdev->private->flags.initialized) { + cdev->private->flags.initialized = 0; /* Release reference from device_initialize(). */ put_device(&cdev->dev); } @@ -716,6 +720,7 @@ static int io_subchannel_initialize_dev(struct subchannel *sch, put_device(&cdev->dev); return -ENODEV; } + cdev->private->flags.initialized = 1; return 0; } @@ -998,6 +1003,7 @@ static int io_subchannel_probe(struct subchannel *sch) cdev = sch_get_cdev(sch); cdev->dev.groups = ccwdev_attr_groups; device_initialize(&cdev->dev); + cdev->private->flags.initialized = 1; ccw_device_register(cdev); /* * Check if the device is already online. If it is diff --git a/trunk/drivers/s390/cio/io_sch.h b/trunk/drivers/s390/cio/io_sch.h index ca1063d6b505..dbc69a5a043e 100644 --- a/trunk/drivers/s390/cio/io_sch.h +++ b/trunk/drivers/s390/cio/io_sch.h @@ -167,6 +167,7 @@ struct ccw_device_private { unsigned int resuming:1; /* recognition while resume */ unsigned int pgroup:1; /* pathgroup is set up */ unsigned int mpath:1; /* multipathing is set up */ + unsigned int initialized:1; /* set if initial reference held */ } __attribute__((packed)) flags; unsigned long intparm; /* user interruption parameter */ struct qdio_irq *qdio_data;