Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 33626
b: refs/heads/master
c: 6946bd6
h: refs/heads/master
v: v3
  • Loading branch information
Peter Zijlstra authored and Linus Torvalds committed Aug 27, 2006
1 parent e5c9203 commit 1e4f1be
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 59 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 7334bb4ae931159384acf168eacb0d5d6e0d083c
refs/heads/master: 6946bd636364effce06ea46fe8f8cd6e2edb004e
114 changes: 56 additions & 58 deletions trunk/fs/block_dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -884,6 +884,61 @@ void bd_set_size(struct block_device *bdev, loff_t size)
}
EXPORT_SYMBOL(bd_set_size);

static int __blkdev_put(struct block_device *bdev, unsigned int subclass)
{
int ret = 0;
struct inode *bd_inode = bdev->bd_inode;
struct gendisk *disk = bdev->bd_disk;

mutex_lock_nested(&bdev->bd_mutex, subclass);
lock_kernel();
if (!--bdev->bd_openers) {
sync_blockdev(bdev);
kill_bdev(bdev);
}
if (bdev->bd_contains == bdev) {
if (disk->fops->release)
ret = disk->fops->release(bd_inode, NULL);
} else {
mutex_lock_nested(&bdev->bd_contains->bd_mutex,
subclass + 1);
bdev->bd_contains->bd_part_count--;
mutex_unlock(&bdev->bd_contains->bd_mutex);
}
if (!bdev->bd_openers) {
struct module *owner = disk->fops->owner;

put_disk(disk);
module_put(owner);

if (bdev->bd_contains != bdev) {
kobject_put(&bdev->bd_part->kobj);
bdev->bd_part = NULL;
}
bdev->bd_disk = NULL;
bdev->bd_inode->i_data.backing_dev_info = &default_backing_dev_info;
if (bdev != bdev->bd_contains)
__blkdev_put(bdev->bd_contains, subclass + 1);
bdev->bd_contains = NULL;
}
unlock_kernel();
mutex_unlock(&bdev->bd_mutex);
bdput(bdev);
return ret;
}

int blkdev_put(struct block_device *bdev)
{
return __blkdev_put(bdev, BD_MUTEX_NORMAL);
}
EXPORT_SYMBOL(blkdev_put);

int blkdev_put_partition(struct block_device *bdev)
{
return __blkdev_put(bdev, BD_MUTEX_PARTITION);
}
EXPORT_SYMBOL(blkdev_put_partition);

static int
blkdev_get_whole(struct block_device *bdev, mode_t mode, unsigned flags);

Expand Down Expand Up @@ -980,7 +1035,7 @@ do_open(struct block_device *bdev, struct file *file, unsigned int subclass)
bdev->bd_disk = NULL;
bdev->bd_inode->i_data.backing_dev_info = &default_backing_dev_info;
if (bdev != bdev->bd_contains)
blkdev_put(bdev->bd_contains);
__blkdev_put(bdev->bd_contains, BD_MUTEX_WHOLE);
bdev->bd_contains = NULL;
put_disk(disk);
module_put(owner);
Expand Down Expand Up @@ -1079,63 +1134,6 @@ static int blkdev_open(struct inode * inode, struct file * filp)
return res;
}

static int __blkdev_put(struct block_device *bdev, unsigned int subclass)
{
int ret = 0;
struct inode *bd_inode = bdev->bd_inode;
struct gendisk *disk = bdev->bd_disk;

mutex_lock_nested(&bdev->bd_mutex, subclass);
lock_kernel();
if (!--bdev->bd_openers) {
sync_blockdev(bdev);
kill_bdev(bdev);
}
if (bdev->bd_contains == bdev) {
if (disk->fops->release)
ret = disk->fops->release(bd_inode, NULL);
} else {
mutex_lock_nested(&bdev->bd_contains->bd_mutex,
subclass + 1);
bdev->bd_contains->bd_part_count--;
mutex_unlock(&bdev->bd_contains->bd_mutex);
}
if (!bdev->bd_openers) {
struct module *owner = disk->fops->owner;

put_disk(disk);
module_put(owner);

if (bdev->bd_contains != bdev) {
kobject_put(&bdev->bd_part->kobj);
bdev->bd_part = NULL;
}
bdev->bd_disk = NULL;
bdev->bd_inode->i_data.backing_dev_info = &default_backing_dev_info;
if (bdev != bdev->bd_contains)
__blkdev_put(bdev->bd_contains, subclass + 1);
bdev->bd_contains = NULL;
}
unlock_kernel();
mutex_unlock(&bdev->bd_mutex);
bdput(bdev);
return ret;
}

int blkdev_put(struct block_device *bdev)
{
return __blkdev_put(bdev, BD_MUTEX_NORMAL);
}

EXPORT_SYMBOL(blkdev_put);

int blkdev_put_partition(struct block_device *bdev)
{
return __blkdev_put(bdev, BD_MUTEX_PARTITION);
}

EXPORT_SYMBOL(blkdev_put_partition);

static int blkdev_close(struct inode * inode, struct file * filp)
{
struct block_device *bdev = I_BDEV(filp->f_mapping->host);
Expand Down

0 comments on commit 1e4f1be

Please sign in to comment.