Remove of blk_rq_append_bio usage
Subsystems (2)
cover Remove of blk_rq_append_bio usage
Hi all
In an effort to remove blk_rq_append_bio() and only use well published block API, I would like to propose the below solution for OSD and exofs.
Current discussion has two sides:
* blk_make_request():
exofs and other non-block-based filesystems can use a bio, in which case a well established block API should allow of allocating a request given a bio.
* blk_rq_map_pages():
Let filesystems submit an array of page-pointers, and refrain from using bio(s). bio(s) is a privilege of block-based filesystems only.
The first solution is trivial, robust, safe with minimum changes and impact. It will allow any future directions easily.
I have also implemented a second approach with the use of a new blk_rq_map_pages. It works, all exofs tests pass successfully just as with today's code. But I hate it because:
* Jeff Garzik is working on a block-over-osd-object block-device. I'm not sure of his plans, but sitting under block-layer at it's prepare_fn routine, the most trivial solution is to pass the bio as is to libosd. Otherwise he will need to copy and recopy all these pages information.
Jeff please comment.
* Use of the in-kernel raid engines.
Current dm-raid engines are heavily bio based. If we want to tap into-that (And we must) from exofs and pNFS-objects-layout we have no choice but to use bio(s) and be able to submit bios.
* For any none trivial usage, even today. bio is more stable, robust faster. and less code since it is already there.
Here is some code:
[PATCHSET 0/2] Allow append of kernel pointers to request
[PATCH 1/4] allow blk_rq_map_kern to append to requests [PATCH 2/4] libosd: Use new blk_rq_map_kern
These two patches are not disputable and safe and should go in as is even to 2.6.30. They remove one usage of blk_rq_append_bio from the osd_initiator.
[PROPOSAL_1 0/2] blk_make_request()
[PATCH 3/4] [RFC] Export new blk_make_request() which takes bio and returns request [PATCH 4/4] libosd: Use of new blk_make_request
This is option one above. Trivial, cosmetic, no core changes.
[PROPOSAL_2 0/5] blk_rq_map_pages()
[RFC 1/5] blk_rq_map_pages() new API
[RFC 2/5] libosd: Rename osd_req_write/read to osd_req_write/read_old [RFC 3/5] libosd: No bio for you
[RFC 4/5] exofs: No bio for you
[RFC 5/5] libosd: Remove deprecated bio based API
This is option two above. Needs lots of core changes to exofs. After patch 5/5 code runs well, all tests pass. There is runtime bisectability problem, the exofs will not run between [3/5]-[4/5].
Please advise
Boaz
PATCH 1/2 allow blk_rq_map_kern to append to requests
From: James Bottomley <[email protected]>
Use blk_rq_append_bio() internally instead of blk_rq_bio_prep() so blk_rq_map_kern can be called multiple times, to map multiple buffers.
This is in the effort to un-export blk_rq_append_bio()
--- block/blk-map.c | 12 ++++++++++-- 1 files changed, 10 insertions(+), 2 deletions(-)
block/blk-map.c +10 -2
@@ -282,7 +282,8 @@ EXPORT_SYMBOL(blk_rq_unmap_user);* * Description: * Data will be mapped directly if possible. Otherwise a bounce -* buffer is used. +* buffer is used. Can be called multiple times to append multiple +* buffers. */ int blk_rq_map_kern (struct request_queue *q,struct request *rq,void *kbuf,unsigned int len,gfp_t gfp_mask)
@@ -290,6 +291,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 ;
@@ -311,7 +313,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 ;
Signature · 1 line
1.6.2.1
PATCH 2/2 libosd: Use new blk_rq_map_kern
In reply to Boaz HarroshNow that blk_rq_map_kern will append the buffer onto the request we can use it easily for adding extra segments (eg. attributes)
This patch is dependent on a block layer patch titled:
[BLOCK] allow blk_rq_map_kern to append to requests
--- drivers/scsi/osd/osd_initiator.c | 24 ++---------------------- 1 files changed, 2 insertions(+), 22 deletions(-)
drivers/scsi/osd/osd_initiator.c +2 -22
@@ -834,26 +834,6 @@ int osd_req_add_set_attr_list(struct osd_request *or, }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); -if (ret) { -OSD_ERR ("Failed blk_rq_append_bio(%p) => %d\n" , bio, ret); -bio_put (bio); - } -return ret; -} -static int _req_append_segment (struct osd_request *or,unsigned padding,struct _osd_req_data_segment *seg,struct _osd_req_data_segment *last_seg,struct _osd_io_info *io)
@@ -869,14 +849,14 @@ static int _req_append_segment(struct osd_request *or,else pad_buff = io->pad_buff; - ret =_append_map_kern (io->req, pad_buff, padding, + ret =blk_rq_map_kern (io->req->q, io->req, pad_buff, padding, or->alloc_flags);if (ret)return ret; io->total_bytes += padding; } - ret =_append_map_kern (io->req, seg->buff, seg->total_bytes, + ret =blk_rq_map_kern (io->req->q, io->req, seg->buff, seg->total_bytes, or->alloc_flags);if (ret)return ret;
Signature · 1 line
1.6.2.1
RFC 1/2 Export new blk_make_request() which takes bio and returns request
In reply to Boaz Harroshgiven a struct bio allocates a new request. This is the parallel of generic_make_request for BLOCK_PC commands users.
The new API is:
+struct request *blk_make_request(struct request_queue *q, struct bio *bio,
+ gfp_t gfp_mask);
This is in the effort of un-exporting blk_rq_append_bio()
--- block/blk-core.c | 13 +++++++++++++ include/linux/blkdev.h | 5 ++++- 2 files changed, 17 insertions(+), 1 deletions(-)
block/blk-core.c +13 -0
@@ -903,6 +903,19 @@ struct request *blk_get_request(struct request_queue *q, int rw, gfp_t gfp_mask) }EXPORT_SYMBOL (blk_get_request); +struct request *blk_make_request (struct request_queue *q,struct bio *bio, +gfp_t gfp_mask) +{ +struct request *rq =blk_get_request (q,bio_data_dir (bio), gfp_mask); + +if (rq) { +blk_rq_bio_prep (q, rq, bio); +blk_queue_bounce (q, &rq->bio); + } +return rq; +} +EXPORT_SYMBOL (blk_make_request); +/** * blk_start_queueing - initiate dispatch of requests to device * @q: request queue to kick into gear
include/linux/blkdev.h +2 -0
@@ -729,6 +729,8 @@ extern void blk_rq_init(struct request_queue *q, struct request *rq);extern void blk_put_request (struct request *);extern void __blk_put_request (struct request_queue *,struct request *);extern struct request *blk_get_request (struct request_queue *,int ,gfp_t ); +extern struct request *blk_make_request (struct request_queue *,struct bio *, +gfp_t );extern void blk_insert_request (struct request_queue *,struct request *,int ,void *);extern void blk_requeue_request (struct request_queue *,struct request *);extern int blk_rq_check_limits (struct request_queue *q,struct request *rq);
RFC 2/2 libosd: Use of new blk_make_request
In reply to Boaz HarroshUse new blk_make_request() to allocate a request from bio and avoid using deprecated blk_rq_append_bio().
This patch is dependent on a block layer patch titled:
[BLOCK] Export new blk_make_request() which takes bio \
and returns request
--- drivers/scsi/osd/osd_initiator.c | 33 +++++++++++---------------------- 1 files changed, 11 insertions(+), 22 deletions(-)
drivers/scsi/osd/osd_initiator.c +11 -22
@@ -1208,6 +1208,14 @@ static int _osd_req_finalize_data_integrity(struct osd_request *or,/* * osd_finalize_request and helpers */ +struct request *_make_request (struct request_queue *q,bool has_write, +struct bio *bio,gfp_t flags) +{ +if (bio) +return blk_make_request (q, bio, flags); +else +return blk_get_request (q, has_write ?WRITE :READ , flags); +}static int _init_blk_request (struct osd_request *or,bool has_in,bool has_out)
@@ -1218,7 +1226,8 @@ static int _init_blk_request(struct osd_request *or,struct request *req;int ret = -ENOMEM ; - req =blk_get_request (q, has_out, flags); + req =_make_request (q, has_out, has_out ? or->out.bio : or->in.bio, + flags);if (!req) goto out;
@@ -1233,7 +1242,7 @@ static int _init_blk_request(struct osd_request *or, or->out.req = req;if (has_in) {/* allocate bidi request */ - req =blk_get_request (q,READ , flags); + req =_make_request (q, false, or->in.bio, flags);if (!req) {OSD_DEBUG ("blk_get_request for bidi failed\n" ); goto out;
@@ -1279,26 +1288,6 @@ 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 (ret) { -OSD_DEBUG ("blk_rq_append_bio out failed\n" ); -return ret; - } -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 (ret) { -OSD_DEBUG ("blk_rq_append_bio in failed\n" ); -return ret; - } -OSD_DEBUG ("in bytes=%llu (bytes_req=%u)\n" , -_LLU (or->in.total_bytes), or->in.req->data_len); - } - or->out.pad_buff = sg_out_pad_buffer; or->in.pad_buff = sg_in_pad_buffer;
Signature · 1 line
1.6.2.1
RFC 1/5 blk_rq_map_pages() new API
In reply to Boaz HarroshDefine a new API for mapping array of pages into a request.
Internally the bio is created using the rq_map_data + null_mapped + NULL_buffer mode of bio_copy_user(). The bio is only referenced once and there is no unmap function to call.
TODO:
out of the 7 users of blk_rq_map_user + rq_map_data, 6 of them are null_mapped + NULL_buffer and could be converted to this API.
--- block/blk-map.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/blkdev.h | 3 ++ 2 files changed, 57 insertions(+), 0 deletions(-)
block/blk-map.c +54 -0
@@ -325,3 +325,57 @@ int blk_rq_map_kern(struct request_queue *q, struct request *rq, void *kbuf,return 0 ; }EXPORT_SYMBOL (blk_rq_map_kern); + +/** +* blk_rq_map_pages - map pages array to a request, for REQ_TYPE_BLOCK_PC usage +* @q: request queue where request should be inserted +* @rq: request to fill +* @pages: an array of struct page pointers to map +* @nr_pages: count of valid pages at @pages +* @offset: Offset into first page to start from (Must be blk_rq_aligned()) +* @len: length of user data to map +* @gfp_mask: memory allocation flags +* +* Description: +* Data will be mapped directly if possible. Otherwise a bounce +* buffer is used. Can be called multiple times to append multiple +* page arrays. No need to call an unmap function, and bio is only +* referenced once. (Pages are of zero order) +*/ +int blk_rq_map_pages (struct request_queue *q,struct request *rq, +struct page **pages,unsigned nr_pages, +unsigned long offset,unsigned len,gfp_t gfp_mask) +{ +struct bio *bio; +int reading, ret; +struct rq_map_data map_data = { + .pages = pages, + .nr_entries = nr_pages, + .offset = offset, + .null_mapped =1 , + .page_order =0 , + }; + + reading =rq_data_dir (rq) ==READ ; + +/* The name is confusing, but bio_copy_user+map_data+NULL_buffer +* Actually just adds the pages to the bio, no copy is performed. +*/ + bio =bio_copy_user (q, &map_data,0 , len, reading, gfp_mask); + +if (IS_ERR (bio)) +return PTR_ERR (bio); + + bio->bi_flags |= (1 <<BIO_NULL_MAPPED ); + +/* We might still need to bounce if memory mask does not match */ +blk_queue_bounce (q, &bio); + + ret =blk_rq_append_bio (q, rq, bio); +if (likely (!ret)) +return 0 ; + +bio_put (bio); +return ret; +} +EXPORT_SYMBOL (blk_rq_map_pages);
include/linux/blkdev.h +3 -0
@@ -784,6 +784,9 @@ extern int blk_rq_map_user(struct request_queue *, struct request *,extern int blk_rq_unmap_user (struct bio *);extern int blk_rq_map_kern (struct request_queue *,struct request *,void *,unsigned int ,gfp_t ); +extern int blk_rq_map_pages (struct request_queue *,struct request *, +struct page **,unsigned ,unsigned long offset, +unsigned ,gfp_t );extern int blk_rq_map_user_iov (struct request_queue *,struct request *,struct rq_map_data *,struct sg_iovec *,int ,unsigned int ,gfp_t );
Signature · 1 line
1.6.2.1
RFC 2/5 libosd: Rename osd_req_write/read to osd_req_write/read_old
In reply to Boaz HarroshIn an attempt to not use bio(s) at the initiator, we want to convert to something else (array of page pointers). This patch renames the current bio API to xxx_old.
The next patch will implement the new API.
After all Kernel users (exofs) will convert to the new API The old can be removed.
The API is marked __deprecated and will spew warnings until conversion is done.
Note that this patch patches all users (exofs)
--- drivers/scsi/osd/osd_initiator.c | 4 ++++ fs/exofs/common.h | 4 ++++ include/scsi/osd_initiator.h | 4 ++-- 3 files changed, 10 insertions(+), 2 deletions(-)
drivers/scsi/osd/osd_initiator.c +4 -0
@@ -52,6 +52,10 @@# 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 <[email protected]>" );
fs/exofs/common.h +4 -0
@@ -44,6 +44,10 @@#include <scsi/osd_initiator.h> #include <scsi/osd_sec.h> +/* FIXME: Temporarly until exofs tree syncs with scsi-misc's osd_initiator */ +#define osd_req_write osd_req_write_old +#define osd_req_read osd_req_read_old +/**************************************************************************** * Object ID related defines * NOTE: inode# = object ID - EXOFS_OBJ_OFF
include/scsi/osd_initiator.h +2 -2
@@ -362,7 +362,7 @@ void osd_req_set_member_attrs(struct osd_request *or, ...);/* V2-only NI */void osd_req_create_object (struct osd_request *or,struct osd_obj_id *);void osd_req_remove_object (struct osd_request *or,struct osd_obj_id *); -void osd_req_write (struct osd_request *or, +void __deprecated osd_req_write_old (struct osd_request *or,const struct osd_obj_id *,struct bio *data_out,u64 offset);int osd_req_write_kern (struct osd_request *or,const struct osd_obj_id *obj,u64 offset,void *buff,u64 len);
@@ -379,7 +379,7 @@ void osd_req_flush_object(struct osd_request *or, const struct osd_obj_id *, enum osd_options_flush_scope_values, /*V2*/ u64 offset, /*V2*/ u64 len); -void osd_req_read (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);int osd_req_read_kern (struct osd_request *or,const struct osd_obj_id *obj,u64 offset,void *buff,u64 len);
Signature · 1 line
1.6.2.1
RFC 3/5 libosd: No bio for you
In reply to Boaz HarroshChange 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
--- drivers/scsi/osd/osd_initiator.c | 109 +++++++++++++++++++++----------------- include/scsi/osd_initiator.h | 31 +++++++++-- 2 files changed, 88 insertions(+), 52 deletions(-)
drivers/scsi/osd/osd_initiator.c +61 -48
@@ -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 <[email protected]>" );
@@ -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;
include/scsi/osd_initiator.h +27 -4
@@ -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);
Signature · 1 line
1.6.2.1
RFC 4/5 exofs: No bio for you
In reply to Boaz Harroshbio based API to osd_initiator is depreciated. Move to a page array API when writing/reading pages.
--- fs/exofs/common.h | 4 -- fs/exofs/inode.c | 108 +++++++++++++++++++++++++++-------------------------- 2 files changed, 55 insertions(+), 57 deletions(-)
fs/exofs/common.h +0 -4
@@ -44,10 +44,6 @@#include <scsi/osd_initiator.h> #include <scsi/osd_sec.h> -/* FIXME: Temporarly until exofs tree syncs with scsi-misc's osd_initiator */ -#define osd_req_write osd_req_write_old -#define osd_req_read osd_req_read_old -/**************************************************************************** * Object ID related defines * NOTE: inode# = object ID - EXOFS_OBJ_OFF
fs/exofs/inode.c +55 -53
285 lines not on this page · raw message
Signature · 1 line
1.6.2.1
RFC 5/5 libosd: Remove deprecated bio based API
In reply to Boaz HarroshFeel good be happy
--- drivers/scsi/osd/osd_initiator.c | 14 -------------- include/scsi/osd_initiator.h | 6 ------ 2 files changed, 0 insertions(+), 20 deletions(-)
drivers/scsi/osd/osd_initiator.c +0 -14
@@ -679,13 +679,6 @@ EXPORT_SYMBOL(osd_req_remove_object);struct osd_obj_id *first, struct osd_obj_id_list *list, unsigned nelem); */ -void osd_req_write_old (struct osd_request *or, -const struct osd_obj_id *obj,struct bio *bio,u64 offset) -{ -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)
@@ -736,13 +729,6 @@ void osd_req_flush_object(struct osd_request *or, }EXPORT_SYMBOL (osd_req_flush_object); -void osd_req_read_old (struct osd_request *or, -const struct osd_obj_id *obj,struct bio *bio,u64 offset) -{ -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)
include/scsi/osd_initiator.h +0 -6
@@ -377,9 +377,6 @@ void osd_req_set_member_attrs(struct osd_request *or, ...);/* V2-only NI */void osd_req_create_object (struct osd_request *or,struct osd_obj_id *);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);
@@ -398,9 +395,6 @@ void osd_req_flush_object(struct osd_request *or, const struct osd_obj_id *, enum osd_options_flush_scope_values, /*V2*/ u64 offset, /*V2*/ u64 len); -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);
Signature · 1 line
1.6.2.1