From bb0ceaf2dc8777f3f03a86da916ed768ea58cb62 Mon Sep 17 00:00:00 2001 From: Krzysztof Mazur Date: Fri, 27 Apr 2012 09:46:01 +0200 Subject: [PATCH 83/84] lsbd: protect against SETDEV on busy LSBD device When the LSBD device is used it cannot be reinitialized. This patch adds protection against this. Signed-off-by: Krzysztof Mazur --- drivers/block/lsbd.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/drivers/block/lsbd.c b/drivers/block/lsbd.c index a46b965..dd8b2f4 100644 --- a/drivers/block/lsbd.c +++ b/drivers/block/lsbd.c @@ -103,6 +103,7 @@ struct lsbd { unsigned int blksize; spinlock_t lock; struct semaphore mutex; + unsigned int use; unsigned int psectors; unsigned int lsectors; @@ -282,6 +283,7 @@ static unsigned int lsbd_map_sector(struct lsbd *p, unsigned int partition, */ static int lsbd_open(struct inode *inode, struct file *file) { + struct lsbd *p; int minor; int dev; @@ -296,6 +298,12 @@ static int lsbd_open(struct inode *inode, struct file *file) dev = minor >> PART_BITS; if (dev >= LSBD_MAX) return -ENODEV; + + p = &lsbd_dev[dev]; + if (down_interruptible(&p->mutex)) + return -ERESTARTSYS; + p->use++; + up(&p->mutex); MOD_INC_USE_COUNT; return 0; } @@ -305,6 +313,7 @@ static int lsbd_open(struct inode *inode, struct file *file) */ static int lsbd_release(struct inode *inode, struct file *file) { + struct lsbd *p; int minor; int dev; @@ -320,6 +329,10 @@ static int lsbd_release(struct inode *inode, struct file *file) if (dev >= LSBD_MAX) return 0; MOD_DEC_USE_COUNT; + p = &lsbd_dev[dev]; + down(&p->mutex); + p->use--; + up(&p->mutex); return 0; } @@ -1560,6 +1573,10 @@ static int lsbd_ioctl(struct inode *inode, struct file *file, unsigned int major = arg >> 20; unsigned int minor = arg & 0xfffff; + err = -EBUSY; + if (p->use > 1) + break; + if (p->tsk != NULL) { lsbd_stop(p); lsbd_reset_dev(p); @@ -2818,6 +2835,7 @@ int __init lsbd_init_module(void) init_MUTEX(&p->mutex); sema_init(&p->req_sem, 512); p->tsk = NULL; + p->use = 0; } if (devfs_register_blkdev(MAJOR_NR, "lsbd", &lsbd_fops)) { -- 1.8.4.652.g0d6e0ce