From: Jens Axboe <axboe@suse.de>
To: Peter Osterlund <petero2@telia.com>
Cc: Andrew Morton <akpm@osdl.org>,
packet-writing@suse.com, linux-kernel@vger.kernel.org
Subject: Re: ext2 on a CD-RW
Date: Fri, 2 Jan 2004 11:08:07 +0100 [thread overview]
Message-ID: <20040102100807.GF5523@suse.de> (raw)
In-Reply-To: <m2llorkuhn.fsf@telia.com>
On Fri, Jan 02 2004, Peter Osterlund wrote:
> Andrew Morton <akpm@osdl.org> writes:
>
> > Peter Osterlund <petero2@telia.com> wrote:
> > >
> > > If I create an ext2 filesystem
> > > with 2kb blocksize, I hit a bug when I try to write some large files to
> > > the filesystem. The problem is that the code in mpage_writepage() fails if
> > > a page is mapped to disk across a packet boundary. In that case, the
> > > bio_add_page() call at line 543 in mpage.c can fail even if the bio was
> > > previously empty. The code then passes an empty bio to submit_bio(), which
> > > triggers a bug at line 2303 in ll_rw_blk.c. This patch seems to fix the
> > > problem.
> > >
> > > --- linux/fs/mpage.c.old 2004-01-02 00:26:19.000000000 +0100
> > > +++ linux/fs/mpage.c 2004-01-02 00:26:50.000000000 +0100
> > > @@ -541,6 +541,11 @@
> > >
> > > length = first_unmapped << blkbits;
> > > if (bio_add_page(bio, page, length, 0) < length) {
> > > + if (!bio->bi_size) {
> > > + bio_put(bio);
> > > + bio = NULL;
> > > + goto confused;
> > > + }
> > > bio = mpage_bio_submit(WRITE, bio);
> > > goto alloc_new;
> > > }
> >
> > Confused. We initially have an empty BIO, and we run bio_add_page()
> > against it, adding one page.
> >
> > How can that bio_add_page() fail to add the page?
> >
> > Cold you describe the failure a little more please?
>
> In bio_add_page(), there is this check:
>
> /*
> * if queue has other restrictions (eg varying max sector size
> * depending on offset), it can specify a merge_bvec_fn in the
> * queue to get further control
> */
> if (q->merge_bvec_fn) {
> /*
> * merge_bvec_fn() returns number of bytes it can accept
> * at this offset
> */
> if (q->merge_bvec_fn(q, bio, bvec) < len) {
> bvec->bv_page = NULL;
> bvec->bv_len = 0;
> bvec->bv_offset = 0;
> return 0;
> }
> }
>
> The packet writing code has the restriction that a bio must not span a
> packet boundary. (A packet is 32*2048 bytes.) If the page when mapped
> to disk starts 2kb before a packet boundary, merge_bvec_fn therefore
> returns 2048, which is less than len, which is 4096 if the whole page
> is mapped, so the bio_add_page() call fails.
The packet writing code is buggy then, you must always allow a page to
be added to an empty bio. You'll have to deal with the pieces there, I'm
afraid.
So it's not a bug in mpage. If that was the case, there are other buggy
places in the kernel.
--
Jens Axboe
next prev parent reply other threads:[~2004-01-02 10:08 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-01-01 23:47 ext2 on a CD-RW Peter Osterlund
2004-01-02 0:24 ` Andrew Morton
2004-01-02 1:30 ` Peter Osterlund
2004-01-02 9:06 ` Arjan van de Ven
2004-01-02 10:09 ` Jens Axboe
2004-01-02 10:51 ` Peter Osterlund
2004-01-02 10:59 ` Jens Axboe
2004-01-02 12:09 ` Peter Osterlund
2004-01-02 12:19 ` Jens Axboe
2004-01-02 13:38 ` Peter Osterlund
2004-01-02 13:59 ` Jens Axboe
2004-01-02 16:12 ` Peter Osterlund
2004-03-29 15:38 ` Peter Osterlund
2004-01-02 10:08 ` Jens Axboe [this message]
2004-01-03 19:14 ` Pavel Machek
2004-01-03 20:32 ` Peter Osterlund
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=20040102100807.GF5523@suse.de \
--to=axboe@suse.de \
--cc=akpm@osdl.org \
--cc=linux-kernel@vger.kernel.org \
--cc=packet-writing@suse.com \
--cc=petero2@telia.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.