From: Boaz Harrosh <bharrosh@panasas.com>
To: James Bottomley <James.Bottomley@HansenPartnership.com>
Cc: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>,
jens.axboe@oracle.com, linux-scsi@vger.kernel.org
Subject: Re: [PATCH 2/3] block: unexport blk_rq_append_bio
Date: Wed, 11 Feb 2009 11:15:53 +0200 [thread overview]
Message-ID: <49929749.5020109@panasas.com> (raw)
In-Reply-To: <49928993.70002@panasas.com>
Boaz Harrosh wrote:
> James Bottomley wrote:
>> On Tue, 2009-02-10 at 17:43 +0000, James Bottomley wrote:
>>> There's a current barrier to this: osd_initiator has also become a
>>> consumer of blk_rq_append_bio().
>>>
>>> It seems to be emulating block internals, so I think the fix is twofold:
>>>
>>> 1. adjust blk_rq_map_kern to call blk_rq_append_bio() instead of
>>> blk_rq_prep_bio() (with an extra failure path).
>>> 2. make osd_initiator simply call it for additions.
>>>
>>> I can code up a patch to see if it works.
>> So this is the patch to allow blk_rq_map_kern to append to requests,
>> which is what I think is needed.
>>
>> Unfortunately unwinding osd_initator's bio dependence and putting it
>> back on data buffers looks to be a bit of a longer chore.
>>
>> James
>>
>> ---
>>
>> diff --git a/block/blk-map.c b/block/blk-map.c
>> index 25d15ff..1a1e26d 100644
>> --- a/block/blk-map.c
>> +++ b/block/blk-map.c
>> @@ -289,6 +289,7 @@ int blk_rq_map_kern(struct request_queue *q, struct request *rq, void *kbuf,
>> int reading = rq_data_dir(rq) == READ;
>> int do_copy = 0;
>> struct bio *bio;
>> + int ret;
>>
>> if (len > (q->max_hw_sectors << 9))
>> return -EINVAL;
>> @@ -310,7 +311,13 @@ int blk_rq_map_kern(struct request_queue *q, struct request *rq, void *kbuf,
>> if (do_copy)
>> rq->cmd_flags |= REQ_COPY_USER;
>>
>> - blk_rq_bio_prep(q, rq, bio);
>> + ret = blk_rq_append_bio(q, rq, bio);
>> + if (unlikely(ret)) {
>> + /* request is too big */
>> + bio_put(bio);
>> + return ret;
>> + }
>> +
>> blk_queue_bounce(q, &rq->bio);
>> rq->buffer = rq->data = NULL;
>> return 0;
>>
>>
>
> This works, with your patch and below code
> I'm passing my tests. I would say it is pretty safe too,
> since blk_rq_bio_prep would leak the bio if it was called
> twice on same request, before.
>
> Thanks, I'll send a proper patch after some more testing.
>
> ---
> git diff --stat -p
> drivers/scsi/osd/osd_initiator.c | 12 +++---------
> 1 files changed, 3 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/scsi/osd/osd_initiator.c b/drivers/scsi/osd/osd_initiator.c
> index 1696130..9cfdce4 100644
> --- a/drivers/scsi/osd/osd_initiator.c
> +++ b/drivers/scsi/osd/osd_initiator.c
> @@ -824,18 +824,12 @@ EXPORT_SYMBOL(osd_req_add_set_attr_list);
> static int _append_map_kern(struct request *req,
> void *buff, unsigned len, gfp_t flags)
> {
> - struct bio *bio;
> int ret;
>
> - bio = bio_map_kern(req->q, buff, len, flags);
> - if (IS_ERR(bio)) {
> - OSD_ERR("Failed bio_map_kern(%p, %d) => %ld\n", buff, len,
> - PTR_ERR(bio));
> - return PTR_ERR(bio);
> - }
> - ret = blk_rq_append_bio(req->q, req, bio);
> + ret = blk_rq_map_kern(req->q, req, buff, len, flags);
> if (ret) {
> - OSD_ERR("Failed blk_rq_append_bio(%p) => %d\n", bio, ret);
> + OSD_DEBUG("Failed blk_rq_map_kern(%p, %u) => %d\n",
> + buff, len, ret);
> bio_put(bio);
> }
> return ret;
>
> --
I spoke too soon. There is one more place that uses blk_rq_append_bio, that is
the place that adds the read/write bio that is received in osd_req_write/read.
The reason I receive a bio at these is because mainly I need a way to
accept struct page* arrays, as well as kernel & user pointers. A bio is a nice
general carrier for any type of memory. Given a bio at hand there are no ways
left to prepare a request from it save the FS generic_make_request() route.
I was thinking of using struct sg_iovec* at one stage but they look very
scary when used with page*, and mapping a page to a pointer but not doing
cache sync and all that jazz. A bio is a very nice carrier of a scatter-gather
list of memory. It has all the API for any needs. blk_rq_append_bio() was the last
way to associate a bio with a request. (except for privileged block-filesystems)
So the first thing we have to decide is what API we need at read/write
today there is:
void osd_req_read(struct osd_request *or,
const struct osd_obj_id *, struct bio *data_in, u64 offset);
in exofs I use these two:
int osd_req_read_kern(struct osd_request *or,
const struct osd_obj_id *obj, u64 offset, void *buff, u64 len);
int osd_req_read_pages(struct osd_request *or,
const struct osd_obj_id *, u64 offset, u64 length,
struct page **pages, int page_count);
(Same for write)
pNFS layout driver is very similar.
Thanks
Boaz
next prev parent reply other threads:[~2009-02-11 9:15 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-12-13 16:23 [PATCH 0/3] remove scsi_req_map_sg FUJITA Tomonori
2008-12-13 16:23 ` [PATCH 1/3] " FUJITA Tomonori
2008-12-13 16:23 ` [PATCH 2/3] block: unexport blk_rq_append_bio FUJITA Tomonori
2008-12-13 16:23 ` [PATCH 3/3] block: unexport bio_add_pc_page FUJITA Tomonori
2009-02-10 17:43 ` [PATCH 2/3] block: unexport blk_rq_append_bio James Bottomley
2009-02-10 18:19 ` James Bottomley
2009-02-11 0:21 ` FUJITA Tomonori
2009-02-11 8:17 ` Boaz Harrosh
2009-02-11 8:19 ` Boaz Harrosh
2009-02-11 9:15 ` Boaz Harrosh [this message]
2009-02-11 14:32 ` FUJITA Tomonori
2009-02-11 14:52 ` Boaz Harrosh
2009-02-11 15:01 ` FUJITA Tomonori
2009-02-11 15:07 ` Boaz Harrosh
2009-02-11 15:21 ` FUJITA Tomonori
2009-02-11 15:41 ` Boaz Harrosh
2009-02-11 16:04 ` FUJITA Tomonori
2009-02-11 16:30 ` James Bottomley
2009-02-11 17:55 ` Boaz Harrosh
2009-02-12 1:30 ` FUJITA Tomonori
2009-02-12 8:24 ` Boaz Harrosh
2009-02-12 8:28 ` [RFD] blk_rq_map_pages new API Boaz Harrosh
2009-02-12 9:19 ` Boaz Harrosh
2009-02-12 9:50 ` FUJITA Tomonori
2009-02-12 10:20 ` FUJITA Tomonori
2009-02-12 11:34 ` Boaz Harrosh
2009-02-12 8:41 ` [PATCH 2/3] block: unexport blk_rq_append_bio FUJITA Tomonori
2009-02-12 9:14 ` Boaz Harrosh
2009-02-12 9:50 ` FUJITA Tomonori
2009-02-12 12:19 ` [PATCH] [RFC] block: Don't let blk_put_request leak BIOs Boaz Harrosh
2009-02-12 13:49 ` Boaz Harrosh
2009-02-12 13:56 ` Boaz Harrosh
2009-02-12 17:27 ` [PATCH 1/2] " Boaz Harrosh
2009-02-12 17:30 ` [PATCH 2/2] [RFC] libosd: Don't let osd abuse block internals, now that it's fixed Boaz Harrosh
2009-02-12 14:48 ` [PATCH 2/3] block: unexport blk_rq_append_bio James Bottomley
2009-02-12 16:51 ` Boaz Harrosh
2008-12-15 7:28 ` [PATCH 0/3] remove scsi_req_map_sg Jens Axboe
2008-12-18 8:14 ` FUJITA Tomonori
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=49929749.5020109@panasas.com \
--to=bharrosh@panasas.com \
--cc=James.Bottomley@HansenPartnership.com \
--cc=fujita.tomonori@lab.ntt.co.jp \
--cc=jens.axboe@oracle.com \
--cc=linux-scsi@vger.kernel.org \
/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.