]>
Commit | Line | Data |
---|---|---|
2cb7cef9 BS |
1 | Subject: Added flush_disk to factor out common buffer cache flushing code. |
2 | From: Andrew Patterson <andrew.patterson@hp.com> | |
3 | Date: Thu Oct 9 08:56:13 2008 +0200: | |
4 | Git: 56ade44b46780fa291fa68b824f1dafdcb11b0ca | |
5 | References: FATE#302348,FATE#303786 | |
6 | ||
7 | We need to be able to flush the buffer cache for for more than | |
8 | just when a disk is changed, so we factor out common cache flush code | |
9 | in check_disk_change() to an internal flush_disk() routine. This | |
10 | routine will then be used for both disk changes and disk resizes (in a | |
11 | later patch). | |
12 | ||
13 | Include the disk name in the text indicating that there are busy | |
14 | inodes on the device and increase the KERN severity of the message. | |
15 | ||
16 | Adapted for SLES11, based on the original commit. | |
17 | ||
18 | Signed-off-by: Andrew Patterson <andrew.patterson@hp.com> | |
19 | Signed-off-by: Jens Axboe <jens.axboe@oracle.com> | |
20 | Signed-off-by: Hannes Reinecke <hare@suse.de> | |
21 | --- | |
22 | fs/block_dev.c | 32 +++++++++++++++++++++++++++----- | |
23 | 1 files changed, 27 insertions(+), 5 deletions(-) | |
24 | ||
25 | diff --git a/fs/block_dev.c b/fs/block_dev.c | |
26 | index f8df73a..eb029ac 100644 | |
27 | --- a/fs/block_dev.c | |
28 | +++ b/fs/block_dev.c | |
29 | @@ -869,6 +869,32 @@ struct block_device *open_by_devnum(dev_t dev, unsigned mode) | |
30 | EXPORT_SYMBOL(open_by_devnum); | |
31 | ||
32 | /** | |
33 | + * flush_disk - invalidates all buffer-cache entries on a disk | |
34 | + * | |
35 | + * @bdev: struct block device to be flushed | |
36 | + * | |
37 | + * Invalidates all buffer-cache entries on a disk. It should be called | |
38 | + * when a disk has been changed -- either by a media change or online | |
39 | + * resize. | |
40 | + */ | |
41 | +static void flush_disk(struct block_device *bdev) | |
42 | +{ | |
43 | + if (__invalidate_device(bdev)) { | |
44 | + char name[BDEVNAME_SIZE] = ""; | |
45 | + | |
46 | + if (bdev->bd_disk) | |
47 | + disk_name(bdev->bd_disk, 0, name); | |
48 | + printk(KERN_WARNING "VFS: busy inodes on changed media or " | |
49 | + "resized disk %s\n", name); | |
50 | + } | |
51 | + | |
52 | + if (!bdev->bd_disk) | |
53 | + return; | |
54 | + if (bdev->bd_disk->minors > 1) | |
55 | + bdev->bd_invalidated = 1; | |
56 | +} | |
57 | + | |
58 | +/** | |
59 | * check_disk_size_change - checks for disk size change and adjusts | |
60 | * bdev size. | |
61 | * | |
62 | @@ -945,13 +971,9 @@ int check_disk_change(struct block_device *bdev) | |
63 | if (!bdops->media_changed(bdev->bd_disk)) | |
64 | return 0; | |
65 | ||
66 | - if (__invalidate_device(bdev)) | |
67 | - printk("VFS: busy inodes on changed media.\n"); | |
68 | - | |
69 | + flush_disk(bdev); | |
70 | if (bdops->revalidate_disk) | |
71 | bdops->revalidate_disk(bdev->bd_disk); | |
72 | - if (bdev->bd_disk->minors > 1) | |
73 | - bdev->bd_invalidated = 1; | |
74 | return 1; | |
75 | } | |
76 | ||
77 | -- | |
78 | 1.5.2.4 | |
79 |