]> git.ipfire.org Git - people/teissler/ipfire-2.x.git/blobdiff - src/patches/suse-2.6.27.31/patches.drivers/bdev-resize-call-flush_disk
Reenabled linux-xen, added patches for Xen Kernel Version 2.6.27.31,
[people/teissler/ipfire-2.x.git] / src / patches / suse-2.6.27.31 / patches.drivers / bdev-resize-call-flush_disk
diff --git a/src/patches/suse-2.6.27.31/patches.drivers/bdev-resize-call-flush_disk b/src/patches/suse-2.6.27.31/patches.drivers/bdev-resize-call-flush_disk
new file mode 100644 (file)
index 0000000..297f18c
--- /dev/null
@@ -0,0 +1,48 @@
+Subject: Call flush_disk() after detecting an online resize.
+From: Andrew Patterson <andrew.patterson@hp.com>
+Date: Thu Oct 9 08:56:13 2008 +0200:
+Git: 608aeef17a91747d6303de4df5e2c2e6899a95e8
+References: FATE#302348,FATE#303786
+
+We call flush_disk() to make sure the buffer cache for the disk is
+flushed after a disk resize. There are two resize cases, growing and
+shrinking. Given that users can shrink/then grow a disk before
+revalidate_disk() is called, we treat the grow case identically to
+shrinking. We need to flush the buffer cache after an online shrink
+because, as James Bottomley puts it,
+
+     The two use cases for shrinking I can see are
+
+     1. planned: the fs is already shrunk to within the new boundaries
+        and all data is relocated, so invalidate is fine (any dirty
+        buffers that might exist in the shrunk region are there only
+        because they were relocated but not yet written to their
+        original location).
+     2. unplanned:  In this case, the fs is probably toast, so whether
+        we invalidate or not isn't going to make a whole lot of
+        difference; it's still going to try to read or write from
+        sectors beyond the new size and get I/O errors.
+
+Immediately invalidating shrunk disks will cause errors for outstanding
+I/Os for reads/write beyond the new end of the disk to be generated
+earlier then if we waited for the normal buffer cache operation. It also
+removes a potential security hole where we might keep old data around
+from beyond the end of the shrunk disk if the disk was not invalidated.
+
+Signed-off-by: Andrew Patterson <andrew.patterson@hp.com>
+Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
+Signed-off-by: Hannes Reinecke <hare@suse.de>
+---
+ fs/block_dev.c |    1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/fs/block_dev.c
++++ b/fs/block_dev.c
+@@ -918,6 +918,7 @@ void check_disk_size_change(struct gendi
+                      "%s: detected capacity change from %lld to %lld\n",
+                      name, bdev_size, disk_size);
+               i_size_write(bdev->bd_inode, disk_size);
++              flush_disk(bdev);
+       }
+ }
+ EXPORT_SYMBOL(check_disk_size_change);