Commit 05ce3e53 authored by Cornelia Huck's avatar Cornelia Huck Committed by Vasily Gorbik
Browse files

s390/cio: avoid duplicated 'ADD' uevents



The common I/O layer delays the ADD uevent for subchannels and
delegates generating this uevent to the individual subchannel
drivers. The io_subchannel driver will do so when the associated
ccw_device has been registered -- but unconditionally, so more
ADD uevents will be generated if a subchannel has been unbound
from the io_subchannel driver and later rebound.

To fix this, only generate the ADD event if uevents were still
suppressed for the device.

Fixes: fa1a8c23 ("s390: cio: Delay uevents for subchannels")
Message-Id: <20200327124503.9794-2-cohuck@redhat.com>
Reported-by: default avatarBoris Fiuczynski <fiuczy@linux.ibm.com>
Reviewed-by: default avatarPeter Oberparleiter <oberpar@linux.ibm.com>
Reviewed-by: default avatarBoris Fiuczynski <fiuczy@linux.ibm.com>
Signed-off-by: default avatarCornelia Huck <cohuck@redhat.com>
Signed-off-by: default avatarVasily Gorbik <gor@linux.ibm.com>
parent 9c159bbc
Loading
Loading
Loading
Loading
+9 −4
Original line number Diff line number Diff line
@@ -849,8 +849,10 @@ static void io_subchannel_register(struct ccw_device *cdev)
	 * Now we know this subchannel will stay, we can throw
	 * our delayed uevent.
	 */
	if (dev_get_uevent_suppress(&sch->dev)) {
		dev_set_uevent_suppress(&sch->dev, 0);
		kobject_uevent(&sch->dev.kobj, KOBJ_ADD);
	}
	/* make it known to the system */
	ret = ccw_device_add(cdev);
	if (ret) {
@@ -1058,8 +1060,11 @@ static int io_subchannel_probe(struct subchannel *sch)
		 * Throw the delayed uevent for the subchannel, register
		 * the ccw_device and exit.
		 */
		if (dev_get_uevent_suppress(&sch->dev)) {
			/* should always be the case for the console */
			dev_set_uevent_suppress(&sch->dev, 0);
			kobject_uevent(&sch->dev.kobj, KOBJ_ADD);
		}
		cdev = sch_get_cdev(sch);
		rc = ccw_device_add(cdev);
		if (rc) {