diff options
author | Tejun Heo <tj@kernel.org> | 2010-11-13 13:55:17 +0300 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2010-11-13 13:55:17 +0300 |
commit | 75f1dc0d076d1c1168f2115f1941ea627d38bd5a (patch) | |
tree | af12858b842579e8924b30cb636b96fcca6f46b1 /fs/block_dev.c | |
parent | 6a027eff62f6ae32d49f2ae5dadd6f4eee1ddae2 (diff) | |
download | linux-75f1dc0d076d1c1168f2115f1941ea627d38bd5a.tar.xz |
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 'fs/block_dev.c')
-rw-r--r-- | fs/block_dev.c | 11 |
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; } |