diff options
| -rw-r--r-- | drivers/md/dm-table.c | 29 | ||||
| -rw-r--r-- | drivers/mtd/mtdsuper.c | 33 | ||||
| -rw-r--r-- | fs/block_dev.c | 1 |
3 files changed, 18 insertions, 45 deletions
diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c index 798e468103b8..61f441409234 100644 --- a/drivers/md/dm-table.c +++ b/drivers/md/dm-table.c | |||
| @@ -316,29 +316,12 @@ static inline int check_space(struct dm_table *t) | |||
| 316 | */ | 316 | */ |
| 317 | static int lookup_device(const char *path, dev_t *dev) | 317 | static int lookup_device(const char *path, dev_t *dev) |
| 318 | { | 318 | { |
| 319 | int r; | 319 | struct block_device *bdev = lookup_bdev(path); |
| 320 | struct nameidata nd; | 320 | if (IS_ERR(bdev)) |
| 321 | struct inode *inode; | 321 | return PTR_ERR(bdev); |
| 322 | 322 | *dev = bdev->bd_dev; | |
| 323 | if ((r = path_lookup(path, LOOKUP_FOLLOW, &nd))) | 323 | bdput(bdev); |
| 324 | return r; | 324 | return 0; |
| 325 | |||
| 326 | inode = nd.path.dentry->d_inode; | ||
| 327 | if (!inode) { | ||
| 328 | r = -ENOENT; | ||
| 329 | goto out; | ||
| 330 | } | ||
| 331 | |||
| 332 | if (!S_ISBLK(inode->i_mode)) { | ||
| 333 | r = -ENOTBLK; | ||
| 334 | goto out; | ||
| 335 | } | ||
| 336 | |||
| 337 | *dev = inode->i_rdev; | ||
| 338 | |||
| 339 | out: | ||
| 340 | path_put(&nd.path); | ||
| 341 | return r; | ||
| 342 | } | 325 | } |
| 343 | 326 | ||
| 344 | /* | 327 | /* |
diff --git a/drivers/mtd/mtdsuper.c b/drivers/mtd/mtdsuper.c index 28cc6787a800..9b6af7e74a65 100644 --- a/drivers/mtd/mtdsuper.c +++ b/drivers/mtd/mtdsuper.c | |||
| @@ -125,7 +125,7 @@ int get_sb_mtd(struct file_system_type *fs_type, int flags, | |||
| 125 | int (*fill_super)(struct super_block *, void *, int), | 125 | int (*fill_super)(struct super_block *, void *, int), |
| 126 | struct vfsmount *mnt) | 126 | struct vfsmount *mnt) |
| 127 | { | 127 | { |
| 128 | struct nameidata nd; | 128 | struct block_device *bdev; |
| 129 | int mtdnr, ret; | 129 | int mtdnr, ret; |
| 130 | 130 | ||
| 131 | if (!dev_name) | 131 | if (!dev_name) |
| @@ -181,29 +181,20 @@ int get_sb_mtd(struct file_system_type *fs_type, int flags, | |||
| 181 | /* try the old way - the hack where we allowed users to mount | 181 | /* try the old way - the hack where we allowed users to mount |
| 182 | * /dev/mtdblock$(n) but didn't actually _use_ the blockdev | 182 | * /dev/mtdblock$(n) but didn't actually _use_ the blockdev |
| 183 | */ | 183 | */ |
| 184 | ret = path_lookup(dev_name, LOOKUP_FOLLOW, &nd); | 184 | bdev = lookup_bdev(dev_name); |
| 185 | 185 | if (IS_ERR(bdev)) { | |
| 186 | DEBUG(1, "MTDSB: path_lookup() returned %d, inode %p\n", | 186 | ret = PTR_ERR(bdev); |
| 187 | ret, nd.path.dentry ? nd.path.dentry->d_inode : NULL); | 187 | DEBUG(1, "MTDSB: lookup_bdev() returned %d\n", ret); |
| 188 | |||
| 189 | if (ret) | ||
| 190 | return ret; | 188 | return ret; |
| 191 | |||
| 192 | ret = -EINVAL; | ||
| 193 | |||
| 194 | if (!S_ISBLK(nd.path.dentry->d_inode->i_mode)) | ||
| 195 | goto out; | ||
| 196 | |||
| 197 | if (nd.path.mnt->mnt_flags & MNT_NODEV) { | ||
| 198 | ret = -EACCES; | ||
| 199 | goto out; | ||
| 200 | } | 189 | } |
| 190 | DEBUG(1, "MTDSB: lookup_bdev() returned 0\n"); | ||
| 201 | 191 | ||
| 202 | if (imajor(nd.path.dentry->d_inode) != MTD_BLOCK_MAJOR) | 192 | ret = -EINVAL; |
| 193 | if (MAJOR(bdev->bd_dev) != MTD_BLOCK_MAJOR) | ||
| 203 | goto not_an_MTD_device; | 194 | goto not_an_MTD_device; |
| 204 | 195 | ||
| 205 | mtdnr = iminor(nd.path.dentry->d_inode); | 196 | mtdnr = MINOR(bdev->bd_dev); |
| 206 | path_put(&nd.path); | 197 | bdput(bdev); |
| 207 | 198 | ||
| 208 | return get_sb_mtd_nr(fs_type, flags, dev_name, data, mtdnr, fill_super, | 199 | return get_sb_mtd_nr(fs_type, flags, dev_name, data, mtdnr, fill_super, |
| 209 | mnt); | 200 | mnt); |
| @@ -213,10 +204,8 @@ not_an_MTD_device: | |||
| 213 | printk(KERN_NOTICE | 204 | printk(KERN_NOTICE |
| 214 | "MTD: Attempt to mount non-MTD device \"%s\"\n", | 205 | "MTD: Attempt to mount non-MTD device \"%s\"\n", |
| 215 | dev_name); | 206 | dev_name); |
| 216 | out: | 207 | bdput(bdev); |
| 217 | path_put(&nd.path); | ||
| 218 | return ret; | 208 | return ret; |
| 219 | |||
| 220 | } | 209 | } |
| 221 | 210 | ||
| 222 | EXPORT_SYMBOL_GPL(get_sb_mtd); | 211 | EXPORT_SYMBOL_GPL(get_sb_mtd); |
diff --git a/fs/block_dev.c b/fs/block_dev.c index e664b0b70489..aff54219e049 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c | |||
| @@ -1236,6 +1236,7 @@ fail: | |||
| 1236 | bdev = ERR_PTR(error); | 1236 | bdev = ERR_PTR(error); |
| 1237 | goto out; | 1237 | goto out; |
| 1238 | } | 1238 | } |
| 1239 | EXPORT_SYMBOL(lookup_bdev); | ||
| 1239 | 1240 | ||
| 1240 | /** | 1241 | /** |
| 1241 | * open_bdev_excl - open a block device by name and set it up for use | 1242 | * open_bdev_excl - open a block device by name and set it up for use |
