From: Jens Axboe <jens.axboe@oracle.com>
To: Jeff Garzik <jeff@garzik.org>
Cc: LKML <linux-kernel@vger.kernel.org>,
linux-scsi@vger.kernel.org, linux-fsdevel@vger.kernel.org,
Andrew Morton <akpm@linux-foundation.org>
Subject: Re: [PATCH] osdblk: a Linux block device for OSD objects
Date: Fri, 3 Apr 2009 11:49:09 +0200 [thread overview]
Message-ID: <20090403094909.GQ5178@kernel.dk> (raw)
In-Reply-To: <20090402015455.GA14087@havoc.gtf.org>
On Wed, Apr 01 2009, Jeff Garzik wrote:
>
> As I promised in older exofs threads, here is a client for libosd
> _other_ than exofs. This block driver exports a single OSD object
> as a Linux block device.
>
> See the comment block at the top of the driver for usage instructions.
>
>
>
> +static void osdblk_end_request(struct osdblk_device *osdev,
> + struct osdblk_request *orq,
> + int error)
> +{
> + struct request *rq = orq->rq;
> + int rc;
> +
> + /* complete request, at block layer */
> + rc = __blk_end_request(rq, error, blk_rq_bytes(rq));
> +
> + /* clear request slot for use */
> + osdev->req[orq->tag].rq = NULL;
> +
> + /* restart queue, if necessary */
> + blk_start_queue(osdev->q);
> +}
> +
> +static void osdblk_osd_complete(struct osd_request *or, void *private)
> +{
> + struct osdblk_request *orq = private;
> + struct osd_sense_info osi;
> + int ret = osd_req_decode_sense(or, &osi);
> +
> + if (ret)
> + ret = -EIO;
> +
> + osd_end_request(or);
> + osdblk_end_request(orq->osdev, orq, ret);
> +}
> +
> +static void osdblk_rq_fn(struct request_queue *q)
> +{
> + struct osdblk_device *osdev = q->queuedata;
> + struct request *rq;
> + struct osdblk_request *orq;
> + struct osd_request *or;
> + struct bio *bio;
> + int rq_idx, do_write;
> +
> + while (1) {
> + rq = elv_next_request(q);
> + if (!rq)
> + break;
> +
> + do_write = (rq_data_dir(rq) == WRITE);
> +
> + bio = bio_clone(rq->bio, GFP_NOIO);
> + if (!bio)
> + break;
This wont work, GFP_NOIO inside the queue lock. You are also only
cloning the front bio, what happens if you have > 1 bio on the request?
You seem to dequeue the request and complete all of it, regardless of
whether bio->bi_size == blk_rq_bytes(rq). I'm assuming you have to clone
because of how the osd_req_{read,write} works, so I'd suggest storing
the byte size in your osdblk_request and only completing that in
osdblk_end_request(). Then do a rq_for_each_bio() look in there, and
only dequeue if you manage to start an osd request for each of them,
THEN moving on to the next request.
--
Jens Axboe
next prev parent reply other threads:[~2009-04-03 9:49 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-04-02 1:54 [PATCH] osdblk: a Linux block device for OSD objects Jeff Garzik
2009-04-02 2:05 ` Jeff Garzik
2009-04-02 12:26 ` Boaz Harrosh
2009-04-02 16:46 ` Jeff Garzik
2009-04-03 9:38 ` Jeff Garzik
2009-04-05 10:22 ` Boaz Harrosh
2009-04-03 1:32 ` James Bottomley
2009-04-03 10:14 ` Jeff Garzik
2009-04-03 9:49 ` Jens Axboe [this message]
2009-04-03 9:58 ` Jeff Garzik
2009-04-05 10:18 ` Boaz Harrosh
2009-04-08 1:29 ` Jeff Garzik
2009-04-08 5:45 ` Jens Axboe
2009-04-08 6:02 ` Jeff Garzik
2009-04-08 6:08 ` Jens Axboe
2009-04-07 7:26 ` Pavel Machek
2009-04-07 22:53 ` [PATCH v2] " Jeff Garzik
2009-04-10 11:48 ` [PATCH 1/3] block/blk-map.c: blk_rq_append_bio should ensure it's not appending a chain Jeff Garzik
2009-04-10 11:49 ` [PATCH 2/3] osd_initiator: support bio chains Jeff Garzik
2009-04-10 11:50 ` [PATCH 3/3 v3] osdblk: a Linux block device for OSD objects Jeff Garzik
2009-04-27 15:59 ` Boaz Harrosh
2009-04-27 18:24 ` Jens Axboe
2009-04-28 9:40 ` Boaz Harrosh
2009-04-27 16:02 ` [PATCH 2/3] osd_initiator: support bio chains Boaz Harrosh
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=20090403094909.GQ5178@kernel.dk \
--to=jens.axboe@oracle.com \
--cc=akpm@linux-foundation.org \
--cc=jeff@garzik.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--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.