From: davej@codemonkey.org.uk
We currently run sync_blockdev() on every close of a blockdev. This patch
arranges for the sync to happen only on the final close.
struct gendisk *disk = bdev->bd_disk;
down(&bdev->bd_sem);
- switch (kind) {
- case BDEV_FILE:
- case BDEV_FS:
- sync_blockdev(bd_inode->i_bdev);
- break;
- }
lock_kernel();
- if (!--bdev->bd_openers)
+ if (!--bdev->bd_openers) {
+ switch (kind) {
+ case BDEV_FILE:
+ case BDEV_FS:
+ sync_blockdev(bd_inode->i_bdev);
+ break;
+ }
kill_bdev(bdev);
+ }
if (bdev->bd_contains == bdev) {
if (disk->fops->release)
ret = disk->fops->release(bd_inode, NULL);