diff options
| -rw-r--r-- | fs/block_dev.c | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/fs/block_dev.c b/fs/block_dev.c index 333a7bb4cb9c..4fb8a3431531 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c | |||
| @@ -1215,12 +1215,6 @@ int blkdev_get(struct block_device *bdev, fmode_t mode, void *holder) | |||
| 1215 | 1215 | ||
| 1216 | res = __blkdev_get(bdev, mode, 0); | 1216 | res = __blkdev_get(bdev, mode, 0); |
| 1217 | 1217 | ||
| 1218 | /* __blkdev_get() may alter read only status, check it afterwards */ | ||
| 1219 | if (!res && (mode & FMODE_WRITE) && bdev_read_only(bdev)) { | ||
| 1220 | __blkdev_put(bdev, mode, 0); | ||
| 1221 | res = -EACCES; | ||
| 1222 | } | ||
| 1223 | |||
| 1224 | if (whole) { | 1218 | if (whole) { |
| 1225 | /* finish claiming */ | 1219 | /* finish claiming */ |
| 1226 | mutex_lock(&bdev->bd_mutex); | 1220 | mutex_lock(&bdev->bd_mutex); |
| @@ -1298,6 +1292,11 @@ struct block_device *blkdev_get_by_path(const char *path, fmode_t mode, | |||
| 1298 | if (err) | 1292 | if (err) |
| 1299 | return ERR_PTR(err); | 1293 | return ERR_PTR(err); |
| 1300 | 1294 | ||
| 1295 | if ((mode & FMODE_WRITE) && bdev_read_only(bdev)) { | ||
| 1296 | blkdev_put(bdev, mode); | ||
| 1297 | return ERR_PTR(-EACCES); | ||
| 1298 | } | ||
| 1299 | |||
| 1301 | return bdev; | 1300 | return bdev; |
| 1302 | } | 1301 | } |
| 1303 | EXPORT_SYMBOL(blkdev_get_by_path); | 1302 | EXPORT_SYMBOL(blkdev_get_by_path); |
