[S390] cio: Fix ungroup vs. machine check race in ccwgroup.
authorCornelia Huck <cornelia.huck@de.ibm.com>
Sat, 26 Jan 2008 13:10:50 +0000 (14:10 +0100)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Sat, 26 Jan 2008 13:11:04 +0000 (14:11 +0100)
There are two ways for a ccwgroup device to be unregistered:
Via the ungroup attribute, or when on of the slave devices is killed
by a machine check. As we have to unregister the ccwgroup device
via a callback, we'll now have to check whether it hasn't been
already unregistered because of a machine check.

Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
drivers/s390/cio/ccwgroup.c

index dc1c5f4dd2563003ee04d16f406ef7819f495fbb..3964056a9a4745f05b607c86a1a837eaa961c0eb 100644 (file)
@@ -75,8 +75,10 @@ static void ccwgroup_ungroup_callback(struct device *dev)
        struct ccwgroup_device *gdev = to_ccwgroupdev(dev);
 
        mutex_lock(&gdev->reg_mutex);
-       __ccwgroup_remove_symlinks(gdev);
-       device_unregister(dev);
+       if (device_is_registered(&gdev->dev)) {
+               __ccwgroup_remove_symlinks(gdev);
+               device_unregister(dev);
+       }
        mutex_unlock(&gdev->reg_mutex);
 }