aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Ott <sebott@linux.vnet.ibm.com>2012-09-05 08:20:41 -0400
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2012-09-06 04:40:40 -0400
commit3368ba25bf387109b24732c1e270c628f20e345d (patch)
treea699ca6bdb68c241d89685ff81f60adeae81f7ed
parent43d0be75af8d05654b88d1da494cf292714fbdec (diff)
s390/cio: invalidate cdev pointer before deregistration
Make sure that the cdev pointer for IO subchannels is set to NULL when we deregister the device (and release its last reference). This will fix a bug were another process operates on an already freed ccw device. Acked-by: Peter Oberparleiter <peter.oberparleiter@de.ibm.com> Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
-rw-r--r--drivers/s390/cio/device.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c
index e8e1a108cdf8..fc916f5d7314 100644
--- a/drivers/s390/cio/device.c
+++ b/drivers/s390/cio/device.c
@@ -1521,11 +1521,14 @@ static int io_subchannel_sch_event(struct subchannel *sch, int process)
1521 goto out; 1521 goto out;
1522 break; 1522 break;
1523 case IO_SCH_UNREG_ATTACH: 1523 case IO_SCH_UNREG_ATTACH:
1524 spin_lock_irqsave(sch->lock, flags);
1524 if (cdev->private->flags.resuming) { 1525 if (cdev->private->flags.resuming) {
1525 /* Device will be handled later. */ 1526 /* Device will be handled later. */
1526 rc = 0; 1527 rc = 0;
1527 goto out; 1528 goto out_unlock;
1528 } 1529 }
1530 sch_set_cdev(sch, NULL);
1531 spin_unlock_irqrestore(sch->lock, flags);
1529 /* Unregister ccw device. */ 1532 /* Unregister ccw device. */
1530 ccw_device_unregister(cdev); 1533 ccw_device_unregister(cdev);
1531 break; 1534 break;