summaryrefslogtreecommitdiffstats
path: root/fs/block_dev.c
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2010-11-13 11:55:17 +0100
committerTejun Heo <tj@kernel.org>2010-11-13 11:55:17 +0100
commit75f1dc0d076d1c1168f2115f1941ea627d38bd5a (patch)
treeaf12858b842579e8924b30cb636b96fcca6f46b1 /fs/block_dev.c
parentblock: reorganize claim/release implementation (diff)
downloadlinux-75f1dc0d076d1c1168f2115f1941ea627d38bd5a.tar.xz
linux-75f1dc0d076d1c1168f2115f1941ea627d38bd5a.zip
block: check bdev_read_only() from blkdev_get()
bdev read-only status can be queried using bdev_read_only() and may change while the device is being opened. Enforce it by checking it from blkdev_get() after open succeeds. This makes bdev_read_only() check in open_bdev_exclusive() and fsg_lun_open() unnecessary. Drop them. Signed-off-by: Tejun Heo <tj@kernel.org> Cc: David Brownell <dbrownell@users.sourceforge.net> Cc: linux-usb@vger.kernel.org
Diffstat (limited to '')
-rw-r--r--fs/block_dev.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/fs/block_dev.c b/fs/block_dev.c
index 269bfbbd10fc..606a5259f87f 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -1149,6 +1149,12 @@ int blkdev_get(struct block_device *bdev, fmode_t mode, void *holder)
res = __blkdev_get(bdev, mode, 0);
+ /* __blkdev_get() may alter read only status, check it afterwards */
+ if (!res && (mode & FMODE_WRITE) && bdev_read_only(bdev)) {
+ __blkdev_put(bdev, mode, 0);
+ res = -EACCES;
+ }
+
if (whole) {
/* finish claiming */
spin_lock(&bdev_lock);
@@ -1453,11 +1459,6 @@ struct block_device *open_bdev_exclusive(const char *path, fmode_t mode, void *h
if (error)
return ERR_PTR(error);
- if ((mode & FMODE_WRITE) && bdev_read_only(bdev)) {
- blkdev_put(bdev, mode);
- return ERR_PTR(-EACCES);
- }
-
return bdev;
}