diff options
Diffstat (limited to 'fs/block_dev.c')
-rw-r--r-- | fs/block_dev.c | 18 |
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; |