[lkml]   [2000]   [Dec]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
Patch in this message
SubjectFixing random corruption in raw IO on 2.2.x kernel with bigmem enabled

This patch fixes a subtle corruption when doing raw IO on the 2.2.x
with bigmem enabled. The problem was first reported by Markus Döhr while

running SAP DB on a variation of the 2.2.16 kernel with among others the

following patches installed,

> linux-2.2.16-rawio.patch
> linux-2.2.16-raw-fixup.patch
> linux-2.2.16-raw-fixup2.patch
> linux-2.2.16-bigmem.patch
> linux-2.2.16-bigmem-raw.patch
> linux-2.2.16-bigmem-dcache.patch
> linux-2.2.16-bigmem-initrd.patch

for the original description.

The corruption is caused by a bug in kiobuf_copy_bounce in fs/iobuf.c -
bigmem page containing the user data is not always copied to its
bounce buffer. This would occur when an array of pages (>1) are passed
kiobuf_copy_bounce and a normal page happens to appear before a bigmem
page in the array, which in turn leads to the writing of uninitialized
pages to the raw device.

The corruption happens rather infrequently. It has been reproduced both
the SAP DB and without. It appears that intense paging activity
increases its
chance of occurrence.


Peng Dai
Kernel Engineering Tel:
978-446-9166 ext. 276
Mission Critical Linux Inc. Fax:
100 Foot of John Email:
Lowell, MA 01852

--- linux/fs/iobuf.c.orig Tue Nov 28 13:54:26 2000
+++ linux/fs/iobuf.c Tue Nov 28 13:55:17 2000
@@ -213,10 +213,10 @@
unsigned long kin, kout;
int pagelen = length;

- if (bounce_page) {
- if ((pagelen+offset) > PAGE_SIZE)
- pagelen = PAGE_SIZE - offset;
+ if ((pagelen+offset) > PAGE_SIZE)
+ pagelen = PAGE_SIZE - offset;
+ if (bounce_page) {
if (direction == COPY_TO_BOUNCE) {
kin = kmap(page, KM_READ);
kout = kmap(bounce_page, KM_WRITE);
 \ /
  Last update: 2005-03-22 12:51    [W:0.036 / U:0.116 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site