aboutsummaryrefslogtreecommitdiffstats
path: root/fs/block_dev.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/block_dev.c')
-rw-r--r--fs/block_dev.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/fs/block_dev.c b/fs/block_dev.c
index b9022694e9f7..73b6ce47c861 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -1033,8 +1033,13 @@ static int do_open(struct block_device *bdev, struct file *file, int for_part)
1033 bdev->bd_contains = bdev; 1033 bdev->bd_contains = bdev;
1034 if (!partno) { 1034 if (!partno) {
1035 struct backing_dev_info *bdi; 1035 struct backing_dev_info *bdi;
1036 if (disk->fops->__open) {
1037 ret = disk->fops->__open(bdev->bd_inode, file);
1038 if (ret)
1039 goto out_first;
1040 }
1036 if (disk->fops->open) { 1041 if (disk->fops->open) {
1037 ret = disk->fops->open(bdev->bd_inode, file); 1042 ret = disk->fops->open(bdev, file->f_mode);
1038 if (ret) 1043 if (ret)
1039 goto out_clear; 1044 goto out_clear;
1040 } 1045 }
@@ -1074,8 +1079,13 @@ static int do_open(struct block_device *bdev, struct file *file, int for_part)
1074 part = NULL; 1079 part = NULL;
1075 disk = NULL; 1080 disk = NULL;
1076 if (bdev->bd_contains == bdev) { 1081 if (bdev->bd_contains == bdev) {
1082 if (bdev->bd_disk->fops->__open) {
1083 ret = bdev->bd_disk->fops->__open(bdev->bd_inode, file);
1084 if (ret)
1085 goto out;
1086 }
1077 if (bdev->bd_disk->fops->open) { 1087 if (bdev->bd_disk->fops->open) {
1078 ret = bdev->bd_disk->fops->open(bdev->bd_inode, file); 1088 ret = bdev->bd_disk->fops->open(bdev, file->f_mode);
1079 if (ret) 1089 if (ret)
1080 goto out_unlock_bdev; 1090 goto out_unlock_bdev;
1081 } 1091 }
@@ -1184,8 +1194,10 @@ static int __blkdev_put(struct block_device *bdev, int for_part)
1184 kill_bdev(bdev); 1194 kill_bdev(bdev);
1185 } 1195 }
1186 if (bdev->bd_contains == bdev) { 1196 if (bdev->bd_contains == bdev) {
1197 if (disk->fops->__release)
1198 ret = disk->fops->__release(bd_inode, NULL);
1187 if (disk->fops->release) 1199 if (disk->fops->release)
1188 ret = disk->fops->release(bd_inode, NULL); 1200 ret = disk->fops->release(disk, 0);
1189 } 1201 }
1190 if (!bdev->bd_openers) { 1202 if (!bdev->bd_openers) {
1191 struct module *owner = disk->fops->owner; 1203 struct module *owner = disk->fops->owner;