Skip to contentSkip to conversation

Fixing random corruption in raw IO on 2.2.x kernel with bigmem enabled

PATCH Peng Dai 2 participants 2 messages Dec 6, 2000 VFS

lore
Share & tools
lore

Peng Dai

author
#0 lore raw

Hi,

This patch fixes a subtle corruption when doing raw IO on the 2.2.x kernel
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,

Quoted 7 lines

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

See http://marc.theaimsgroup.com/?l=linux-kernel&m=97038067229365&w=2
for the original description.

The corruption is caused by a bug in kiobuf_copy_bounce in fs/iobuf.c - the
bigmem page containing the user data is not always copied to its associated
bounce buffer. This would occur when an array of pages (>1) are passed to
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 (garbage)
pages to the raw device.

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

Regards,

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

fs/iobuf.c renamed from fs/iobuf.c.orig +4 -4
@@ -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);
#1 lore raw

Hi,

Quoted 4 lines · Peng Dai

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

That patch is already part of the full bugfixed raw IO patchset I posted out a few days ago. Look for kiobuf-2.2.18pre24-B.tar.gz in

ftp.uk.linux.org:/pub/linux/sct/fs/raw-io
or ftp.*.kernel.org:/pub/linux/kernel/people/sct/raw-io

Cheers,
Stephen
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
Please read the FAQ at http://www.tux.org/lkml/