From 2cd6cb66dd60402efcc4f236da39a0849983abed Mon Sep 17 00:00:00 2001 From: Krzysztof Mazur Date: Wed, 27 Jul 2011 17:45:13 +0200 Subject: [PATCH 50/84] lsbd: fix oops caused by resize During resize blkdev_put() and bdput() were called which caused oops during next resize or umount. --- drivers/block/lsbd.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/block/lsbd.c b/drivers/block/lsbd.c index e8b1c01..d718046 100644 --- a/drivers/block/lsbd.c +++ b/drivers/block/lsbd.c @@ -990,7 +990,17 @@ static void lsbd_stop(struct lsbd *p) for (i = 0; i < 1 << PART_BITS; i++) invalidate_buffers(MKDEV(LSBD_MAJOR, (p->id << PART_BITS) + i)); +} +/** + * lsbd_reset_dev - reset underlying device + * @p: LSBD device + * + * This function resets the underlying device. The LSBD device must be + * stopped first. + */ +static void lsbd_reset_dev(struct lsbd *p) +{ blkdev_put(p->bdev, BDEV_RAW); bdput(p->bdev); } @@ -1297,6 +1307,7 @@ static int lsbd_ioctl(struct inode *inode, struct file *file, if (p->tsk != NULL) { lsbd_stop(p); + lsbd_reset_dev(p); MOD_DEC_USE_COUNT; } -- 1.8.4.652.g0d6e0ce