From 42220c072fa5715dc5282a2fe1452efb50b7715d Mon Sep 17 00:00:00 2001 From: Krzysztof Mazur Date: Sat, 14 May 2011 23:28:16 +0200 Subject: [PATCH 25/84] lsbd: invalidate buffers on device change --- drivers/block/lsbd.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/drivers/block/lsbd.c b/drivers/block/lsbd.c index babe2a8..64ed3ca 100644 --- a/drivers/block/lsbd.c +++ b/drivers/block/lsbd.c @@ -933,10 +933,11 @@ static int lsbd_load_params(struct lsbd *p) /** * lsbd_stop - stop LSBD device * @p: LSBD device + * @bdev: LSBD block device * * TODO: Clean write queue. */ -static void lsbd_stop(struct lsbd *p) +static void lsbd_stop(struct lsbd *p, struct block_device *bdev) { struct completion event; @@ -947,6 +948,7 @@ static void lsbd_stop(struct lsbd *p) send_sig(SIGKILL, p->tsk, 1); wait_for_completion(&event); p->tsk = NULL; + invalidate_bdev(bdev, 0); MOD_DEC_USE_COUNT; } @@ -961,9 +963,7 @@ static int lsbd_mount(struct lsbd *p) int ret; struct completion event; - if (p->tsk != NULL) - lsbd_stop(p); - + BUG_ON(p->tsk != NULL); p->stop = 0; blksize = 0; if (blksize_size[MAJOR(p->dev)]) @@ -1179,6 +1179,9 @@ static int lsbd_ioctl(struct inode *inode, struct file *file, case LSBD_SET_DEV: { unsigned int major = arg >> 20; unsigned int minor = arg & 0xfffff; + + if (p->tsk != NULL) + lsbd_stop(p, inode->i_bdev); err = lsbd_set_dev(p, major, minor); break; -- 1.8.4.652.g0d6e0ce