All of lore.kernel.org
 help / color / mirror / Atom feed
From: Boaz Harrosh <bharrosh@panasas.com>
To: Jeff Garzik <jeff@garzik.org>,
	James Bottomley <James.Bottomley@HansenPartnership.com>,
	Jens Axboe <jens.axboe@oracle.com>,
	FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>,
	linux-scs
Subject: [RFC C 3/5] libosd: No bio for you
Date: Thu, 19 Mar 2009 16:35:51 +0200	[thread overview]
Message-ID: <49C25847.6000903@panasas.com> (raw)
In-Reply-To: <49C254FD.7020202@panasas.com>


Change osd_initiator API to not be bio based.
The new API will receive an array of pages to
write/read from. The pages info is held in a new
struct osd_page_array.

At osd_finalize_request the code uses the new
blk_rq_map_pages() API to build the request for
submission.

this patch is dependent on a block layer patch titled:
   [BLOCK] blk_rq_map_pages() new API

Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
---
 drivers/scsi/osd/osd_initiator.c |  109 +++++++++++++++++++++-----------------
 include/scsi/osd_initiator.h     |   31 +++++++++--
 2 files changed, 88 insertions(+), 52 deletions(-)

diff --git a/drivers/scsi/osd/osd_initiator.c b/drivers/scsi/osd/osd_initiator.c
index 8885524..d18402c 100644
--- a/drivers/scsi/osd/osd_initiator.c
+++ b/drivers/scsi/osd/osd_initiator.c
@@ -52,10 +52,6 @@
 #    define __unused			__attribute__((unused))
 #endif
 
-/* FIXME: Temporarly until next patch */
-#define osd_req_write osd_req_write_old
-#define osd_req_read  osd_req_read_old
-
 enum { OSD_REQ_RETRIES = 1 };
 
 MODULE_AUTHOR("Boaz Harrosh <bharrosh@panasas.com>");
@@ -585,25 +581,15 @@ static int _osd_req_list_objects(struct osd_request *or,
 	__be16 action, const struct osd_obj_id *obj, osd_id initial_id,
 	struct osd_obj_id_list *list, unsigned nelem)
 {
-	struct request_queue *q = or->osd_dev->scsi_device->request_queue;
 	u64 len = nelem * sizeof(osd_id) + sizeof(*list);
-	struct bio *bio;
 
 	_osd_req_encode_common(or, action, obj, (u64)initial_id, len);
 
 	if (list->list_identifier)
 		_osd_req_encode_olist(or, list);
 
-	WARN_ON(or->in.bio);
-	bio = bio_map_kern(q, list, len, or->alloc_flags);
-	if (!bio) {
-		OSD_ERR("!!! Failed to allocate list_objects BIO\n");
-		return -ENOMEM;
-	}
-
-	bio->bi_rw &= ~(1 << BIO_RW);
-	or->in.bio = bio;
-	or->in.total_bytes = bio->bi_size;
+	opa_map_kern(&or->in.opa, list, len);
+	or->in.total_bytes = len;
 	return 0;
 }
 
@@ -693,27 +679,35 @@ EXPORT_SYMBOL(osd_req_remove_object);
 	struct osd_obj_id *first, struct osd_obj_id_list *list, unsigned nelem);
 */
 
-void osd_req_write(struct osd_request *or,
+void osd_req_write_old(struct osd_request *or,
 	const struct osd_obj_id *obj, struct bio *bio, u64 offset)
 {
-	_osd_req_encode_common(or, OSD_ACT_WRITE, obj, offset, bio->bi_size);
-	WARN_ON(or->out.bio || or->out.total_bytes);
-	bio->bi_rw |= (1 << BIO_RW);
-	or->out.bio = bio;
-	or->out.total_bytes = bio->bi_size;
+	BUG_ON(1);
+}
+EXPORT_SYMBOL(osd_req_write_old);
+
+void osd_req_write(struct osd_request *or,
+	const struct osd_obj_id *obj, const struct osd_pages_array *opa,
+	u64 offset)
+{
+	_osd_req_encode_common(or, OSD_ACT_WRITE, obj, offset, opa->length);
+
+	WARN_ON(or->out.total_bytes);
+	WARN_ON(or->out.opa.length);
+	or->out.opa = *opa;
+	or->out.total_bytes = opa->length;
 }
 EXPORT_SYMBOL(osd_req_write);
 
 int osd_req_write_kern(struct osd_request *or,
-	const struct osd_obj_id *obj, u64 offset, void* buff, u64 len)
+	const struct osd_obj_id *obj, u64 offset, void *buff, u64 len)
 {
-	struct request_queue *req_q = or->osd_dev->scsi_device->request_queue;
-	struct bio *bio = bio_map_kern(req_q, buff, len, GFP_KERNEL);
+	struct osd_pages_array opa;
 
-	if (!bio)
-		return -ENOMEM;
+	memset(&opa, 0, sizeof(opa));
+	opa_map_kern(&opa, buff, len);
 
-	osd_req_write(or, obj, bio, offset);
+	osd_req_write(or, obj, &opa, offset);
 	return 0;
 }
 EXPORT_SYMBOL(osd_req_write_kern);
@@ -742,27 +736,35 @@ void osd_req_flush_object(struct osd_request *or,
 }
 EXPORT_SYMBOL(osd_req_flush_object);
 
-void osd_req_read(struct osd_request *or,
+void osd_req_read_old(struct osd_request *or,
 	const struct osd_obj_id *obj, struct bio *bio, u64 offset)
 {
-	_osd_req_encode_common(or, OSD_ACT_READ, obj, offset, bio->bi_size);
-	WARN_ON(or->in.bio || or->in.total_bytes);
-	bio->bi_rw &= ~(1 << BIO_RW);
-	or->in.bio = bio;
-	or->in.total_bytes = bio->bi_size;
+	BUG_ON(1);
+}
+EXPORT_SYMBOL(osd_req_read_old);
+
+void osd_req_read(struct osd_request *or,
+	const struct osd_obj_id *obj, const struct osd_pages_array *opa,
+	u64 offset)
+{
+	_osd_req_encode_common(or, OSD_ACT_READ, obj, offset, opa->length);
+
+	WARN_ON(or->in.total_bytes);
+	WARN_ON(or->in.opa.length);
+	or->in.opa = *opa;
+	or->in.total_bytes = opa->length;
 }
 EXPORT_SYMBOL(osd_req_read);
 
 int osd_req_read_kern(struct osd_request *or,
-	const struct osd_obj_id *obj, u64 offset, void* buff, u64 len)
+	const struct osd_obj_id *obj, u64 offset, void *buff, u64 len)
 {
-	struct request_queue *req_q = or->osd_dev->scsi_device->request_queue;
-	struct bio *bio = bio_map_kern(req_q, buff, len, GFP_KERNEL);
+	struct osd_pages_array opa;
 
-	if (!bio)
-		return -ENOMEM;
+	memset(&opa, 0, sizeof(opa));
+	opa_map_kern(&opa, buff, len);
 
-	osd_req_read(or, obj, bio, offset);
+	osd_req_read(or, obj, &opa, offset);
 	return 0;
 }
 EXPORT_SYMBOL(osd_req_read_kern);
@@ -1168,7 +1170,7 @@ static int _osd_req_finalize_data_integrity(struct osd_request *or,
 		unsigned pad;
 
 		or->out_data_integ.data_bytes = cpu_to_be64(
-			or->out.bio ? or->out.bio->bi_size : 0);
+			or->out.opa.length ?: 0);
 		or->out_data_integ.set_attributes_bytes = cpu_to_be64(
 			or->set_attr.total_bytes);
 		or->out_data_integ.get_attributes_bytes = cpu_to_be64(
@@ -1255,6 +1257,18 @@ out:
 	return ret;
 }
 
+static int _rq_map_opa(struct osd_request *or, struct _osd_io_info *io)
+{
+	if (io->opa.pages)
+		return blk_rq_map_pages(io->req->q, io->req, io->opa.pages,
+					io->opa.nr_pages, io->opa.offset,
+					io->opa.length, or->alloc_flags);
+	else
+		return blk_rq_map_kern(io->req->q, io->req,
+				       (void *)io->opa.offset, io->opa.length,
+				       or->alloc_flags);
+}
+
 int osd_finalize_request(struct osd_request *or,
 	u8 options, const void *cap, const u8 *cap_key)
 {
@@ -1273,8 +1287,8 @@ int osd_finalize_request(struct osd_request *or,
 
 	osd_set_caps(&or->cdb, cap);
 
-	has_in = or->in.bio || or->get_attr.total_bytes;
-	has_out = or->out.bio || or->set_attr.total_bytes ||
+	has_in = or->in.opa.length || or->get_attr.total_bytes;
+	has_out = or->out.opa.length || or->set_attr.total_bytes ||
 		or->enc_get_attr.total_bytes;
 
 	ret = _init_blk_request(or, has_in, has_out);
@@ -1283,9 +1297,8 @@ int osd_finalize_request(struct osd_request *or,
 		return ret;
 	}
 
-	if (or->out.bio) {
-		ret = blk_rq_append_bio(or->request->q, or->out.req,
-					or->out.bio);
+	if (or->out.opa.length) {
+		ret = _rq_map_opa(or, &or->out);
 		if (ret) {
 			OSD_DEBUG("blk_rq_append_bio out failed\n");
 			return ret;
@@ -1293,8 +1306,8 @@ int osd_finalize_request(struct osd_request *or,
 		OSD_DEBUG("out bytes=%llu (bytes_req=%u)\n",
 			_LLU(or->out.total_bytes), or->out.req->data_len);
 	}
-	if (or->in.bio) {
-		ret = blk_rq_append_bio(or->request->q, or->in.req, or->in.bio);
+	if (or->in.opa.length) {
+		ret = _rq_map_opa(or, &or->in);
 		if (ret) {
 			OSD_DEBUG("blk_rq_append_bio in failed\n");
 			return ret;
diff --git a/include/scsi/osd_initiator.h b/include/scsi/osd_initiator.h
index 7a317aa..fa32074 100644
--- a/include/scsi/osd_initiator.h
+++ b/include/scsi/osd_initiator.h
@@ -78,6 +78,21 @@ static inline void osd_dev_set_ver(struct osd_dev *od, enum osd_std_version v)
 #endif
 }
 
+struct osd_pages_array {
+	struct page **pages;
+	unsigned nr_pages;
+	unsigned long offset;
+	unsigned long length;
+};
+
+static inline void opa_map_kern(struct osd_pages_array *opa, void *buff,
+				unsigned long length)
+{
+	WARN_ON(opa->pages || opa->offset);
+	opa->offset = (unsigned long)buff;
+	opa->length = length;
+}
+
 struct osd_request;
 typedef void (osd_req_done_fn)(struct osd_request *or, void *private);
 
@@ -96,7 +111,7 @@ struct osd_request {
 	} set_attr, enc_get_attr, get_attr;
 
 	struct _osd_io_info {
-		struct bio *bio;
+		struct osd_pages_array opa;
 		u64 total_bytes;
 		struct request *req;
 		struct _osd_req_data_segment *last_seg;
@@ -364,12 +379,16 @@ void osd_req_remove_object(struct osd_request *or, struct osd_obj_id *);
 
 void __deprecated osd_req_write_old(struct osd_request *or,
 	const struct osd_obj_id *, struct bio *data_out, u64 offset);
+
+void osd_req_write(struct osd_request *or,
+	const struct osd_obj_id *, const struct osd_pages_array *opa,
+	u64 offset);
 int osd_req_write_kern(struct osd_request *or,
 	const struct osd_obj_id *obj, u64 offset, void *buff, u64 len);
 void osd_req_append(struct osd_request *or,
-	const struct osd_obj_id *, struct bio *data_out);/* NI */
-void osd_req_create_write(struct osd_request *or,
-	const struct osd_obj_id *, struct bio *data_out, u64 offset);/* NI */
+	const struct osd_obj_id *, struct osd_pages_array *opa_out);/* NI */
+void osd_req_create_write(struct osd_request *or, /* NI */
+	const struct osd_obj_id *, struct osd_pages_array *opa_out, u64 offset);
 void osd_req_clear(struct osd_request *or,
 	const struct osd_obj_id *, u64 offset, u64 len);/* NI */
 void osd_req_punch(struct osd_request *or,
@@ -381,6 +400,10 @@ void osd_req_flush_object(struct osd_request *or,
 
 void __deprecated osd_req_read_old(struct osd_request *or,
 	const struct osd_obj_id *, struct bio *data_in, u64 offset);
+
+void osd_req_read(struct osd_request *or,
+	const struct osd_obj_id *, const struct osd_pages_array *opa_in,
+	u64 offset);
 int osd_req_read_kern(struct osd_request *or,
 	const struct osd_obj_id *obj, u64 offset, void *buff, u64 len);
 
-- 
1.6.2.1



  parent reply	other threads:[~2009-03-19 14:37 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-03-19 14:21 [RFD] [PATCHSETS 0/2 0/2 0/5] Remove of blk_rq_append_bio usage Boaz Harrosh
2009-03-19 14:24 ` [PATCH A 1/2] allow blk_rq_map_kern to append to requests Boaz Harrosh
2009-03-19 14:27 ` [PATCH A 2/2] libosd: Use new blk_rq_map_kern Boaz Harrosh
2009-03-19 14:30 ` [RFC B 1/2] Export new blk_make_request() which takes bio and returns request Boaz Harrosh
2009-03-19 14:31 ` [RFC B 2/2] libosd: Use of new blk_make_request Boaz Harrosh
2009-03-19 14:33 ` [RFC C 1/5] blk_rq_map_pages() new API Boaz Harrosh
2009-03-19 14:34 ` [RFC C 2/5] libosd: Rename osd_req_write/read to osd_req_write/read_old Boaz Harrosh
2009-03-19 14:35 ` Boaz Harrosh [this message]
2009-03-19 14:37 ` [RFC C 4/5] exofs: No bio for you Boaz Harrosh
2009-03-19 14:38 ` [RFC C 5/5] libosd: Remove deprecated bio based API 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=49C25847.6000903@panasas.com \
    --to=bharrosh@panasas.com \
    --cc=James.Bottomley@HansenPartnership.com \
    --cc=fujita.tomonori@lab.ntt.co.jp \
    --cc=jeff@garzik.org \
    --cc=jens.axboe@oracle.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.