struct block_device *bdev = I_BDEV(inode);
free_percpu(bdev->bd_stats);
+ kfree(bdev->bd_meta_info);
kmem_cache_free(bdev_cachep, BDEV_I(inode));
}
}
EXPORT_SYMBOL(bdgrab);
-struct block_device *bdget_part(struct hd_struct *part)
-{
- return bdget(part_devt(part));
-}
-
long nr_blockdev_pages(void)
{
struct inode *inode;
WARN_ON_ONCE(!bdev->bd_holder);
/* FIXME: remove the following once add_disk() handles errors */
- if (WARN_ON(!disk->slave_dir || !bdev->bd_part->holder_dir))
+ if (WARN_ON(!disk->slave_dir || !bdev->bd_holder_dir))
goto out_unlock;
holder = bd_find_holder_disk(bdev, disk);
if (ret)
goto out_free;
- ret = add_symlink(bdev->bd_part->holder_dir, &disk_to_dev(disk)->kobj);
+ ret = add_symlink(bdev->bd_holder_dir, &disk_to_dev(disk)->kobj);
if (ret)
goto out_del;
/*
* bdev could be deleted beneath us which would implicitly destroy
* the holder directory. Hold on to it.
*/
- kobject_get(bdev->bd_part->holder_dir);
+ kobject_get(bdev->bd_holder_dir);
list_add(&holder->list, &bdev->bd_holder_disks);
goto out_unlock;
if (!WARN_ON_ONCE(holder == NULL) && !--holder->refcnt) {
del_symlink(disk->slave_dir, bdev_kobj(bdev));
- del_symlink(bdev->bd_part->holder_dir,
- &disk_to_dev(disk)->kobj);
- kobject_put(bdev->bd_part->holder_dir);
+ del_symlink(bdev->bd_holder_dir, &disk_to_dev(disk)->kobj);
+ kobject_put(bdev->bd_holder_dir);
list_del_init(&holder->list);
kfree(holder);
}
static int __blkdev_get(struct block_device *bdev, fmode_t mode)
{
struct gendisk *disk = bdev->bd_disk;
- int ret;
+ int ret = 0;
if (!bdev->bd_openers) {
if (!bdev_is_partition(bdev)) {
- ret = -ENXIO;
- bdev->bd_part = disk_get_part(disk, 0);
- if (!bdev->bd_part)
- goto out_clear;
-
ret = 0;
if (disk->fops->open)
ret = disk->fops->open(bdev, mode);
bdev_disk_changed(bdev, ret == -ENOMEDIUM);
if (ret)
- goto out_clear;
+ return ret;
} else {
- struct block_device *whole = bdget_disk(disk, 0);
+ struct block_device *whole = bdgrab(disk->part0);
mutex_lock_nested(&whole->bd_mutex, 1);
ret = __blkdev_get(whole, mode);
if (ret) {
mutex_unlock(&whole->bd_mutex);
bdput(whole);
- goto out_clear;
+ return ret;
}
whole->bd_part_count++;
mutex_unlock(&whole->bd_mutex);
- bdev->bd_part = disk_get_part(disk, bdev->bd_partno);
if (!(disk->flags & GENHD_FL_UP) ||
- !bdev->bd_part || !bdev_nr_sectors(bdev)) {
+ !bdev_nr_sectors(bdev)) {
__blkdev_put(whole, mode, 1);
bdput(whole);
- ret = -ENXIO;
- goto out_clear;
+ return -ENXIO;
}
set_init_blocksize(bdev);
}
bdev->bd_bdi = bdi_get(disk->queue->backing_dev_info);
} else {
if (!bdev_is_partition(bdev)) {
- ret = 0;
if (bdev->bd_disk->fops->open)
ret = bdev->bd_disk->fops->open(bdev, mode);
/* the same as first opener case, read comment there */
}
bdev->bd_openers++;
return 0;
-
- out_clear:
- disk_put_part(bdev->bd_part);
- bdev->bd_part = NULL;
- return ret;
}
struct block_device *blkdev_get_no_open(dev_t dev)
sync_blockdev(bdev);
kill_bdev(bdev);
bdev_write_inode(bdev);
-
- if (!bdev_is_partition(bdev) && disk->fops->release)
- disk->fops->release(disk, mode);
-
- disk_put_part(bdev->bd_part);
- bdev->bd_part = NULL;
if (bdev_is_partition(bdev))
victim = bdev_whole(bdev);
- } else {
- if (!bdev_is_partition(bdev) && disk->fops->release)
- disk->fops->release(disk, mode);
}
+
+ if (!bdev_is_partition(bdev) && disk->fops->release)
+ disk->fops->release(disk, mode);
mutex_unlock(&bdev->bd_mutex);
if (victim) {
__blkdev_put(victim, mode, 1);