From: Dmitry Monakhov <dmonakhov@openvz.org>
To: Mike Snitzer <snitzer@redhat.com>
Cc: Jens Axboe <jens.axboe@oracle.com>,
linux-kernel@vger.kernel.org, dm-devel@redhat.com
Subject: Re: [PATCH 1/2] blkdev: fix merge_bvec_fn return value checks
Date: Wed, 03 Mar 2010 21:45:05 +0300 [thread overview]
Message-ID: <87wrxtkzwu.fsf@openvz.org> (raw)
In-Reply-To: <170fa0d21003031020x5b71b492vd733cf0d7c9b83d4@mail.gmail.com> (Mike Snitzer's message of "Wed, 3 Mar 2010 13:20:23 -0500")
Mike Snitzer <snitzer@redhat.com> writes:
> On Tue, Mar 2, 2010 at 10:49 PM, Dmitry Monakhov <dmonakhov@openvz.org> wrote:
>> Jens Axboe <jens.axboe@oracle.com> writes:
>>
>>> On Sat, Feb 27 2010, Dmitry Monakhov wrote:
>>>> merge_bvec_fn() returns bvec->bv_len on success. So we have to check
>>>> against this value. But in case of fs_optimization merge we compare
>>>> with wrong value. This patch must be included in
>>>> b428cd6da7e6559aca69aa2e3a526037d3f20403
>>>> But accidentally i've forgot to add this in the initial patch.
>>>> To make things straight let's replace all such checks.
>>>> In fact this makes code easy to understand.
>>>
>>> Agree, applied.
>> Ohh.. as you already know this patch break dm-layer. Sorry.
>> This is because dm->merge may return more than requested. So correct
>> check must test against less what requested. Correct patch attached.
>
> Yes, it is quite common for dm_merge_bvec() to return greater than the
> requested length.
>
> But dm_merge_bvec() returning a maximum length, rather than requested,
> isn't special. All the other blk_queue_merge_bvec() callers' merge
> functions appear to return "maximum amount of bytes we can accept at
> this offset" too.
What for? Does it allow us to make some optimization?
For example like follows:
bio_add_pageS(bio, **pages) {
/* call merge_fn only one untill all space exhausted */
ret = merge_fn() (this returns huge value (1024*1024))
while (ret) {
bio->bi_io_vec[bio->bi_vcnt - 1].bv_page = page;
...
ret -= PAGE_SIZE;
bio->bi_vcnt++;
}
}
IMHO the answer is *NO*, this code will unlikely to work.
>
> __bio_add_page() only needs to care about whether the
> 'q->merge_bvec_fn' return is _less than_ the requested length.
>
>> From 145fb49bf2251f445ca29c5218333367448932d6 Mon Sep 17 00:00:00 2001
>> From: Dmitry Monakhov <dmonakhov@openvz.org>
>> Date: Wed, 3 Mar 2010 06:28:06 +0300
>> Subject: [PATCH] blkdev: fix merge_bvec_fn return value checks v2
>>
>> merge_bvec_fn() returns bvec->bv_len on success. So we have to check
>> against this value. But in case of fs_optimization merge we compare
>> with wrong value. This patch must be included in
>> b428cd6da7e6559aca69aa2e3a526037d3f20403
>> But accidentally i've forgot to add this in the initial patch.
>> To make things straight let's replace all such checks.
>> In fact this makes code easy to understand.
>>
>> Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
>> ---
>> fs/bio.c | 4 ++--
>> 1 files changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/fs/bio.c b/fs/bio.c
>> index 88094af..975657a 100644
>> --- a/fs/bio.c
>> +++ b/fs/bio.c
>> @@ -557,7 +557,7 @@ static int __bio_add_page(struct request_queue *q, struct bio *bio, struct page
>> .bi_rw = bio->bi_rw,
>> };
>>
>> - if (q->merge_bvec_fn(q, &bvm, prev) < len) {
>> + if (q->merge_bvec_fn(q, &bvm, prev) < prev->bv_len) {
>> prev->bv_len -= len;
>> return 0;
>> }
>> @@ -611,7 +611,7 @@ static int __bio_add_page(struct request_queue *q, struct bio *bio, struct page
>> * merge_bvec_fn() returns number of bytes it can accept
>> * at this offset
>> */
>> - if (q->merge_bvec_fn(q, &bvm, bvec) < len) {
>> + if (q->merge_bvec_fn(q, &bvm, bvec) < bvec->bv_len) {
>> bvec->bv_page = NULL;
>> bvec->bv_len = 0;
>> bvec->bv_offset = 0;
>
> NOTE this 2nd hunk doesn't change anything at all because: bvec->bv_len = len;
Yess. IMHO this makes code more readable.
>
> Mike
next prev parent reply other threads:[~2010-03-03 18:45 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-02-27 17:35 [PATCH 1/2] blkdev: fix merge_bvec_fn return value checks Dmitry Monakhov
2010-02-27 17:35 ` [PATCH 2/2] blktrace: perform cleanup after setup error Dmitry Monakhov
2010-02-28 18:46 ` Jens Axboe
2010-02-28 18:46 ` [PATCH 1/2] blkdev: fix merge_bvec_fn return value checks Jens Axboe
2010-03-03 3:49 ` Dmitry Monakhov
2010-03-03 7:30 ` Jens Axboe
2010-03-03 8:39 ` Dmitry Monakhov
2010-03-03 12:21 ` Jens Axboe
2010-03-03 18:20 ` Mike Snitzer
2010-03-03 18:45 ` Dmitry Monakhov [this message]
2010-03-03 19:16 ` Mike Snitzer
2010-03-03 19:42 ` Dmitry Monakhov
2010-03-03 20:07 ` Jens Axboe
2010-03-04 11:47 ` [dm-devel] " Mikulas Patocka
2010-03-04 12:19 ` Jens Axboe
2010-03-04 21:55 ` Mikulas Patocka
2010-03-05 7:30 ` Jens Axboe
2010-03-05 7:30 ` [dm-devel] " Jens Axboe
2010-03-05 21:56 ` Neil Brown
2010-03-05 22:27 ` Alasdair G Kergon
2010-03-05 22:27 ` Alasdair G Kergon
2010-03-05 23:52 ` Neil Brown
2010-03-06 2:20 ` Alasdair G Kergon
2010-03-08 9:01 ` Mikulas Patocka
2010-03-04 17:59 ` Lars Ellenberg
2010-03-05 17:37 ` Alasdair G Kergon
2010-03-05 19:20 ` Lars Ellenberg
2010-03-08 5:43 ` Neil Brown
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=87wrxtkzwu.fsf@openvz.org \
--to=dmonakhov@openvz.org \
--cc=dm-devel@redhat.com \
--cc=jens.axboe@oracle.com \
--cc=linux-kernel@vger.kernel.org \
--cc=snitzer@redhat.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.