The Linux Kernel Mailing List
 help / color / mirror / Atom feed
* oops with 2.5.1-pre3 in ide-scsi module
@ 2001-11-29 18:19 Dirk Pritsch
  2001-11-29 18:38 ` Slo Mo Snail
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Dirk Pritsch @ 2001-11-29 18:19 UTC (permalink / raw)
  To: linux-kernel

Hi,

just tried the new 2.5.1-pre3 and got the following oops when trying to
burn a cd (ide-cd/rw with ide-scsi emulation).

I Hope this is some useful information.


____
ksymoops 2.4.3 on i586 2.5.1-pre3.  Options used
     -V (default)
     -k /proc/ksyms (default)
     -l /proc/modules (default)
     -o /lib/modules/2.5.1-pre3/ (default)
     -m /boot/System.map-2.5.1-pre3 (default)

Warning: You did not tell me where to find
symbol information.  I will
assume that the log matches the kernel and
modules that are running
right now and I'll use the default options
above for symbol resolution.
If the current kernel and/or modules do not
match the log, you can get
more accurate output by telling me the kernel
version and where to find
map, modules, ksyms etc.  ksymoops -h explains
the options.


Unable to handle kernel NULL pointer dereference at virtual address
00000038
c01af582
*pde = 00000000
Oops: 0000
CPU:    0
EIP:    0010:[idescsi_queue+1158/1396]    Not tainted
EFLAGS: 00210002
eax: 00000000   ebx: d3f64320   ecx: d3f64ea0   edx: 00000000
esi: c0989000   edi: d3f64ea0   ebp: d3f64320   esp: c7321cc4
ds: 0018   es: 0018   ss: 0018
Process cdrecord (pid: 1055, stackpage=c7321000)
Stack: 00200293 d36761d4 d3eef800 d3f2dba0 00000000 c8a76ee0 d3eef858 c0989000 
       00000001 00000000 c7d5d3c0 c150eee0 c02c3be4 c01a7309 d3eef800 c01a77b4 
       d3eef800 d36761d4 d3eef8b8 d36761d4 00000000 c01ac422 d3eef800 d3eef800 
Call Trace: [scsi_dispatch_cmd+257/372] [scsi_done+0/144] [scsi_request_fn+786/808] [__scsi_in sert_special+118/128] [scsi_insert_special_req+25/32] 
Code: 03 42 38 89 46 00 83 c6 14 89 74 24 1c 83 6c 24 20 01 73 bf 
Using defaults from ksymoops -t elf32-i386 -a i386

Code;  00000000 Before first symbol
00000000 <_EIP>:
Code;  00000000 Before first symbol
   0:   03 42 38                  add    0x38(%edx),%eax
Code;  00000002 Before first symbol
   3:   89 46 00                  mov    %eax,0x0(%esi)
Code;  00000006 Before first symbol
   6:   83 c6 14                  add    $0x14,%esi
Code;  00000008 Before first symbol
   9:   89 74 24 1c               mov %esi,0x1c(%esp,1)
Code;  0000000c Before first symbol
   d:   83 6c 24 20 01            subl $0x1,0x20(%esp,1)
Code;  00000012 Before first symbol
  12:   73 bf                     jae ffffffd3 <_EIP+0xffffffd3> ffffffd2 <END_OF_CODE+2af53fd0/????>


1 warning issued.  Results may not be reliable.
____

After the oops the following message appeared in syslog:

Nov 29 18:06:01 enterprise kernel:  <6>scsi: device set offline -
command error recover failed: host 0 channel 0 id 0 lun 0

____

lsmod shows no loaded ide-scsi or cdrom modules, so the oops happened
before loading them.

____




Please CC: me in replies or if you need further information as I'm not
subscribed to l-k.


Cheers,

Dirk


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: oops with 2.5.1-pre3 in ide-scsi module
  2001-11-29 18:19 oops with 2.5.1-pre3 in ide-scsi module Dirk Pritsch
@ 2001-11-29 18:38 ` Slo Mo Snail
  2001-11-29 18:39 ` Jens Axboe
       [not found] ` <200111291838.fATIcHNO029528@einhorn.in-berlin.de>
  2 siblings, 0 replies; 7+ messages in thread
From: Slo Mo Snail @ 2001-11-29 18:38 UTC (permalink / raw)
  To: Dirk Pritsch; +Cc: linux-kernel

[-- Attachment #1: Type: text/plain, Size: 4156 bytes --]

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi,
Have you applied any other patches than the 2.5.1-pre3?
If/When not you'll probably get some data corruption :(
Please apply the 2 Patches attatched and
http://kernel.org/pub/linux/kernel/people/axboe/patches/v2.5/2.5.1-pre3/bio-pre3-1.gz
Then recompile your kernel ;)
These patches were posted before by Alan Cox and Jens Axboe

CD burning works fine for me with this patches but I have compiled all SCSI 
and IDE stuff directly into the kernel... maybe this matters
Bye

Am Donnerstag, 29. November 2001 19:19 schrieb Dirk Pritsch:
> Hi,
>
> just tried the new 2.5.1-pre3 and got the following oops when trying to
> burn a cd (ide-cd/rw with ide-scsi emulation).
>
> I Hope this is some useful information.
>
>
> ____
> ksymoops 2.4.3 on i586 2.5.1-pre3.  Options used
>      -V (default)
>      -k /proc/ksyms (default)
>      -l /proc/modules (default)
>      -o /lib/modules/2.5.1-pre3/ (default)
>      -m /boot/System.map-2.5.1-pre3 (default)
>
> Warning: You did not tell me where to find
> symbol information.  I will
> assume that the log matches the kernel and
> modules that are running
> right now and I'll use the default options
> above for symbol resolution.
> If the current kernel and/or modules do not
> match the log, you can get
> more accurate output by telling me the kernel
> version and where to find
> map, modules, ksyms etc.  ksymoops -h explains
> the options.
>
>
> Unable to handle kernel NULL pointer dereference at virtual address
> 00000038
> c01af582
> *pde = 00000000
> Oops: 0000
> CPU:    0
> EIP:    0010:[idescsi_queue+1158/1396]    Not tainted
> EFLAGS: 00210002
> eax: 00000000   ebx: d3f64320   ecx: d3f64ea0   edx: 00000000
> esi: c0989000   edi: d3f64ea0   ebp: d3f64320   esp: c7321cc4
> ds: 0018   es: 0018   ss: 0018
> Process cdrecord (pid: 1055, stackpage=c7321000)
> Stack: 00200293 d36761d4 d3eef800 d3f2dba0 00000000 c8a76ee0 d3eef858
> c0989000 00000001 00000000 c7d5d3c0 c150eee0 c02c3be4 c01a7309 d3eef800
> c01a77b4 d3eef800 d36761d4 d3eef8b8 d36761d4 00000000 c01ac422 d3eef800
> d3eef800 Call Trace: [scsi_dispatch_cmd+257/372] [scsi_done+0/144]
> [scsi_request_fn+786/808] [__scsi_in sert_special+118/128]
> [scsi_insert_special_req+25/32] Code: 03 42 38 89 46 00 83 c6 14 89 74 24
> 1c 83 6c 24 20 01 73 bf
> Using defaults from ksymoops -t elf32-i386 -a i386
>
> Code;  00000000 Before first symbol
> 00000000 <_EIP>:
> Code;  00000000 Before first symbol
>    0:   03 42 38                  add    0x38(%edx),%eax
> Code;  00000002 Before first symbol
>    3:   89 46 00                  mov    %eax,0x0(%esi)
> Code;  00000006 Before first symbol
>    6:   83 c6 14                  add    $0x14,%esi
> Code;  00000008 Before first symbol
>    9:   89 74 24 1c               mov %esi,0x1c(%esp,1)
> Code;  0000000c Before first symbol
>    d:   83 6c 24 20 01            subl $0x1,0x20(%esp,1)
> Code;  00000012 Before first symbol
>   12:   73 bf                     jae ffffffd3 <_EIP+0xffffffd3> ffffffd2
> <END_OF_CODE+2af53fd0/????>
>
>
> 1 warning issued.  Results may not be reliable.
> ____
>
> After the oops the following message appeared in syslog:
>
> Nov 29 18:06:01 enterprise kernel:  <6>scsi: device set offline -
> command error recover failed: host 0 channel 0 id 0 lun 0
>
> ____
>
> lsmod shows no loaded ide-scsi or cdrom modules, so the oops happened
> before loading them.
>
> ____
>
>
>
>
> Please CC: me in replies or if you need further information as I'm not
> subscribed to l-k.
>
>
> Cheers,
>
> Dirk
>
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: For info see http://www.gnupg.org

iD8DBQE8BoCwvIHrJes3kVIRAmvGAJ9RATNkAHklG/lr8zzP42y9hsNUvgCcCxP6
Y1/zljBJTzZFvFEb0goURGA=
=TlL+
-----END PGP SIGNATURE-----

[-- Attachment #2: axboe.diff --]
[-- Type: text/x-diff, Size: 16156 bytes --]

diff -ur -X exclude /opt/kernel/linux-2.5.1-pre3/drivers/block/elevator.c linux/drivers/block/elevator.c
--- /opt/kernel/linux-2.5.1-pre3/drivers/block/elevator.c	Thu Nov 29 06:07:20 2001
+++ linux/drivers/block/elevator.c	Thu Nov 29 04:36:29 2001
@@ -98,7 +98,7 @@
 {
 	if (bio_data_dir(bio) == rq->cmd) {
 		if (rq->rq_dev == bio->bi_dev && !rq->waiting
-		    && !rq->special && rq->inactive && rq->q == q)
+		    && !rq->special && rq->inactive)
 			return 1;
 	}
 
diff -ur -X exclude /opt/kernel/linux-2.5.1-pre3/drivers/block/floppy.c linux/drivers/block/floppy.c
--- /opt/kernel/linux-2.5.1-pre3/drivers/block/floppy.c	Thu Nov 29 06:07:20 2001
+++ linux/drivers/block/floppy.c	Thu Nov 29 05:07:37 2001
@@ -2437,16 +2437,15 @@
 	char *base;
 
 	base = CURRENT->buffer;
-	size = CURRENT->current_nr_sectors << 9;
-	bio = CURRENT->bio;
+	size = 0;
 
-	if (bio){
-		bio = bio->bi_next;
-		while (bio && bio_data(bio) == base + size){
-			size += bio_size(bio);
-			bio = bio->bi_next;
-		}
+	rq_for_each_bio(bio, CURRENT) {
+		if (bio_data(bio) != base + size)
+			break;
+
+		size += bio->bi_size;
 	}
+
 	return size >> 9;
 }
 
@@ -2543,7 +2542,7 @@
 			break;
 		}
 #endif
-		size = bio_size(bio);
+		size = bio->bi_size;;
 		buffer = bio_data(bio);
 	}
 #ifdef FLOPPY_SANITY_CHECK
diff -ur -X exclude /opt/kernel/linux-2.5.1-pre3/drivers/block/ll_rw_blk.c linux/drivers/block/ll_rw_blk.c
--- /opt/kernel/linux-2.5.1-pre3/drivers/block/ll_rw_blk.c	Thu Nov 29 06:07:20 2001
+++ linux/drivers/block/ll_rw_blk.c	Thu Nov 29 06:02:17 2001
@@ -303,10 +303,7 @@
 
 			BIO_BUG_ON(i > bio->bi_vcnt);
 
-			if (!cluster)
-				goto new_segment;
-
-			if (bvec_to_phys(bvec) == lastend) {
+			if (cluster && bvec_to_phys(bvec) == lastend) {
 				if (sg[nsegs - 1].length + nbytes > q->max_segment_size)
 					goto new_segment;
 
@@ -1135,7 +1132,7 @@
 	BUG_ON(!bio->bi_end_io);
 
 	BIO_BUG_ON(bio_offset(bio) > PAGE_SIZE);
-	BIO_BUG_ON(!bio_size(bio));
+	BIO_BUG_ON(!bio->bi_size);
 	BIO_BUG_ON(!bio->bi_io_vec);
 
 	bio->bi_rw = rw;
@@ -1172,11 +1169,7 @@
 	bio = bio_alloc(GFP_NOIO, 1);
 
 	bio->bi_sector = bh->b_blocknr * (bh->b_size >> 9);
-	bio->bi_next = NULL;
 	bio->bi_dev = bh->b_dev;
-	bio->bi_private = bh;
-	bio->bi_end_io = end_bio_bh_io_sync;
-
 	bio->bi_io_vec[0].bv_page = bh->b_page;
 	bio->bi_io_vec[0].bv_len = bh->b_size;
 	bio->bi_io_vec[0].bv_offset = bh_offset(bh);
@@ -1184,6 +1177,9 @@
 	bio->bi_vcnt = 1;
 	bio->bi_idx = 0;
 	bio->bi_size = bh->b_size;
+
+	bio->bi_end_io = end_bio_bh_io_sync;
+	bio->bi_private = bh;
 
 	return submit_bio(rw, bio);
 }
diff -ur -X exclude /opt/kernel/linux-2.5.1-pre3/drivers/block/loop.c linux/drivers/block/loop.c
--- /opt/kernel/linux-2.5.1-pre3/drivers/block/loop.c	Thu Nov 29 06:07:20 2001
+++ linux/drivers/block/loop.c	Thu Nov 29 05:08:06 2001
@@ -182,7 +182,7 @@
 	down(&mapping->host->i_sem);
 	index = pos >> PAGE_CACHE_SHIFT;
 	offset = pos & (PAGE_CACHE_SIZE - 1);
-	len = bio_size(bio);
+	len = bio->bi_size;
 	data = bio_data(bio);
 	while (len > 0) {
 		int IV = index * (PAGE_CACHE_SIZE/bsize) + offset/bsize;
@@ -272,7 +272,7 @@
 	cookie.data = bio_data(bio);
 	cookie.bsize = bsize;
 	desc.written = 0;
-	desc.count = bio_size(bio);
+	desc.count = bio->bi_size;
 	desc.buf = (char*)&cookie;
 	desc.error = 0;
 	spin_lock_irq(&lo->lo_lock);
@@ -470,7 +470,7 @@
 	IV = loop_get_iv(lo, rbh->bi_sector);
 	if (rw == WRITE) {
 		if (lo_do_transfer(lo, WRITE, bio_data(bh), bio_data(rbh),
-				   bio_size(bh), IV))
+				   bh->bi_size, IV))
 			goto err;
 	}
 
@@ -504,7 +504,7 @@
 		unsigned long IV = loop_get_iv(lo, rbh->bi_sector);
 
 		ret = lo_do_transfer(lo, READ, bio_data(bio), bio_data(rbh),
-				     bio_size(bio), IV);
+				     bio->bi_size, IV);
 
 		bio_endio(rbh, !ret, bio_sectors(bio));
 		loop_put_buffer(bio);
diff -ur -X exclude /opt/kernel/linux-2.5.1-pre3/drivers/block/nbd.c linux/drivers/block/nbd.c
--- /opt/kernel/linux-2.5.1-pre3/drivers/block/nbd.c	Thu Nov 29 06:07:20 2001
+++ linux/drivers/block/nbd.c	Thu Nov 29 05:04:41 2001
@@ -168,7 +168,7 @@
 		struct bio *bio = req->bio;
 		DEBUG("data, ");
 		do {
-			result = nbd_xmit(1, sock, bio_data(bio), bio_size(bio), bio->bi_next == NULL ? 0 : MSG_MORE);
+			result = nbd_xmit(1, sock, bio_data(bio), bio->bi_size, bio->bi_next == NULL ? 0 : MSG_MORE);
 			if (result <= 0)
 				FAIL("Send data failed.");
 			bio = bio->bi_next;
@@ -208,7 +208,7 @@
 		struct bio *bio = req->bio;
 		DEBUG("data, ");
 		do {
-			result = nbd_xmit(0, lo->sock, bio_data(bio), bio_size(bio), MSG_WAITALL);
+			result = nbd_xmit(0, lo->sock, bio_data(bio), bio->bi_size, MSG_WAITALL);
 			if (result <= 0)
 				HARDFAIL("Recv data failed.");
 			bio = bio->bi_next;
diff -ur -X exclude /opt/kernel/linux-2.5.1-pre3/drivers/md/lvm.c linux/drivers/md/lvm.c
--- /opt/kernel/linux-2.5.1-pre3/drivers/md/lvm.c	Thu Nov 29 06:07:21 2001
+++ linux/drivers/md/lvm.c	Thu Nov 29 05:50:47 2001
@@ -1246,8 +1246,6 @@
  	}
 
  out:
-	if (test_bit(BIO_HASHED, &bh->bi_flags))
-		BUG();
 	bh->bi_dev = rdev_map;
 	bh->bi_sector = rsector_map;
 	up_read(&lv->lv_lock);
diff -ur -X exclude /opt/kernel/linux-2.5.1-pre3/drivers/message/i2o/i2o_block.c linux/drivers/message/i2o/i2o_block.c
--- /opt/kernel/linux-2.5.1-pre3/drivers/message/i2o/i2o_block.c	Thu Nov 29 06:07:21 2001
+++ linux/drivers/message/i2o/i2o_block.c	Thu Nov 29 05:14:13 2001
@@ -287,8 +287,8 @@
 		while(bio)
 		{
 			if (bio_to_phys(bio) == last) {
-				size += bio_size(bio);
-				last += bio_size(bio);
+				size += bio->bi_size;
+				last += bio->bi_size;
 				if(bio->bi_next)
 					__raw_writel(0x14000000|(size), mptr-8);
 				else
@@ -297,16 +297,16 @@
 			else
 			{
 				if(bio->bi_next)
-					__raw_writel(0x10000000|bio_size(bio), mptr);
+					__raw_writel(0x10000000|bio->bi_size, mptr);
 				else
-					__raw_writel(0xD0000000|bio_size(bio), mptr);
+					__raw_writel(0xD0000000|bio->bi_size, mptr);
 				__raw_writel(bio_to_phys(bio), mptr+4);
 				mptr += 8;	
-				size = bio_size(bio);
-				last = bio_to_phys(bio) + bio_size(bio);
+				size = bio->bi_size;
+				last = bio_to_phys(bio) + bio->bi_size;
 			}
 
-			count -= bio_size(bio);
+			count -= bio->bi_size;
 			bio = bio->bi_next;
 		}
 		/*
@@ -326,8 +326,8 @@
 		while(bio)
 		{
 			if (bio_to_phys(bio) == last) {
-				size += bio_size(bio);
-				last += bio_size(bio);
+				size += bio->bi_size;
+				last += bio->bi_size;
 				if(bio->bi_next)
 					__raw_writel(0x14000000|(size), mptr-8);
 				else
@@ -336,16 +336,16 @@
 			else
 			{
 				if(bio->bi_next)
-					__raw_writel(0x14000000|bio_size(bio), mptr);
+					__raw_writel(0x14000000|bio->bi_size, mptr);
 				else
-					__raw_writel(0xD4000000|bio_size(bio), mptr);
+					__raw_writel(0xD4000000|bio->bi_size, mptr);
 				__raw_writel(bio_to_phys(bio), mptr+4);
 				mptr += 8;	
-				size = bio_size(bio);
-				last = bio_to_phys(bio) + bio_size(bio);
+				size = bio->bi_size;
+				last = bio_to_phys(bio) + bio->bi_size;
 			}
 
-			count -= bio_size(bio);
+			count -= bio->bi_size;
 			bio = bio->bi_next;
 		}
 
diff -ur -X exclude /opt/kernel/linux-2.5.1-pre3/drivers/scsi/scsi_merge.c linux/drivers/scsi/scsi_merge.c
--- /opt/kernel/linux-2.5.1-pre3/drivers/scsi/scsi_merge.c	Thu Nov 29 06:07:21 2001
+++ linux/drivers/scsi/scsi_merge.c	Thu Nov 29 05:12:28 2001
@@ -148,7 +148,7 @@
 	 */
 	bio = req->bio;
 #ifdef DMA_SEGMENT_SIZE_LIMITED
-	if (reqsize + bio_size(bio) > PAGE_SIZE)
+	if (reqsize + bio->bi_size > PAGE_SIZE)
 		ret++;
 #endif
 
@@ -156,7 +156,7 @@
 		bio_for_each_segment(bvec, bio, i)
 			ret++;
 
-		reqsize += bio_size(bio);
+		reqsize += bio->bi_size;
 	}
 
 	if (remainder)
@@ -201,7 +201,7 @@
 }
 
 #define MERGEABLE_BUFFERS(X,Y) \
-(((((long)bio_to_phys((X))+bio_size((X)))|((long)bio_to_phys((Y)))) & \
+(((((long)bio_to_phys((X))+(X)->bi_size)|((long)bio_to_phys((Y)))) & \
   (DMA_CHUNK_SIZE - 1)) == 0)
 
 #ifdef DMA_CHUNK_SIZE
@@ -767,7 +767,7 @@
 		 * back and allocate a really small one - enough to satisfy
 		 * the first buffer.
 		 */
-		if (bio_to_phys(bio) + bio_size(bio) - 1 > ISA_DMA_THRESHOLD) {
+		if (bio_to_phys(bio) + bio->bi_size - 1 > ISA_DMA_THRESHOLD) {
 			buff = (char *) scsi_malloc(this_count << 9);
 			if (!buff) {
 				printk("Warning - running low on DMA memory\n");
diff -ur -X exclude /opt/kernel/linux-2.5.1-pre3/fs/bio.c linux/fs/bio.c
--- /opt/kernel/linux-2.5.1-pre3/fs/bio.c	Thu Nov 29 06:07:21 2001
+++ linux/fs/bio.c	Thu Nov 29 02:24:31 2001
@@ -215,6 +215,9 @@
 	atomic_set(&bio->bi_cnt, 1);
 	bio->bi_flags = 0;
 	bio->bi_rw = 0;
+	bio->bi_vcnt = 0;
+	bio->bi_idx = 0;
+	bio->bi_size = 0;
 	bio->bi_end_io = NULL;
 }
 
diff -ur -X exclude /opt/kernel/linux-2.5.1-pre3/include/linux/bio.h linux/include/linux/bio.h
--- /opt/kernel/linux-2.5.1-pre3/include/linux/bio.h	Thu Nov 29 06:07:22 2001
+++ linux/include/linux/bio.h	Thu Nov 29 05:04:05 2001
@@ -93,10 +93,9 @@
 #define bio_iovec_idx(bio, idx)	(&((bio)->bi_io_vec[(bio)->bi_idx]))
 #define bio_iovec(bio)		bio_iovec_idx((bio), (bio)->bi_idx)
 #define bio_page(bio)		bio_iovec((bio))->bv_page
-#define bio_size(bio)		((bio)->bi_size)
 #define __bio_offset(bio, idx)	bio_iovec_idx((bio), (idx))->bv_offset
 #define bio_offset(bio)		bio_iovec((bio))->bv_offset
-#define bio_sectors(bio)	(bio_size((bio)) >> 9)
+#define bio_sectors(bio)	((bio)->bi_size >> 9)
 #define bio_data(bio)		(page_address(bio_page((bio))) + bio_offset((bio)))
 #define bio_barrier(bio)	((bio)->bi_rw & (1 << BIO_BARRIER))
 
@@ -107,13 +106,6 @@
 #define bvec_to_phys(bv)	(page_to_phys((bv)->bv_page) + (bv)->bv_offset)
 
 /*
- * hack to avoid doing 64-bit calculations on 32-bit archs, instead use a
- * pseudo-pfn check to do segment coalescing
- */
-#define bio_sec_pfn(bio) \
-	((((bio_page(bio) - bio_page(bio)->zone->zone_mem_map) << PAGE_SHIFT) / bio_size(bio)) + (bio_offset(bio) >> 9))
-
-/*
  * queues that have highmem support enabled may still need to revert to
  * PIO transfers occasionally and thus map high pages temporarily. For
  * permanent PIO fall back, user is probably better off disabling highmem
@@ -124,12 +116,16 @@
 #define __bio_kunmap(bio, idx)	kunmap(bio_iovec_idx((bio), (idx))->bv_page)
 #define bio_kunmap(bio)		__bio_kunmap((bio), (bio)->bi_idx)
 
+/*
+ * merge helpers etc
+ */
+#define __BVEC_END(bio) bio_iovec_idx((bio), (bio)->bi_idx - 1)
 #define BIO_CONTIG(bio, nxt) \
-	(bio_to_phys((bio)) + bio_size((bio)) == bio_to_phys((nxt)))
+	(bvec_to_phys(__BVEC_END((bio)) + (bio)->bi_size) ==bio_to_phys((nxt)))
 #define __BIO_SEG_BOUNDARY(addr1, addr2, mask) \
 	(((addr1) | (mask)) == (((addr2) - 1) | (mask)))
 #define BIO_SEG_BOUNDARY(q, b1, b2) \
-	__BIO_SEG_BOUNDARY(bvec_to_phys(bio_iovec_idx((b1), (b1)->bi_cnt - 1)), bio_to_phys((b2)) + bio_size((b2)), (q)->seg_boundary_mask)
+	__BIO_SEG_BOUNDARY(bvec_to_phys(__BVEC_END((b1))), bio_to_phys((b2)) + (b2)->bi_size, (q)->seg_boundary_mask)
 
 typedef int (bio_end_io_t) (struct bio *, int);
 typedef void (bio_destructor_t) (struct bio *);
diff -ur -X exclude /opt/kernel/linux-2.5.1-pre3/include/linux/blkdev.h linux/include/linux/blkdev.h
--- /opt/kernel/linux-2.5.1-pre3/include/linux/blkdev.h	Thu Nov 29 06:07:22 2001
+++ linux/include/linux/blkdev.h	Thu Nov 29 05:49:48 2001
@@ -177,14 +177,11 @@
 
 #ifdef CONFIG_HIGHMEM
 
-extern void create_bounce(struct bio **bio_orig, int gfp_mask);
+extern void create_bounce(unsigned long pfn, struct bio **bio_orig, int gfp_mask);
 
 extern inline void blk_queue_bounce(request_queue_t *q, struct bio **bio)
 {
-	struct page *page = bio_page(*bio);
-
-	if ((page - page->zone->zone_mem_map) + (page->zone->zone_start_paddr >> PAGE_SHIFT) < q->bounce_pfn)
-		create_bounce(bio, q->bounce_gfp);
+	create_bounce(q->bounce_pfn, bio, q->bounce_gfp);
 }
 
 #else /* CONFIG_HIGHMEM */
diff -ur -X exclude /opt/kernel/linux-2.5.1-pre3/include/linux/highmem.h linux/include/linux/highmem.h
--- /opt/kernel/linux-2.5.1-pre3/include/linux/highmem.h	Thu Nov 29 06:07:22 2001
+++ linux/include/linux/highmem.h	Thu Nov 29 05:49:34 2001
@@ -13,7 +13,7 @@
 /* declarations for linux/mm/highmem.c */
 unsigned int nr_free_highpages(void);
 
-extern void create_bounce(struct bio **bio_orig, int gfp_mask);
+extern void create_bounce(unsigned long pfn, struct bio **bio_orig, int gfp_mask);
 
 static inline char *bh_kmap(struct buffer_head *bh)
 {
diff -ur -X exclude /opt/kernel/linux-2.5.1-pre3/mm/highmem.c linux/mm/highmem.c
--- /opt/kernel/linux-2.5.1-pre3/mm/highmem.c	Thu Nov 29 06:07:22 2001
+++ linux/mm/highmem.c	Thu Nov 29 06:02:04 2001
@@ -207,35 +207,31 @@
  * queue gfp mask set, *to may or may not be a highmem page. kmap it
  * always, it will do the Right Thing
  */
-static inline void copy_from_high_bio(struct bio *to, struct bio *from)
+static inline void copy_to_high_bio_irq(struct bio *to, struct bio *from)
 {
 	unsigned char *vto, *vfrom;
+	unsigned long flags;
+	struct bio_vec *tovec, *fromvec;
+	int i;
 
-	if (unlikely(in_interrupt()))
-		BUG();
-
-	vto = bio_kmap(to);
-	vfrom = bio_kmap(from);
-
-	memcpy(vto, vfrom + bio_offset(from), bio_size(to));
+	bio_for_each_segment(tovec, to, i) {
+		fromvec = &from->bi_io_vec[i];
 
-	bio_kunmap(from);
-	bio_kunmap(to);
-}
+		/*
+		 * not bounced
+		 */
+		if (tovec->bv_page == fromvec->bv_page)
+			continue;
 
-static inline void copy_to_high_bio_irq(struct bio *to, struct bio *from)
-{
-	unsigned char *vto, *vfrom;
-	unsigned long flags;
+		vfrom = page_address(fromvec->bv_page) + fromvec->bv_offset;
 
-	__save_flags(flags);
-	__cli();
-	vto = kmap_atomic(bio_page(to), KM_BOUNCE_READ);
-	vfrom = kmap_atomic(bio_page(from), KM_BOUNCE_READ);
-	memcpy(vto + bio_offset(to), vfrom, bio_size(to));
-	kunmap_atomic(vfrom, KM_BOUNCE_READ);
-	kunmap_atomic(vto, KM_BOUNCE_READ);
-	__restore_flags(flags);
+		__save_flags(flags);
+		__cli();
+		vto = kmap_atomic(tovec->bv_page, KM_BOUNCE_READ);
+		memcpy(vto + tovec->bv_offset, vfrom, to->bi_size);
+		kunmap_atomic(vto, KM_BOUNCE_READ);
+		__restore_flags(flags);
+	}
 }
 
 static __init int init_emergency_pool(void)
@@ -347,15 +343,64 @@
 	goto repeat_alloc;
 }
 
-void create_bounce(struct bio **bio_orig, int gfp_mask)
+void create_bounce(unsigned long pfn, struct bio **bio_orig, int gfp_mask)
 {
 	struct page *page;
-	struct bio *bio;
+	struct bio *bio = NULL;
 	int i, rw = bio_data_dir(*bio_orig);
+	struct bio_vec *to, *from;
 
 	BUG_ON((*bio_orig)->bi_idx);
 
-	bio = bio_alloc(GFP_NOHIGHIO, (*bio_orig)->bi_vcnt);
+	bio_for_each_segment(from, *bio_orig, i) {
+		page = from->bv_page;
+
+		/*
+		 * is destination page below bounce pfn?
+		 */
+		if ((page - page->zone->zone_mem_map) + (page->zone->zone_start_paddr >> PAGE_SHIFT) < pfn)
+			continue;
+
+		/*
+		 * irk, bounce it
+		 */
+		if (!bio)
+			bio = bio_alloc(GFP_NOHIGHIO, (*bio_orig)->bi_vcnt);
+
+		to = &bio->bi_io_vec[i];
+
+		to->bv_page = alloc_bounce_page(gfp_mask);
+		to->bv_len = from->bv_len;
+		to->bv_offset = from->bv_offset;
+
+		if (rw & WRITE) {
+			char *vto, *vfrom;
+
+			vto = page_address(to->bv_page) + to->bv_offset;
+			vfrom = kmap(from->bv_page);
+			memcpy(vto, vfrom + from->bv_offset, to->bv_len);
+			kunmap(to->bv_page);
+		}
+	}
+
+	/*
+	 * no pages bounced
+	 */
+	if (!bio)
+		return;
+
+	/*
+	 * at least one page was bounced, fill in possible non-highmem
+	 * pages
+	 */
+	bio_for_each_segment(from, *bio_orig, i) {
+		to = &bio->bi_io_vec[i];
+		if (!to->bv_page) {
+			to->bv_page = from->bv_page;
+			to->bv_len = from->bv_len;
+			to->bv_offset = to->bv_offset;
+		}
+	}
 
 	bio->bi_dev = (*bio_orig)->bi_dev;
 	bio->bi_sector = (*bio_orig)->bi_sector;
@@ -369,23 +414,6 @@
 		bio->bi_end_io = bounce_end_io_write;
 	else
 		bio->bi_end_io = bounce_end_io_read;
-
-	for (i = 0; i < bio->bi_vcnt; i++) {
-		char *vto, *vfrom;
-
-		page = alloc_bounce_page(gfp_mask);
-
-		bio->bi_io_vec[i].bv_page = page;
-		bio->bi_io_vec[i].bv_len = (*bio_orig)->bi_io_vec[i].bv_len;
-		bio->bi_io_vec[i].bv_offset = 0;
-
-		if (rw & WRITE) {
-			vto = page_address(page);
-			vfrom = __bio_kmap(*bio_orig, i);
-			memcpy(vto, vfrom + __bio_offset(*bio_orig, i), bio->bi_io_vec[i].bv_len);
-			__bio_kunmap(bio, i);
-		}
-	}
 
 	bio->bi_private = *bio_orig;
 	*bio_orig = bio;

[-- Attachment #3: alan.diff --]
[-- Type: text/x-diff, Size: 7978 bytes --]

diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.1p3/drivers/block/rd.c linux.ac/drivers/block/rd.c
--- linux.1p3/drivers/block/rd.c	Thu Nov 29 01:18:32 2001
+++ linux.ac/drivers/block/rd.c	Thu Nov 29 01:41:37 2001
@@ -409,13 +409,13 @@
 {
 	extern void free_initrd_mem(unsigned long, unsigned long);
 
-	spin_lock( &initrd_users_lock );
+	spin_lock(&initrd_users_lock);
 	if (!--initrd_users) {
-		spin_unlock( &initrd_users_lock );
+		spin_unlock(&initrd_users_lock);
 		free_initrd_mem(initrd_start, initrd_end);
 		initrd_start = 0;
 	} else {
-		spin_unlock( &initrd_users_lock );
+		spin_unlock(&initrd_users_lock);
 	}
 		
 	blkdev_put(inode->i_bdev, BDEV_FILE);
@@ -437,10 +437,11 @@
 
 #ifdef CONFIG_BLK_DEV_INITRD
 	if (unit == INITRD_MINOR) {
-		spin_lock( &initrd_users_lock );
+		spin_lock(&initrd_users_lock);
 		initrd_users++;
-		if (!initrd_start) return -ENODEV;
-		spin_unlock( &initrd_users_lock );
+		spin_unlock(&initrd_users_lock);
+		if (!initrd_start) 
+			return -ENODEV;
 		filp->f_op = &initrd_fops;
 		return 0;
 	}
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.1p3/drivers/char/pc110pad.c linux.ac/drivers/char/pc110pad.c
--- linux.1p3/drivers/char/pc110pad.c	Thu Nov 29 01:18:32 2001
+++ linux.ac/drivers/char/pc110pad.c	Thu Nov 29 01:39:21 2001
@@ -68,8 +68,8 @@
 /* driver/filesystem interface management */
 static wait_queue_head_t queue;
 static struct fasync_struct *asyncptr;
-static active_count = 0; 	/* number of concurrent open()s */
-static spinlock_t active_lock = SPIN_LOCK_UNLOCKED;
+static int active_count = 0; 	/* number of concurrent open()s */
+static spinlock_t pc110_lock = SPIN_LOCK_UNLOCKED;
 /* this lock should be held when referencing active_count */
 static struct semaphore reader_lock;
 
@@ -482,15 +482,14 @@
 	int thisd, thisdd, thisx, thisy;
 	int b;
 	unsigned long flags;
-	
-	save_flags(flags);
-	cli();
+
+	spin_lock_irqsave(&pc110_lock, flags);	
 	read_raw_pad(&thisd, &thisdd, &thisx, &thisy);
 	d[0]=(thisd?0x80:0) | (thisdd?0x40:0) | bounce;
 	d[1]=(recent_transition?0x80:0)+transition_count;
 	read_button(&b);
 	d[2]=(synthesize_tap<<4) | (b?0x01:0);
-	restore_flags(flags);
+	spin_unlock_irqrestore(&pc110_lock, flags);
 }
 
 /**
@@ -586,11 +585,12 @@
  
 static int close_pad(struct inode * inode, struct file * file)
 {
+	unsigned long flags;
 	fasync_pad(-1, file, 0);
-	spin_lock( &active_lock );
+	spin_lock_irqsave(&pc110_lock, flags);
 	if (!--active_count)
 		outb(0x30, current_params.io+2);  /* switch off digitiser */
-	spin_unlock( &active_lock );	
+	spin_unlock_irqrestore(&active_lock, flags);	
 	return 0;
 }
 
@@ -610,16 +610,13 @@
 {
 	unsigned long flags;
 	
-	spin_lock( &active_lock );
+       	spin_lock_irqsave(&pc110_lock, flags);
 	if (active_count++)
         {
-		spin_unlock( &active_lock );
+        	spin_unlock_irqrestore(&pc110_lock, flags);
 		return 0;
 	}
-	spin_unlock( &active_lock );
 
-	save_flags(flags);
-	cli();
 	outb(0x30, current_params.io+2);	/* switch off digitiser */
 	pad_irq(0,0,0);		/* read to flush any pending bytes */
 	pad_irq(0,0,0);		/* read to flush any pending bytes */
@@ -634,7 +631,7 @@
 	synthesize_tap=0;
 	del_timer(&bounce_timer);
 	del_timer(&tap_timer);
-	restore_flags(flags);
+       	spin_unlock_irqrestore(&pc110_lock, flags);
 
 	return 0;
 }
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.1p3/drivers/char/pc_keyb.c linux.ac/drivers/char/pc_keyb.c
--- linux.1p3/drivers/char/pc_keyb.c	Thu Nov 29 01:18:32 2001
+++ linux.ac/drivers/char/pc_keyb.c	Thu Nov 29 01:44:51 2001
@@ -406,7 +406,7 @@
 
        if (rqst == PM_RESUME) {
                if (queue) {                    /* Aux port detected */
-		       spin_lock_irqsave( &aux_count_lock, flags);
+		       spin_lock_irqsave(&aux_count_lock, flags);
               	       if ( aux_count == 0) {   /* Mouse not in use */ 
                                spin_lock(&kbd_controller_lock);
 			       /*
@@ -420,9 +420,9 @@
 			       kbd_write_command(KBD_CCMD_WRITE_MODE);
 			       kb_wait();
 			       kbd_write_output(AUX_INTS_OFF);
-			       spin_unlock(&kbd_controller_lock, flags);
+			       spin_unlock(&kbd_controller_lock);
 		       }
-		       spin_unlock_irqrestore( &aux_count_lock,flags );
+		       spin_unlock_irqrestore(&aux_count_lock, flags);
 	       }
        }
 #endif
@@ -433,7 +433,7 @@
 static inline void handle_mouse_event(unsigned char scancode)
 {
 #ifdef CONFIG_PSMOUSE
-	int flags;
+	unsigned long flags;
 	static unsigned char prev_code;
 	if (mouse_reply_expected) {
 		if (scancode == AUX_ACK) {
@@ -452,7 +452,7 @@
 
 	prev_code = scancode;
 	add_mouse_randomness(scancode);
-	spin_lock_irqsave( &aux_count_lock, flags);
+	spin_lock_irqsave(&aux_count_lock, flags);
 	if ( aux_count ) {
 		int head = queue->head;
 
@@ -464,7 +464,7 @@
 			wake_up_interruptible(&queue->proc_list);
 		}
 	}
-	spin_unlock_irqrestore( &aux_count_lock, flags);
+	spin_unlock_irqrestore(&aux_count_lock, flags);
 #endif
 }
 
@@ -1052,14 +1052,14 @@
 
 static int release_aux(struct inode * inode, struct file * file)
 {
-	int flags;
+	unsigned long flags;
 	fasync_aux(-1, file, 0);
-	spin_lock_irqsave( &aux_count, flags );
+	spin_lock_irqsave(&aux_count, flags);
 	if ( --aux_count ) {
-		spin_unlock_irqrestore( &aux_count_lock );
+		spin_unlock_irqrestore(&aux_count_lock, flags);
 		return 0;
 	}
-	spin_unlock_irqrestore( &aux_count_lock, flags );
+	spin_unlock_irqrestore(&aux_count_lock, flags);
 	kbd_write_cmd(AUX_INTS_OFF);			    /* Disable controller ints */
 	kbd_write_command_w(KBD_CCMD_MOUSE_DISABLE);
 	aux_free_irq(AUX_DEV);
@@ -1073,16 +1073,16 @@
 
 static int open_aux(struct inode * inode, struct file * file)
 {
-	int flags;
-	spin_lock_irqsave( &aux_count_lock, flags );
+	unsigned long flags;
+	spin_lock_irqsave(&aux_count_lock, flags);
 	if ( aux_count++ ) {
-		spin_unlock_irqrestore( &aux_count_lock );
+		spin_unlock_irqrestore(&aux_count_lock, flags);
 		return 0;
 	}
 	queue->head = queue->tail = 0;		/* Flush input queue */
 	if (aux_request_irq(keyboard_interrupt, AUX_DEV)) {
 		aux_count--;
-		spin_unlock_irqrestore( &aux_count_lock, flags );
+		spin_unlock_irqrestore(&aux_count_lock, flags);
 		return -EBUSY;
 	}
 	kbd_write_command_w(KBD_CCMD_MOUSE_ENABLE);	/* Enable the
@@ -1094,7 +1094,7 @@
 	mdelay(2);			/* Ensure we follow the kbc access delay rules.. */
 
 	send_data(KBD_CMD_ENABLE);	/* try to workaround toshiba4030cdt problem */
-	spin_unlock_irqrestore( &aux_count_lock, flags );
+	spin_unlock_irqrestore(&aux_count_lock, flags);
 	return 0;
 }
 
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.1p3/drivers/char/wdt.c linux.ac/drivers/char/wdt.c
--- linux.1p3/drivers/char/wdt.c	Thu Nov 29 01:18:32 2001
+++ linux.ac/drivers/char/wdt.c	Thu Nov 29 01:22:32 2001
@@ -50,7 +50,7 @@
 #include <linux/reboot.h>
 #include <linux/init.h>
 
-static int wdt_is_open;
+static unsigned long wdt_is_open;
 
 /*
  *	You must set these - there is no sane way to probe for this board.
@@ -337,13 +337,12 @@
 	switch(MINOR(inode->i_rdev))
 	{
 		case WATCHDOG_MINOR:
-			if(wdt_is_open)
+			if(test_and_set_bit(0, &wdt_is_open))
 				return -EBUSY;
 			/*
 			 *	Activate 
 			 */
 	 
-			wdt_is_open=1;
 			inb_p(WDT_DC);		/* Disable */
 			wdt_ctr_mode(0,3);
 			wdt_ctr_mode(1,2);
@@ -380,7 +379,7 @@
 		inb_p(WDT_DC);		/* Disable counters */
 		wdt_ctr_load(2,0);	/* 0 length reset pulses now */
 #endif		
-		wdt_is_open=0;
+		clear_bit(0, &wdt_is_open);
 	}
 	return 0;
 }
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.1p3/drivers/char/wdt_pci.c linux.ac/drivers/char/wdt_pci.c
--- linux.1p3/drivers/char/wdt_pci.c	Thu Nov 29 01:18:32 2001
+++ linux.ac/drivers/char/wdt_pci.c	Thu Nov 29 01:23:17 2001
@@ -71,7 +71,7 @@
 #define PCI_DEVICE_ID_WDG_CSM 0x22c0
 #endif
 
-static int wdt_is_open;
+static unsigned long wdt_is_open;
 
 /*
  *	You must set these - there is no sane way to probe for this board.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: oops with 2.5.1-pre3 in ide-scsi module
  2001-11-29 18:19 oops with 2.5.1-pre3 in ide-scsi module Dirk Pritsch
  2001-11-29 18:38 ` Slo Mo Snail
@ 2001-11-29 18:39 ` Jens Axboe
  2001-11-29 18:47   ` Jens Axboe
       [not found] ` <200111291838.fATIcHNO029528@einhorn.in-berlin.de>
  2 siblings, 1 reply; 7+ messages in thread
From: Jens Axboe @ 2001-11-29 18:39 UTC (permalink / raw)
  To: Dirk Pritsch; +Cc: linux-kernel

On Thu, Nov 29 2001, Dirk Pritsch wrote:
> Hi,
> 
> just tried the new 2.5.1-pre3 and got the following oops when trying to
> burn a cd (ide-cd/rw with ide-scsi emulation).
> 
> I Hope this is some useful information.
> 
> 
> ____
> ksymoops 2.4.3 on i586 2.5.1-pre3.  Options used
>      -V (default)
>      -k /proc/ksyms (default)
>      -l /proc/modules (default)
>      -o /lib/modules/2.5.1-pre3/ (default)
>      -m /boot/System.map-2.5.1-pre3 (default)
> 
> Warning: You did not tell me where to find
> symbol information.  I will
> assume that the log matches the kernel and
> modules that are running
> right now and I'll use the default options
> above for symbol resolution.
> If the current kernel and/or modules do not
> match the log, you can get
> more accurate output by telling me the kernel
> version and where to find
> map, modules, ksyms etc.  ksymoops -h explains
> the options.
> 
> 
> Unable to handle kernel NULL pointer dereference at virtual address
> 00000038
> c01af582
> *pde = 00000000
> Oops: 0000
> CPU:    0
> EIP:    0010:[idescsi_queue+1158/1396]    Not tainted

Hmm, I bet the problem is not really bio but the fact that someone is
still sending down a scatterlist with ->address set instead of
->page/offset.

Let me hack a quick fix up for you to test... 2 minutes.

-- 
Jens Axboe


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: oops with 2.5.1-pre3 in ide-scsi module
       [not found] ` <200111291838.fATIcHNO029528@einhorn.in-berlin.de>
@ 2001-11-29 18:45   ` Dirk Pritsch
  2001-11-29 19:00     ` Sebastian Dröge
  0 siblings, 1 reply; 7+ messages in thread
From: Dirk Pritsch @ 2001-11-29 18:45 UTC (permalink / raw)
  To: Slo Mo Snail; +Cc: linux-kernel

Hi,

On Thu, Nov 29, 2001 at 07:38:25PM +0100, Slo Mo Snail wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> Hi,
> Have you applied any other patches than the 2.5.1-pre3?
> If/When not you'll probably get some data corruption :(
> Please apply the 2 Patches attatched and
> http://kernel.org/pub/linux/kernel/people/axboe/patches/v2.5/2.5.1-pre3/bio-pre3-1.gz
> Then recompile your kernel ;)
> These patches were posted before by Alan Cox and Jens Axboe
> 
> CD burning works fine for me with this patches but I have compiled all SCSI 
> and IDE stuff directly into the kernel... maybe this matters
> Bye
> 

thanks for the info, the patch from Alan was applied, but not the one
from Jens, I will try it again with both patches.


Cheers,

Dirk


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: oops with 2.5.1-pre3 in ide-scsi module
  2001-11-29 18:39 ` Jens Axboe
@ 2001-11-29 18:47   ` Jens Axboe
  2001-11-29 19:36     ` Dirk Pritsch
  0 siblings, 1 reply; 7+ messages in thread
From: Jens Axboe @ 2001-11-29 18:47 UTC (permalink / raw)
  To: Dirk Pritsch; +Cc: linux-kernel

On Thu, Nov 29 2001, Jens Axboe wrote:
> Hmm, I bet the problem is not really bio but the fact that someone is
> still sending down a scatterlist with ->address set instead of
> ->page/offset.
> 
> Let me hack a quick fix up for you to test... 2 minutes.

Please try this, and check for oops and "jens was right" in dmesg. Let
me know how it goes, thanks.

--- /opt/kernel/linux-2.5.1-pre3/drivers/scsi/ide-scsi.c	Thu Nov 29 06:07:21 2001
+++ drivers/scsi/ide-scsi.c	Thu Nov 29 13:44:04 2001
@@ -708,16 +708,30 @@
 		printk ("ide-scsi: %s: building DMA table, %d segments, %dkB total\n", drive->name, segments, pc->request_transfer >> 10);
 #endif /* IDESCSI_DEBUG_LOG */
 		while (segments--) {
-			bh->bi_io_vec[0].bv_page = sg->page;
+			struct page *page = sg->page;
+			int offset = sg->offset;
+			static int foo;
+
+			if (!page) {
+				BUG_ON(!sg->address);
+				if (!foo) {
+					printk("jens was right\n");
+					foo = 1;
+				}
+				page = virt_to_page(sg->address);
+				offset = (unsigned long) sg->address & ~PAGE_MASK;
+			}
+				
+			bh->bi_io_vec[0].bv_page = page;
 			bh->bi_io_vec[0].bv_len = sg->length;
-			bh->bi_io_vec[0].bv_offset = sg->offset;
+			bh->bi_io_vec[0].bv_offset = offset;
 			bh->bi_size = sg->length;
 			bh = bh->bi_next;
 			/*
 			 * just until scsi_merge is fixed up...
 			 */
-			BUG_ON(PageHighMem(sg->page));
-			sg->address = page_address(sg->page) + sg->offset;
+			BUG_ON(PageHighMem(page));
+			sg->address = page_address(page) + offset;
 			sg++;
 		}
 	} else {

-- 
Jens Axboe


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: oops with 2.5.1-pre3 in ide-scsi module
  2001-11-29 18:45   ` Dirk Pritsch
@ 2001-11-29 19:00     ` Sebastian Dröge
  0 siblings, 0 replies; 7+ messages in thread
From: Sebastian Dröge @ 2001-11-29 19:00 UTC (permalink / raw)
  To: Dirk Pritsch; +Cc: linux-kernel

Am Donnerstag, 29. November 2001 19:45 schrieben Sie:
> Hi,
>
> On Thu, Nov 29, 2001 at 07:38:25PM +0100, Slo Mo Snail wrote:
> > -----BEGIN PGP SIGNED MESSAGE-----
> > Hash: SHA1
> >
> > Hi,
> > Have you applied any other patches than the 2.5.1-pre3?
> > If/When not you'll probably get some data corruption :(
> > Please apply the 2 Patches attatched and
> > http://kernel.org/pub/linux/kernel/people/axboe/patches/v2.5/2.5.1-pre3/b
> >io-pre3-1.gz Then recompile your kernel ;)
> > These patches were posted before by Alan Cox and Jens Axboe
> >
> > CD burning works fine for me with this patches but I have compiled all
> > SCSI and IDE stuff directly into the kernel... maybe this matters
> > Bye
>
> thanks for the info, the patch from Alan was applied, but not the one
>
> >from Jens, I will try it again with both patches.
>
> Cheers,
>
> Dirk
I've forgotten something...
You need first the bio-pre3-1.gz and then the one which was attatched
The first fixes some things in the new block i/o architecture, the 2nd fixes 
the data corruption and fixes some things in the block i/o
Bye

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: oops with 2.5.1-pre3 in ide-scsi module
  2001-11-29 18:47   ` Jens Axboe
@ 2001-11-29 19:36     ` Dirk Pritsch
  0 siblings, 0 replies; 7+ messages in thread
From: Dirk Pritsch @ 2001-11-29 19:36 UTC (permalink / raw)
  To: Jens Axboe; +Cc: linux-kernel

Hi,

On Thu, Nov 29, 2001 at 07:47:52PM +0100, Jens Axboe wrote:
> On Thu, Nov 29 2001, Jens Axboe wrote:
> > Hmm, I bet the problem is not really bio but the fact that someone is
> > still sending down a scatterlist with ->address set instead of
> > ->page/offset.
> > 
> > Let me hack a quick fix up for you to test... 2 minutes.
> 
> Please try this, and check for oops and "jens was right" in dmesg. Let
> me know how it goes, thanks.
> 
> 
Ok, applied the diff from Alan, and the two I got from you, and it seems
to work (burning still in progress).

Instead of an oops, syslog now tells me:

Nov 29 20:32:49 enterprise kernel: jens was right

when loading the modules.



Thanks for the quick fix,

Cheers,

Dirk


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2001-11-29 19:37 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2001-11-29 18:19 oops with 2.5.1-pre3 in ide-scsi module Dirk Pritsch
2001-11-29 18:38 ` Slo Mo Snail
2001-11-29 18:39 ` Jens Axboe
2001-11-29 18:47   ` Jens Axboe
2001-11-29 19:36     ` Dirk Pritsch
     [not found] ` <200111291838.fATIcHNO029528@einhorn.in-berlin.de>
2001-11-29 18:45   ` Dirk Pritsch
2001-11-29 19:00     ` Sebastian Dröge

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox