public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Andrew Morton <akpm@zip.com.au>
To: William Lee Irwin III <wli@holomorphy.com>
Cc: linux-kernel@vger.kernel.org
Subject: Re: [BUG] loop.c oopses
Date: Tue, 16 Jul 2002 00:07:54 -0700	[thread overview]
Message-ID: <3D33C64A.7491B591@zip.com.au> (raw)
In-Reply-To: 20020716062453.GK1022@holomorphy.com

William Lee Irwin III wrote:
> 
> loop.c oopses when bio_copy() returns NULL. This was encountered while
> running dbench 16 on a loopback-mounted reiserfs filesystem.

ugh.  GFP_NOIO is evil.  I guess it's better to add __GFP_HIGH
there, but it's not a happy solution.

> ...
> 
> If what I've done is proper, it may be necessary to allow
> try_to_free_buffers() to fail if (!was_uptodate && PageUptodate(page))

Is OK - that's just overeager whining.  You received an IO error
during a write.  This marks the buffer not uptodate.  (Heaven
knows why, because it clearly *is* uptodate).  And try_to_free_buffers
doesn't like seeing a non-uptodate buffer against an uptodate
page: it violates the alleged page/buffer state coherency.

Some sucker needs to go through and test-n-fix all the IO handling
paths.  He'll probably leave that until after "feature freeze".

 loop.c |    9 ++++++---
 1 files changed, 6 insertions(+), 3 deletions(-)

--- 2.5.25/drivers/block/loop.c~wli-loop-fix	Mon Jul 15 23:58:10 2002
+++ 2.5.25-akpm/drivers/block/loop.c	Mon Jul 15 23:59:32 2002
@@ -457,8 +457,9 @@ static struct bio *loop_get_buffer(struc
 		goto out_bh;
 	}
 
-	bio = bio_copy(rbh, GFP_NOIO, rbh->bi_rw & WRITE);
-
+	bio = bio_copy(rbh, GFP_NOIO|__GFP_HIGH, rbh->bi_rw & WRITE);
+	if (bio == NULL)
+		goto out;
 	bio->bi_end_io = loop_end_io_transfer;
 	bio->bi_private = rbh;
 
@@ -466,7 +467,7 @@ out_bh:
 	bio->bi_sector = rbh->bi_sector + (lo->lo_offset >> 9);
 	bio->bi_rw = rbh->bi_rw;
 	bio->bi_bdev = lo->lo_device;
-
+out:
 	return bio;
 }
 
@@ -537,6 +538,8 @@ static int loop_make_request(request_que
 	 * piggy old buffer on original, and submit for I/O
 	 */
 	new_bio = loop_get_buffer(lo, old_bio);
+	if (new_bio == NULL)
+		goto out;
 	IV = loop_get_iv(lo, old_bio->bi_sector);
 	if (rw == WRITE) {
 		if (bio_transfer(lo, new_bio, old_bio))

.

  reply	other threads:[~2002-07-16  6:57 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-07-16  6:24 [BUG] loop.c oopses William Lee Irwin III
2002-07-16  7:07 ` Andrew Morton [this message]
2002-07-16  8:31   ` Jens Axboe
2002-07-16  8:52     ` Andrew Morton
2002-07-16  8:48       ` Jens Axboe
2002-07-16  9:09         ` Andrew Morton
2002-07-16  8:52       ` William Lee Irwin III
2002-07-16  9:19         ` Andrew Morton
2002-07-16  9:16           ` William Lee Irwin III
2002-07-16  9:21           ` Jens Axboe
2002-07-16 12:49       ` Rik van Riel
2002-07-16 16:36         ` Jens Axboe
2002-07-16 16:49           ` Rik van Riel
2002-07-16 17:09             ` Jens Axboe
2002-07-16 19:42               ` Jari Ruusu
2002-07-16 21:14                 ` William Lee Irwin III
2002-07-16 21:36                   ` Andrew Morton
2002-07-17  5:40                 ` Jens Axboe
2002-07-17 15:31                   ` Jari Ruusu
2002-07-20 17:03                     ` William Lee Irwin III

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3D33C64A.7491B591@zip.com.au \
    --to=akpm@zip.com.au \
    --cc=linux-kernel@vger.kernel.org \
    --cc=wli@holomorphy.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox