From 50beda53090dacbcbb636871906cf7bca2e14586 Mon Sep 17 00:00:00 2001 From: Krzysztof Mazur Date: Fri, 27 May 2011 18:33:20 +0200 Subject: [PATCH 37/84] lsbd: add block device locking The LSBD should lock underlaying block device. This is very important for "removable" IDE disks where if device is not locked partition table ran be rereaded which may cause I/O errors. --- drivers/block/lsbd.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/drivers/block/lsbd.c b/drivers/block/lsbd.c index 7b4ab40..33a19ea 100644 --- a/drivers/block/lsbd.c +++ b/drivers/block/lsbd.c @@ -77,6 +77,7 @@ struct lsbd_partition { struct lsbd { unsigned int id; kdev_t dev; + struct block_device *bdev; unsigned int sector_size; /* size of sector */ unsigned int sectors_per_block; unsigned int blocks; @@ -981,6 +982,9 @@ 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)); + + blkdev_put(p->bdev, BDEV_RAW); + bdput(p->bdev); } /** @@ -1080,12 +1084,30 @@ static int lsbd_mount(struct lsbd *p) static int lsbd_set_dev(struct lsbd *p, int major, int minor) { kdev_t dev = MKDEV(major, minor); + struct block_device *bdev; + int ret; + + bdev = bdget(kdev_t_to_nr(dev)); + if (!bdev) + return -ENOMEM; + + ret = blkdev_get(bdev, FMODE_READ | FMODE_WRITE, 0, BDEV_RAW); + if (ret) { + bdput(bdev); + return ret; + } spin_lock_irq(&p->lock); p->dev = dev; + p->bdev = bdev; spin_unlock_irq(&p->lock); - return lsbd_mount(p); + ret = lsbd_mount(p); + if (ret) { + blkdev_put(bdev, BDEV_RAW); + bdput(bdev); + } + return ret; } /** -- 1.8.4.652.g0d6e0ce