diff options
-rw-r--r-- | drivers/block/drbd/drbd_nl.c | 12 | ||||
-rw-r--r-- | drivers/md/dm-table.c | 2 | ||||
-rw-r--r-- | drivers/md/md.c | 4 | ||||
-rw-r--r-- | drivers/mtd/devices/block2mtd.c | 4 | ||||
-rw-r--r-- | fs/block_dev.c | 139 | ||||
-rw-r--r-- | fs/btrfs/volumes.c | 24 | ||||
-rw-r--r-- | fs/btrfs/volumes.h | 2 | ||||
-rw-r--r-- | fs/ext3/super.c | 2 | ||||
-rw-r--r-- | fs/ext4/super.c | 2 | ||||
-rw-r--r-- | fs/gfs2/ops_fstype.c | 8 | ||||
-rw-r--r-- | fs/jfs/jfs_logmgr.c | 4 | ||||
-rw-r--r-- | fs/logfs/dev_bdev.c | 3 | ||||
-rw-r--r-- | fs/nilfs2/super.c | 8 | ||||
-rw-r--r-- | fs/reiserfs/journal.c | 6 | ||||
-rw-r--r-- | fs/super.c | 9 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_super.c | 3 | ||||
-rw-r--r-- | include/linux/fs.h | 7 | ||||
-rw-r--r-- | kernel/power/swap.c | 4 |
18 files changed, 149 insertions, 94 deletions
diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c index fd0346090289..650e43ba4f7c 100644 --- a/drivers/block/drbd/drbd_nl.c +++ b/drivers/block/drbd/drbd_nl.c | |||
@@ -902,8 +902,8 @@ static int drbd_nl_disk_conf(struct drbd_conf *mdev, struct drbd_nl_cfg_req *nlp | |||
902 | } | 902 | } |
903 | } | 903 | } |
904 | 904 | ||
905 | bdev = open_bdev_exclusive(nbc->dc.backing_dev, | 905 | bdev = blkdev_get_by_path(nbc->dc.backing_dev, |
906 | FMODE_READ | FMODE_WRITE, mdev); | 906 | FMODE_READ | FMODE_WRITE | FMODE_EXCL, mdev); |
907 | if (IS_ERR(bdev)) { | 907 | if (IS_ERR(bdev)) { |
908 | dev_err(DEV, "open(\"%s\") failed with %ld\n", nbc->dc.backing_dev, | 908 | dev_err(DEV, "open(\"%s\") failed with %ld\n", nbc->dc.backing_dev, |
909 | PTR_ERR(bdev)); | 909 | PTR_ERR(bdev)); |
@@ -920,10 +920,10 @@ static int drbd_nl_disk_conf(struct drbd_conf *mdev, struct drbd_nl_cfg_req *nlp | |||
920 | * should check it for you already; but if you don't, or | 920 | * should check it for you already; but if you don't, or |
921 | * someone fooled it, we need to double check here) | 921 | * someone fooled it, we need to double check here) |
922 | */ | 922 | */ |
923 | bdev = open_bdev_exclusive(nbc->dc.meta_dev, | 923 | bdev = blkdev_get_by_path(nbc->dc.meta_dev, |
924 | FMODE_READ | FMODE_WRITE, | 924 | FMODE_READ | FMODE_WRITE | FMODE_EXCL, |
925 | (nbc->dc.meta_dev_idx < 0) ? | 925 | (nbc->dc.meta_dev_idx < 0) ? |
926 | (void *)mdev : (void *)drbd_m_holder); | 926 | (void *)mdev : (void *)drbd_m_holder); |
927 | if (IS_ERR(bdev)) { | 927 | if (IS_ERR(bdev)) { |
928 | dev_err(DEV, "open(\"%s\") failed with %ld\n", nbc->dc.meta_dev, | 928 | dev_err(DEV, "open(\"%s\") failed with %ld\n", nbc->dc.meta_dev, |
929 | PTR_ERR(bdev)); | 929 | PTR_ERR(bdev)); |
diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c index 9e88ca0c55e9..67150c32986c 100644 --- a/drivers/md/dm-table.c +++ b/drivers/md/dm-table.c | |||
@@ -325,7 +325,7 @@ static int open_dev(struct dm_dev_internal *d, dev_t dev, | |||
325 | 325 | ||
326 | BUG_ON(d->dm_dev.bdev); | 326 | BUG_ON(d->dm_dev.bdev); |
327 | 327 | ||
328 | bdev = open_by_devnum(dev, d->dm_dev.mode | FMODE_EXCL, _claim_ptr); | 328 | bdev = blkdev_get_by_dev(dev, d->dm_dev.mode | FMODE_EXCL, _claim_ptr); |
329 | if (IS_ERR(bdev)) | 329 | if (IS_ERR(bdev)) |
330 | return PTR_ERR(bdev); | 330 | return PTR_ERR(bdev); |
331 | 331 | ||
diff --git a/drivers/md/md.c b/drivers/md/md.c index 6af951ffe0bb..5aaa6bfbe638 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -1934,8 +1934,8 @@ static int lock_rdev(mdk_rdev_t *rdev, dev_t dev, int shared) | |||
1934 | struct block_device *bdev; | 1934 | struct block_device *bdev; |
1935 | char b[BDEVNAME_SIZE]; | 1935 | char b[BDEVNAME_SIZE]; |
1936 | 1936 | ||
1937 | bdev = open_by_devnum(dev, FMODE_READ|FMODE_WRITE|FMODE_EXCL, | 1937 | bdev = blkdev_get_by_dev(dev, FMODE_READ|FMODE_WRITE|FMODE_EXCL, |
1938 | shared ? (mdk_rdev_t *)lock_rdev : rdev); | 1938 | shared ? (mdk_rdev_t *)lock_rdev : rdev); |
1939 | if (IS_ERR(bdev)) { | 1939 | if (IS_ERR(bdev)) { |
1940 | printk(KERN_ERR "md: could not open %s.\n", | 1940 | printk(KERN_ERR "md: could not open %s.\n", |
1941 | __bdevname(dev, b)); | 1941 | __bdevname(dev, b)); |
diff --git a/drivers/mtd/devices/block2mtd.c b/drivers/mtd/devices/block2mtd.c index aa557beb8f51..f29a6f9df6e7 100644 --- a/drivers/mtd/devices/block2mtd.c +++ b/drivers/mtd/devices/block2mtd.c | |||
@@ -247,7 +247,7 @@ static struct block2mtd_dev *add_device(char *devname, int erase_size) | |||
247 | return NULL; | 247 | return NULL; |
248 | 248 | ||
249 | /* Get a handle on the device */ | 249 | /* Get a handle on the device */ |
250 | bdev = open_bdev_exclusive(devname, mode, dev); | 250 | bdev = blkdev_get_by_path(devname, mode, dev); |
251 | #ifndef MODULE | 251 | #ifndef MODULE |
252 | if (IS_ERR(bdev)) { | 252 | if (IS_ERR(bdev)) { |
253 | 253 | ||
@@ -256,7 +256,7 @@ static struct block2mtd_dev *add_device(char *devname, int erase_size) | |||
256 | 256 | ||
257 | dev_t devt = name_to_dev_t(devname); | 257 | dev_t devt = name_to_dev_t(devname); |
258 | if (devt) | 258 | if (devt) |
259 | bdev = open_by_devnum(devt, mode, dev); | 259 | bdev = blkdev_get_by_dev(devt, mode, dev); |
260 | } | 260 | } |
261 | #endif | 261 | #endif |
262 | 262 | ||
diff --git a/fs/block_dev.c b/fs/block_dev.c index 606a5259f87f..c1c1b8c3fb99 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c | |||
@@ -854,24 +854,6 @@ static inline void bd_unlink_disk_holder(struct block_device *bdev) | |||
854 | { } | 854 | { } |
855 | #endif | 855 | #endif |
856 | 856 | ||
857 | /* | ||
858 | * Tries to open block device by device number. Use it ONLY if you | ||
859 | * really do not have anything better - i.e. when you are behind a | ||
860 | * truly sucky interface and all you are given is a device number. _Never_ | ||
861 | * to be used for internal purposes. If you ever need it - reconsider | ||
862 | * your API. | ||
863 | */ | ||
864 | struct block_device *open_by_devnum(dev_t dev, fmode_t mode, void *holder) | ||
865 | { | ||
866 | struct block_device *bdev = bdget(dev); | ||
867 | int err = -ENOMEM; | ||
868 | if (bdev) | ||
869 | err = blkdev_get(bdev, mode, holder); | ||
870 | return err ? ERR_PTR(err) : bdev; | ||
871 | } | ||
872 | |||
873 | EXPORT_SYMBOL(open_by_devnum); | ||
874 | |||
875 | /** | 857 | /** |
876 | * flush_disk - invalidates all buffer-cache entries on a disk | 858 | * flush_disk - invalidates all buffer-cache entries on a disk |
877 | * | 859 | * |
@@ -1132,6 +1114,25 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part) | |||
1132 | return ret; | 1114 | return ret; |
1133 | } | 1115 | } |
1134 | 1116 | ||
1117 | /** | ||
1118 | * blkdev_get - open a block device | ||
1119 | * @bdev: block_device to open | ||
1120 | * @mode: FMODE_* mask | ||
1121 | * @holder: exclusive holder identifier | ||
1122 | * | ||
1123 | * Open @bdev with @mode. If @mode includes %FMODE_EXCL, @bdev is | ||
1124 | * open with exclusive access. Specifying %FMODE_EXCL with %NULL | ||
1125 | * @holder is invalid. Exclusive opens may nest for the same @holder. | ||
1126 | * | ||
1127 | * On success, the reference count of @bdev is unchanged. On failure, | ||
1128 | * @bdev is put. | ||
1129 | * | ||
1130 | * CONTEXT: | ||
1131 | * Might sleep. | ||
1132 | * | ||
1133 | * RETURNS: | ||
1134 | * 0 on success, -errno on failure. | ||
1135 | */ | ||
1135 | int blkdev_get(struct block_device *bdev, fmode_t mode, void *holder) | 1136 | int blkdev_get(struct block_device *bdev, fmode_t mode, void *holder) |
1136 | { | 1137 | { |
1137 | struct block_device *whole = NULL; | 1138 | struct block_device *whole = NULL; |
@@ -1186,6 +1187,80 @@ int blkdev_get(struct block_device *bdev, fmode_t mode, void *holder) | |||
1186 | } | 1187 | } |
1187 | EXPORT_SYMBOL(blkdev_get); | 1188 | EXPORT_SYMBOL(blkdev_get); |
1188 | 1189 | ||
1190 | /** | ||
1191 | * blkdev_get_by_path - open a block device by name | ||
1192 | * @path: path to the block device to open | ||
1193 | * @mode: FMODE_* mask | ||
1194 | * @holder: exclusive holder identifier | ||
1195 | * | ||
1196 | * Open the blockdevice described by the device file at @path. @mode | ||
1197 | * and @holder are identical to blkdev_get(). | ||
1198 | * | ||
1199 | * On success, the returned block_device has reference count of one. | ||
1200 | * | ||
1201 | * CONTEXT: | ||
1202 | * Might sleep. | ||
1203 | * | ||
1204 | * RETURNS: | ||
1205 | * Pointer to block_device on success, ERR_PTR(-errno) on failure. | ||
1206 | */ | ||
1207 | struct block_device *blkdev_get_by_path(const char *path, fmode_t mode, | ||
1208 | void *holder) | ||
1209 | { | ||
1210 | struct block_device *bdev; | ||
1211 | int err; | ||
1212 | |||
1213 | bdev = lookup_bdev(path); | ||
1214 | if (IS_ERR(bdev)) | ||
1215 | return bdev; | ||
1216 | |||
1217 | err = blkdev_get(bdev, mode, holder); | ||
1218 | if (err) | ||
1219 | return ERR_PTR(err); | ||
1220 | |||
1221 | return bdev; | ||
1222 | } | ||
1223 | EXPORT_SYMBOL(blkdev_get_by_path); | ||
1224 | |||
1225 | /** | ||
1226 | * blkdev_get_by_dev - open a block device by device number | ||
1227 | * @dev: device number of block device to open | ||
1228 | * @mode: FMODE_* mask | ||
1229 | * @holder: exclusive holder identifier | ||
1230 | * | ||
1231 | * Open the blockdevice described by device number @dev. @mode and | ||
1232 | * @holder are identical to blkdev_get(). | ||
1233 | * | ||
1234 | * Use it ONLY if you really do not have anything better - i.e. when | ||
1235 | * you are behind a truly sucky interface and all you are given is a | ||
1236 | * device number. _Never_ to be used for internal purposes. If you | ||
1237 | * ever need it - reconsider your API. | ||
1238 | * | ||
1239 | * On success, the returned block_device has reference count of one. | ||
1240 | * | ||
1241 | * CONTEXT: | ||
1242 | * Might sleep. | ||
1243 | * | ||
1244 | * RETURNS: | ||
1245 | * Pointer to block_device on success, ERR_PTR(-errno) on failure. | ||
1246 | */ | ||
1247 | struct block_device *blkdev_get_by_dev(dev_t dev, fmode_t mode, void *holder) | ||
1248 | { | ||
1249 | struct block_device *bdev; | ||
1250 | int err; | ||
1251 | |||
1252 | bdev = bdget(dev); | ||
1253 | if (!bdev) | ||
1254 | return ERR_PTR(-ENOMEM); | ||
1255 | |||
1256 | err = blkdev_get(bdev, mode, holder); | ||
1257 | if (err) | ||
1258 | return ERR_PTR(err); | ||
1259 | |||
1260 | return bdev; | ||
1261 | } | ||
1262 | EXPORT_SYMBOL(blkdev_get_by_dev); | ||
1263 | |||
1189 | static int blkdev_open(struct inode * inode, struct file * filp) | 1264 | static int blkdev_open(struct inode * inode, struct file * filp) |
1190 | { | 1265 | { |
1191 | struct block_device *bdev; | 1266 | struct block_device *bdev; |
@@ -1436,34 +1511,6 @@ fail: | |||
1436 | } | 1511 | } |
1437 | EXPORT_SYMBOL(lookup_bdev); | 1512 | EXPORT_SYMBOL(lookup_bdev); |
1438 | 1513 | ||
1439 | /** | ||
1440 | * open_bdev_exclusive - open a block device by name and set it up for use | ||
1441 | * | ||
1442 | * @path: special file representing the block device | ||
1443 | * @mode: FMODE_... combination to pass be used | ||
1444 | * @holder: owner for exclusion | ||
1445 | * | ||
1446 | * Open the blockdevice described by the special file at @path, claim it | ||
1447 | * for the @holder. | ||
1448 | */ | ||
1449 | struct block_device *open_bdev_exclusive(const char *path, fmode_t mode, void *holder) | ||
1450 | { | ||
1451 | struct block_device *bdev; | ||
1452 | int error; | ||
1453 | |||
1454 | bdev = lookup_bdev(path); | ||
1455 | if (IS_ERR(bdev)) | ||
1456 | return bdev; | ||
1457 | |||
1458 | error = blkdev_get(bdev, mode | FMODE_EXCL, holder); | ||
1459 | if (error) | ||
1460 | return ERR_PTR(error); | ||
1461 | |||
1462 | return bdev; | ||
1463 | } | ||
1464 | |||
1465 | EXPORT_SYMBOL(open_bdev_exclusive); | ||
1466 | |||
1467 | int __invalidate_device(struct block_device *bdev) | 1514 | int __invalidate_device(struct block_device *bdev) |
1468 | { | 1515 | { |
1469 | struct super_block *sb = get_super(bdev); | 1516 | struct super_block *sb = get_super(bdev); |
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index f1b729d3b883..95324e9f9280 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c | |||
@@ -489,7 +489,7 @@ again: | |||
489 | continue; | 489 | continue; |
490 | 490 | ||
491 | if (device->bdev) { | 491 | if (device->bdev) { |
492 | blkdev_put(device->bdev, device->mode | FMODE_EXCL); | 492 | blkdev_put(device->bdev, device->mode); |
493 | device->bdev = NULL; | 493 | device->bdev = NULL; |
494 | fs_devices->open_devices--; | 494 | fs_devices->open_devices--; |
495 | } | 495 | } |
@@ -523,7 +523,7 @@ static int __btrfs_close_devices(struct btrfs_fs_devices *fs_devices) | |||
523 | 523 | ||
524 | list_for_each_entry(device, &fs_devices->devices, dev_list) { | 524 | list_for_each_entry(device, &fs_devices->devices, dev_list) { |
525 | if (device->bdev) { | 525 | if (device->bdev) { |
526 | blkdev_put(device->bdev, device->mode | FMODE_EXCL); | 526 | blkdev_put(device->bdev, device->mode); |
527 | fs_devices->open_devices--; | 527 | fs_devices->open_devices--; |
528 | } | 528 | } |
529 | if (device->writeable) { | 529 | if (device->writeable) { |
@@ -580,13 +580,15 @@ static int __btrfs_open_devices(struct btrfs_fs_devices *fs_devices, | |||
580 | int seeding = 1; | 580 | int seeding = 1; |
581 | int ret = 0; | 581 | int ret = 0; |
582 | 582 | ||
583 | flags |= FMODE_EXCL; | ||
584 | |||
583 | list_for_each_entry(device, head, dev_list) { | 585 | list_for_each_entry(device, head, dev_list) { |
584 | if (device->bdev) | 586 | if (device->bdev) |
585 | continue; | 587 | continue; |
586 | if (!device->name) | 588 | if (!device->name) |
587 | continue; | 589 | continue; |
588 | 590 | ||
589 | bdev = open_bdev_exclusive(device->name, flags, holder); | 591 | bdev = blkdev_get_by_path(device->name, flags, holder); |
590 | if (IS_ERR(bdev)) { | 592 | if (IS_ERR(bdev)) { |
591 | printk(KERN_INFO "open %s failed\n", device->name); | 593 | printk(KERN_INFO "open %s failed\n", device->name); |
592 | goto error; | 594 | goto error; |
@@ -638,7 +640,7 @@ static int __btrfs_open_devices(struct btrfs_fs_devices *fs_devices, | |||
638 | error_brelse: | 640 | error_brelse: |
639 | brelse(bh); | 641 | brelse(bh); |
640 | error_close: | 642 | error_close: |
641 | blkdev_put(bdev, flags | FMODE_EXCL); | 643 | blkdev_put(bdev, flags); |
642 | error: | 644 | error: |
643 | continue; | 645 | continue; |
644 | } | 646 | } |
@@ -684,7 +686,8 @@ int btrfs_scan_one_device(const char *path, fmode_t flags, void *holder, | |||
684 | 686 | ||
685 | mutex_lock(&uuid_mutex); | 687 | mutex_lock(&uuid_mutex); |
686 | 688 | ||
687 | bdev = open_bdev_exclusive(path, flags, holder); | 689 | flags |= FMODE_EXCL; |
690 | bdev = blkdev_get_by_path(path, flags, holder); | ||
688 | 691 | ||
689 | if (IS_ERR(bdev)) { | 692 | if (IS_ERR(bdev)) { |
690 | ret = PTR_ERR(bdev); | 693 | ret = PTR_ERR(bdev); |
@@ -716,7 +719,7 @@ int btrfs_scan_one_device(const char *path, fmode_t flags, void *holder, | |||
716 | 719 | ||
717 | brelse(bh); | 720 | brelse(bh); |
718 | error_close: | 721 | error_close: |
719 | blkdev_put(bdev, flags | FMODE_EXCL); | 722 | blkdev_put(bdev, flags); |
720 | error: | 723 | error: |
721 | mutex_unlock(&uuid_mutex); | 724 | mutex_unlock(&uuid_mutex); |
722 | return ret; | 725 | return ret; |
@@ -1179,8 +1182,8 @@ int btrfs_rm_device(struct btrfs_root *root, char *device_path) | |||
1179 | goto out; | 1182 | goto out; |
1180 | } | 1183 | } |
1181 | } else { | 1184 | } else { |
1182 | bdev = open_bdev_exclusive(device_path, FMODE_READ, | 1185 | bdev = blkdev_get_by_path(device_path, FMODE_READ | FMODE_EXCL, |
1183 | root->fs_info->bdev_holder); | 1186 | root->fs_info->bdev_holder); |
1184 | if (IS_ERR(bdev)) { | 1187 | if (IS_ERR(bdev)) { |
1185 | ret = PTR_ERR(bdev); | 1188 | ret = PTR_ERR(bdev); |
1186 | goto out; | 1189 | goto out; |
@@ -1244,7 +1247,7 @@ int btrfs_rm_device(struct btrfs_root *root, char *device_path) | |||
1244 | root->fs_info->fs_devices->latest_bdev = next_device->bdev; | 1247 | root->fs_info->fs_devices->latest_bdev = next_device->bdev; |
1245 | 1248 | ||
1246 | if (device->bdev) { | 1249 | if (device->bdev) { |
1247 | blkdev_put(device->bdev, device->mode | FMODE_EXCL); | 1250 | blkdev_put(device->bdev, device->mode); |
1248 | device->bdev = NULL; | 1251 | device->bdev = NULL; |
1249 | device->fs_devices->open_devices--; | 1252 | device->fs_devices->open_devices--; |
1250 | } | 1253 | } |
@@ -1439,7 +1442,8 @@ int btrfs_init_new_device(struct btrfs_root *root, char *device_path) | |||
1439 | if ((sb->s_flags & MS_RDONLY) && !root->fs_info->fs_devices->seeding) | 1442 | if ((sb->s_flags & MS_RDONLY) && !root->fs_info->fs_devices->seeding) |
1440 | return -EINVAL; | 1443 | return -EINVAL; |
1441 | 1444 | ||
1442 | bdev = open_bdev_exclusive(device_path, 0, root->fs_info->bdev_holder); | 1445 | bdev = blkdev_get_by_path(device_path, FMODE_EXCL, |
1446 | root->fs_info->bdev_holder); | ||
1443 | if (IS_ERR(bdev)) | 1447 | if (IS_ERR(bdev)) |
1444 | return PTR_ERR(bdev); | 1448 | return PTR_ERR(bdev); |
1445 | 1449 | ||
diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h index 2b638b6e4eea..856e75770304 100644 --- a/fs/btrfs/volumes.h +++ b/fs/btrfs/volumes.h | |||
@@ -49,7 +49,7 @@ struct btrfs_device { | |||
49 | 49 | ||
50 | struct block_device *bdev; | 50 | struct block_device *bdev; |
51 | 51 | ||
52 | /* the mode sent to open_bdev_exclusive */ | 52 | /* the mode sent to blkdev_get */ |
53 | fmode_t mode; | 53 | fmode_t mode; |
54 | 54 | ||
55 | char *name; | 55 | char *name; |
diff --git a/fs/ext3/super.c b/fs/ext3/super.c index 23e7513dba9c..123720ba786d 100644 --- a/fs/ext3/super.c +++ b/fs/ext3/super.c | |||
@@ -347,7 +347,7 @@ static struct block_device *ext3_blkdev_get(dev_t dev, struct super_block *sb) | |||
347 | struct block_device *bdev; | 347 | struct block_device *bdev; |
348 | char b[BDEVNAME_SIZE]; | 348 | char b[BDEVNAME_SIZE]; |
349 | 349 | ||
350 | bdev = open_by_devnum(dev, FMODE_READ|FMODE_WRITE|FMODE_EXCL, sb); | 350 | bdev = blkdev_get_by_dev(dev, FMODE_READ|FMODE_WRITE|FMODE_EXCL, sb); |
351 | if (IS_ERR(bdev)) | 351 | if (IS_ERR(bdev)) |
352 | goto fail; | 352 | goto fail; |
353 | return bdev; | 353 | return bdev; |
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 5dd0b3e76fa8..bd63e6927219 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
@@ -647,7 +647,7 @@ static struct block_device *ext4_blkdev_get(dev_t dev, struct super_block *sb) | |||
647 | struct block_device *bdev; | 647 | struct block_device *bdev; |
648 | char b[BDEVNAME_SIZE]; | 648 | char b[BDEVNAME_SIZE]; |
649 | 649 | ||
650 | bdev = open_by_devnum(dev, FMODE_READ|FMODE_WRITE|FMODE_EXCL, sb); | 650 | bdev = blkdev_get_by_dev(dev, FMODE_READ|FMODE_WRITE|FMODE_EXCL, sb); |
651 | if (IS_ERR(bdev)) | 651 | if (IS_ERR(bdev)) |
652 | goto fail; | 652 | goto fail; |
653 | return bdev; | 653 | return bdev; |
diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c index c1f0763a022b..bc56ccf98ffd 100644 --- a/fs/gfs2/ops_fstype.c +++ b/fs/gfs2/ops_fstype.c | |||
@@ -1268,7 +1268,7 @@ static struct dentry *gfs2_mount(struct file_system_type *fs_type, int flags, | |||
1268 | { | 1268 | { |
1269 | struct block_device *bdev; | 1269 | struct block_device *bdev; |
1270 | struct super_block *s; | 1270 | struct super_block *s; |
1271 | fmode_t mode = FMODE_READ; | 1271 | fmode_t mode = FMODE_READ | FMODE_EXCL; |
1272 | int error; | 1272 | int error; |
1273 | struct gfs2_args args; | 1273 | struct gfs2_args args; |
1274 | struct gfs2_sbd *sdp; | 1274 | struct gfs2_sbd *sdp; |
@@ -1276,7 +1276,7 @@ static struct dentry *gfs2_mount(struct file_system_type *fs_type, int flags, | |||
1276 | if (!(flags & MS_RDONLY)) | 1276 | if (!(flags & MS_RDONLY)) |
1277 | mode |= FMODE_WRITE; | 1277 | mode |= FMODE_WRITE; |
1278 | 1278 | ||
1279 | bdev = open_bdev_exclusive(dev_name, mode, fs_type); | 1279 | bdev = blkdev_get_by_path(dev_name, mode, fs_type); |
1280 | if (IS_ERR(bdev)) | 1280 | if (IS_ERR(bdev)) |
1281 | return ERR_CAST(bdev); | 1281 | return ERR_CAST(bdev); |
1282 | 1282 | ||
@@ -1298,7 +1298,7 @@ static struct dentry *gfs2_mount(struct file_system_type *fs_type, int flags, | |||
1298 | goto error_bdev; | 1298 | goto error_bdev; |
1299 | 1299 | ||
1300 | if (s->s_root) | 1300 | if (s->s_root) |
1301 | blkdev_put(bdev, mode | FMODE_EXCL); | 1301 | blkdev_put(bdev, mode); |
1302 | 1302 | ||
1303 | memset(&args, 0, sizeof(args)); | 1303 | memset(&args, 0, sizeof(args)); |
1304 | args.ar_quota = GFS2_QUOTA_DEFAULT; | 1304 | args.ar_quota = GFS2_QUOTA_DEFAULT; |
@@ -1342,7 +1342,7 @@ error_super: | |||
1342 | deactivate_locked_super(s); | 1342 | deactivate_locked_super(s); |
1343 | return ERR_PTR(error); | 1343 | return ERR_PTR(error); |
1344 | error_bdev: | 1344 | error_bdev: |
1345 | blkdev_put(bdev, mode | FMODE_EXCL); | 1345 | blkdev_put(bdev, mode); |
1346 | return ERR_PTR(error); | 1346 | return ERR_PTR(error); |
1347 | } | 1347 | } |
1348 | 1348 | ||
diff --git a/fs/jfs/jfs_logmgr.c b/fs/jfs/jfs_logmgr.c index 5a290f22dcc3..278e3fb40b71 100644 --- a/fs/jfs/jfs_logmgr.c +++ b/fs/jfs/jfs_logmgr.c | |||
@@ -1120,8 +1120,8 @@ int lmLogOpen(struct super_block *sb) | |||
1120 | * file systems to log may have n-to-1 relationship; | 1120 | * file systems to log may have n-to-1 relationship; |
1121 | */ | 1121 | */ |
1122 | 1122 | ||
1123 | bdev = open_by_devnum(sbi->logdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL, | 1123 | bdev = blkdev_get_by_dev(sbi->logdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL, |
1124 | log); | 1124 | log); |
1125 | if (IS_ERR(bdev)) { | 1125 | if (IS_ERR(bdev)) { |
1126 | rc = -PTR_ERR(bdev); | 1126 | rc = -PTR_ERR(bdev); |
1127 | goto free; | 1127 | goto free; |
diff --git a/fs/logfs/dev_bdev.c b/fs/logfs/dev_bdev.c index 734b9025858e..723bc5bca09a 100644 --- a/fs/logfs/dev_bdev.c +++ b/fs/logfs/dev_bdev.c | |||
@@ -325,7 +325,8 @@ int logfs_get_sb_bdev(struct logfs_super *p, struct file_system_type *type, | |||
325 | { | 325 | { |
326 | struct block_device *bdev; | 326 | struct block_device *bdev; |
327 | 327 | ||
328 | bdev = open_bdev_exclusive(devname, FMODE_READ|FMODE_WRITE, type); | 328 | bdev = blkdev_get_by_path(devname, FMODE_READ|FMODE_WRITE|FMODE_EXCL, |
329 | type); | ||
329 | if (IS_ERR(bdev)) | 330 | if (IS_ERR(bdev)) |
330 | return PTR_ERR(bdev); | 331 | return PTR_ERR(bdev); |
331 | 332 | ||
diff --git a/fs/nilfs2/super.c b/fs/nilfs2/super.c index 756a6798d7c8..0030640e2d72 100644 --- a/fs/nilfs2/super.c +++ b/fs/nilfs2/super.c | |||
@@ -1147,14 +1147,14 @@ nilfs_mount(struct file_system_type *fs_type, int flags, | |||
1147 | { | 1147 | { |
1148 | struct nilfs_super_data sd; | 1148 | struct nilfs_super_data sd; |
1149 | struct super_block *s; | 1149 | struct super_block *s; |
1150 | fmode_t mode = FMODE_READ; | 1150 | fmode_t mode = FMODE_READ | FMODE_EXCL; |
1151 | struct dentry *root_dentry; | 1151 | struct dentry *root_dentry; |
1152 | int err, s_new = false; | 1152 | int err, s_new = false; |
1153 | 1153 | ||
1154 | if (!(flags & MS_RDONLY)) | 1154 | if (!(flags & MS_RDONLY)) |
1155 | mode |= FMODE_WRITE; | 1155 | mode |= FMODE_WRITE; |
1156 | 1156 | ||
1157 | sd.bdev = open_bdev_exclusive(dev_name, mode, fs_type); | 1157 | sd.bdev = blkdev_get_by_path(dev_name, mode, fs_type); |
1158 | if (IS_ERR(sd.bdev)) | 1158 | if (IS_ERR(sd.bdev)) |
1159 | return ERR_CAST(sd.bdev); | 1159 | return ERR_CAST(sd.bdev); |
1160 | 1160 | ||
@@ -1233,7 +1233,7 @@ nilfs_mount(struct file_system_type *fs_type, int flags, | |||
1233 | } | 1233 | } |
1234 | 1234 | ||
1235 | if (!s_new) | 1235 | if (!s_new) |
1236 | blkdev_put(sd.bdev, mode | FMODE_EXCL); | 1236 | blkdev_put(sd.bdev, mode); |
1237 | 1237 | ||
1238 | return root_dentry; | 1238 | return root_dentry; |
1239 | 1239 | ||
@@ -1242,7 +1242,7 @@ nilfs_mount(struct file_system_type *fs_type, int flags, | |||
1242 | 1242 | ||
1243 | failed: | 1243 | failed: |
1244 | if (!s_new) | 1244 | if (!s_new) |
1245 | blkdev_put(sd.bdev, mode | FMODE_EXCL); | 1245 | blkdev_put(sd.bdev, mode); |
1246 | return ERR_PTR(err); | 1246 | return ERR_PTR(err); |
1247 | } | 1247 | } |
1248 | 1248 | ||
diff --git a/fs/reiserfs/journal.c b/fs/reiserfs/journal.c index b488136f5ace..e2fce519c0f2 100644 --- a/fs/reiserfs/journal.c +++ b/fs/reiserfs/journal.c | |||
@@ -2585,7 +2585,8 @@ static int journal_init_dev(struct super_block *super, | |||
2585 | if ((!jdev_name || !jdev_name[0])) { | 2585 | if ((!jdev_name || !jdev_name[0])) { |
2586 | if (jdev == super->s_dev) | 2586 | if (jdev == super->s_dev) |
2587 | blkdev_mode &= ~FMODE_EXCL; | 2587 | blkdev_mode &= ~FMODE_EXCL; |
2588 | journal->j_dev_bd = open_by_devnum(jdev, blkdev_mode, journal); | 2588 | journal->j_dev_bd = blkdev_get_by_dev(jdev, blkdev_mode, |
2589 | journal); | ||
2589 | journal->j_dev_mode = blkdev_mode; | 2590 | journal->j_dev_mode = blkdev_mode; |
2590 | if (IS_ERR(journal->j_dev_bd)) { | 2591 | if (IS_ERR(journal->j_dev_bd)) { |
2591 | result = PTR_ERR(journal->j_dev_bd); | 2592 | result = PTR_ERR(journal->j_dev_bd); |
@@ -2601,8 +2602,7 @@ static int journal_init_dev(struct super_block *super, | |||
2601 | } | 2602 | } |
2602 | 2603 | ||
2603 | journal->j_dev_mode = blkdev_mode; | 2604 | journal->j_dev_mode = blkdev_mode; |
2604 | journal->j_dev_bd = open_bdev_exclusive(jdev_name, | 2605 | journal->j_dev_bd = blkdev_get_by_path(jdev_name, blkdev_mode, journal); |
2605 | blkdev_mode, journal); | ||
2606 | if (IS_ERR(journal->j_dev_bd)) { | 2606 | if (IS_ERR(journal->j_dev_bd)) { |
2607 | result = PTR_ERR(journal->j_dev_bd); | 2607 | result = PTR_ERR(journal->j_dev_bd); |
2608 | journal->j_dev_bd = NULL; | 2608 | journal->j_dev_bd = NULL; |
diff --git a/fs/super.c b/fs/super.c index 22374bf0ba87..5d9a4497849a 100644 --- a/fs/super.c +++ b/fs/super.c | |||
@@ -766,13 +766,13 @@ struct dentry *mount_bdev(struct file_system_type *fs_type, | |||
766 | { | 766 | { |
767 | struct block_device *bdev; | 767 | struct block_device *bdev; |
768 | struct super_block *s; | 768 | struct super_block *s; |
769 | fmode_t mode = FMODE_READ; | 769 | fmode_t mode = FMODE_READ | FMODE_EXCL; |
770 | int error = 0; | 770 | int error = 0; |
771 | 771 | ||
772 | if (!(flags & MS_RDONLY)) | 772 | if (!(flags & MS_RDONLY)) |
773 | mode |= FMODE_WRITE; | 773 | mode |= FMODE_WRITE; |
774 | 774 | ||
775 | bdev = open_bdev_exclusive(dev_name, mode, fs_type); | 775 | bdev = blkdev_get_by_path(dev_name, mode, fs_type); |
776 | if (IS_ERR(bdev)) | 776 | if (IS_ERR(bdev)) |
777 | return ERR_CAST(bdev); | 777 | return ERR_CAST(bdev); |
778 | 778 | ||
@@ -807,7 +807,7 @@ struct dentry *mount_bdev(struct file_system_type *fs_type, | |||
807 | * holding an active reference. | 807 | * holding an active reference. |
808 | */ | 808 | */ |
809 | up_write(&s->s_umount); | 809 | up_write(&s->s_umount); |
810 | blkdev_put(bdev, mode | FMODE_EXCL); | 810 | blkdev_put(bdev, mode); |
811 | down_write(&s->s_umount); | 811 | down_write(&s->s_umount); |
812 | } else { | 812 | } else { |
813 | char b[BDEVNAME_SIZE]; | 813 | char b[BDEVNAME_SIZE]; |
@@ -831,7 +831,7 @@ struct dentry *mount_bdev(struct file_system_type *fs_type, | |||
831 | error_s: | 831 | error_s: |
832 | error = PTR_ERR(s); | 832 | error = PTR_ERR(s); |
833 | error_bdev: | 833 | error_bdev: |
834 | blkdev_put(bdev, mode | FMODE_EXCL); | 834 | blkdev_put(bdev, mode); |
835 | error: | 835 | error: |
836 | return ERR_PTR(error); | 836 | return ERR_PTR(error); |
837 | } | 837 | } |
@@ -862,6 +862,7 @@ void kill_block_super(struct super_block *sb) | |||
862 | bdev->bd_super = NULL; | 862 | bdev->bd_super = NULL; |
863 | generic_shutdown_super(sb); | 863 | generic_shutdown_super(sb); |
864 | sync_blockdev(bdev); | 864 | sync_blockdev(bdev); |
865 | WARN_ON_ONCE(!(mode & FMODE_EXCL)); | ||
865 | blkdev_put(bdev, mode | FMODE_EXCL); | 866 | blkdev_put(bdev, mode | FMODE_EXCL); |
866 | } | 867 | } |
867 | 868 | ||
diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index a1a6e5ceea67..9209cd199c47 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c | |||
@@ -609,7 +609,8 @@ xfs_blkdev_get( | |||
609 | { | 609 | { |
610 | int error = 0; | 610 | int error = 0; |
611 | 611 | ||
612 | *bdevp = open_bdev_exclusive(name, FMODE_READ|FMODE_WRITE, mp); | 612 | *bdevp = blkdev_get_by_path(name, FMODE_READ|FMODE_WRITE|FMODE_EXCL, |
613 | mp); | ||
613 | if (IS_ERR(*bdevp)) { | 614 | if (IS_ERR(*bdevp)) { |
614 | error = PTR_ERR(*bdevp); | 615 | error = PTR_ERR(*bdevp); |
615 | printk("XFS: Invalid device [%s], error=%d\n", name, error); | 616 | printk("XFS: Invalid device [%s], error=%d\n", name, error); |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 1a033e8ebe4c..f48501563917 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -2006,8 +2006,6 @@ extern struct block_device *bdgrab(struct block_device *bdev); | |||
2006 | extern void bd_set_size(struct block_device *, loff_t size); | 2006 | extern void bd_set_size(struct block_device *, loff_t size); |
2007 | extern void bd_forget(struct inode *inode); | 2007 | extern void bd_forget(struct inode *inode); |
2008 | extern void bdput(struct block_device *); | 2008 | extern void bdput(struct block_device *); |
2009 | extern struct block_device *open_by_devnum(dev_t dev, fmode_t mode, | ||
2010 | void *holder); | ||
2011 | extern void invalidate_bdev(struct block_device *); | 2009 | extern void invalidate_bdev(struct block_device *); |
2012 | extern int sync_blockdev(struct block_device *bdev); | 2010 | extern int sync_blockdev(struct block_device *bdev); |
2013 | extern struct super_block *freeze_bdev(struct block_device *); | 2011 | extern struct super_block *freeze_bdev(struct block_device *); |
@@ -2039,6 +2037,10 @@ extern int ioctl_by_bdev(struct block_device *, unsigned, unsigned long); | |||
2039 | extern int blkdev_ioctl(struct block_device *, fmode_t, unsigned, unsigned long); | 2037 | extern int blkdev_ioctl(struct block_device *, fmode_t, unsigned, unsigned long); |
2040 | extern long compat_blkdev_ioctl(struct file *, unsigned, unsigned long); | 2038 | extern long compat_blkdev_ioctl(struct file *, unsigned, unsigned long); |
2041 | extern int blkdev_get(struct block_device *bdev, fmode_t mode, void *holder); | 2039 | extern int blkdev_get(struct block_device *bdev, fmode_t mode, void *holder); |
2040 | extern struct block_device *blkdev_get_by_path(const char *path, fmode_t mode, | ||
2041 | void *holder); | ||
2042 | extern struct block_device *blkdev_get_by_dev(dev_t dev, fmode_t mode, | ||
2043 | void *holder); | ||
2042 | extern int blkdev_put(struct block_device *bdev, fmode_t mode); | 2044 | extern int blkdev_put(struct block_device *bdev, fmode_t mode); |
2043 | #ifdef CONFIG_SYSFS | 2045 | #ifdef CONFIG_SYSFS |
2044 | extern int bd_link_disk_holder(struct block_device *bdev, struct gendisk *disk); | 2046 | extern int bd_link_disk_holder(struct block_device *bdev, struct gendisk *disk); |
@@ -2083,7 +2085,6 @@ static inline void unregister_chrdev(unsigned int major, const char *name) | |||
2083 | extern const char *__bdevname(dev_t, char *buffer); | 2085 | extern const char *__bdevname(dev_t, char *buffer); |
2084 | extern const char *bdevname(struct block_device *bdev, char *buffer); | 2086 | extern const char *bdevname(struct block_device *bdev, char *buffer); |
2085 | extern struct block_device *lookup_bdev(const char *); | 2087 | extern struct block_device *lookup_bdev(const char *); |
2086 | extern struct block_device *open_bdev_exclusive(const char *, fmode_t, void *); | ||
2087 | extern void blkdev_show(struct seq_file *,off_t); | 2088 | extern void blkdev_show(struct seq_file *,off_t); |
2088 | 2089 | ||
2089 | #else | 2090 | #else |
diff --git a/kernel/power/swap.c b/kernel/power/swap.c index 513a77f1a0b3..b019609d1b45 100644 --- a/kernel/power/swap.c +++ b/kernel/power/swap.c | |||
@@ -907,8 +907,8 @@ int swsusp_check(void) | |||
907 | { | 907 | { |
908 | int error; | 908 | int error; |
909 | 909 | ||
910 | hib_resume_bdev = open_by_devnum(swsusp_resume_device, | 910 | hib_resume_bdev = blkdev_get_by_dev(swsusp_resume_device, |
911 | FMODE_READ, NULL); | 911 | FMODE_READ, NULL); |
912 | if (!IS_ERR(hib_resume_bdev)) { | 912 | if (!IS_ERR(hib_resume_bdev)) { |
913 | set_blocksize(hib_resume_bdev, PAGE_SIZE); | 913 | set_blocksize(hib_resume_bdev, PAGE_SIZE); |
914 | clear_page(swsusp_header); | 914 | clear_page(swsusp_header); |