Skip to content

Commit

Permalink
Added flush_disk to factor out common buffer cache flushing code.
Browse files Browse the repository at this point in the history
We need to be able to flush the buffer cache for for more than
just when a disk is changed, so we factor out common cache flush code
in check_disk_change() to an internal flush_disk() routine.  This
routine will then be used for both disk changes and disk resizes (in a
later patch).

Include the disk name in the text indicating that there are busy
inodes on the device and increase the KERN severity of the message.

Signed-off-by: Andrew Patterson <andrew.patterson@hp.com>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
  • Loading branch information
Andrew Patterson authored and Jens Axboe committed Oct 9, 2008
1 parent f98a8ca commit 56ade44
Showing 1 changed file with 27 additions and 5 deletions.
32 changes: 27 additions & 5 deletions fs/block_dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -852,6 +852,32 @@ struct block_device *open_by_devnum(dev_t dev, unsigned mode)

EXPORT_SYMBOL(open_by_devnum);

/**
* flush_disk - invalidates all buffer-cache entries on a disk
*
* @bdev: struct block device to be flushed
*
* Invalidates all buffer-cache entries on a disk. It should be called
* when a disk has been changed -- either by a media change or online
* resize.
*/
static void flush_disk(struct block_device *bdev)
{
if (__invalidate_device(bdev)) {
char name[BDEVNAME_SIZE] = "";

if (bdev->bd_disk)
disk_name(bdev->bd_disk, 0, name);
printk(KERN_WARNING "VFS: busy inodes on changed media or "
"resized disk %s\n", name);
}

if (!bdev->bd_disk)
return;
if (disk_partitionable(bdev->bd_disk))
bdev->bd_invalidated = 1;
}

/**
* check_disk_size_change - checks for disk size change and adjusts
* bdev size.
Expand Down Expand Up @@ -929,13 +955,9 @@ int check_disk_change(struct block_device *bdev)
if (!bdops->media_changed(bdev->bd_disk))
return 0;

if (__invalidate_device(bdev))
printk("VFS: busy inodes on changed media.\n");

flush_disk(bdev);
if (bdops->revalidate_disk)
bdops->revalidate_disk(bdev->bd_disk);
if (disk_partitionable(bdev->bd_disk))
bdev->bd_invalidated = 1;
return 1;
}

Expand Down

0 comments on commit 56ade44

Please sign in to comment.