提交 62f469b5 编写于 作者: B Boaz Harrosh 提交者: James Bottomley

[SCSI] libosd: osd_req_{read,write} takes a length parameter

For supporting of chained-bios we can not inspect the first
bio only, as before. Caller shall pass the total length of the
request, ie. sum_bytes(bio-chain).

Also since the bio might be a chain we don't set it's direction
on behalf of it's callers. The bio direction should be properly
set prior to this call. So fix a couple of write users that now
need to set the bio direction properly

[In this patch I change both library code and user sites at
 exofs, to make it easy on integration. It should be submitted
 via James's scsi-misc tree.]
Signed-off-by: NBoaz Harrosh <bharrosh@panasas.com>
CC: Jeff Garzik <jeff@garzik.org>
Signed-off-by: NJames Bottomley <James.Bottomley@HansenPartnership.com>
上级 546881ae
...@@ -779,13 +779,14 @@ EXPORT_SYMBOL(osd_req_remove_object); ...@@ -779,13 +779,14 @@ EXPORT_SYMBOL(osd_req_remove_object);
*/ */
void osd_req_write(struct osd_request *or, void osd_req_write(struct osd_request *or,
const struct osd_obj_id *obj, struct bio *bio, u64 offset) const struct osd_obj_id *obj, u64 offset,
struct bio *bio, u64 len)
{ {
_osd_req_encode_common(or, OSD_ACT_WRITE, obj, offset, bio->bi_size); _osd_req_encode_common(or, OSD_ACT_WRITE, obj, offset, len);
WARN_ON(or->out.bio || or->out.total_bytes); WARN_ON(or->out.bio || or->out.total_bytes);
bio->bi_rw |= (1 << BIO_RW); WARN_ON(0 == bio_rw_flagged(bio, BIO_RW));
or->out.bio = bio; or->out.bio = bio;
or->out.total_bytes = bio->bi_size; or->out.total_bytes = len;
} }
EXPORT_SYMBOL(osd_req_write); EXPORT_SYMBOL(osd_req_write);
...@@ -798,7 +799,8 @@ int osd_req_write_kern(struct osd_request *or, ...@@ -798,7 +799,8 @@ int osd_req_write_kern(struct osd_request *or,
if (IS_ERR(bio)) if (IS_ERR(bio))
return PTR_ERR(bio); return PTR_ERR(bio);
osd_req_write(or, obj, bio, offset); bio->bi_rw |= (1 << BIO_RW); /* FIXME: bio_set_dir() */
osd_req_write(or, obj, offset, bio, len);
return 0; return 0;
} }
EXPORT_SYMBOL(osd_req_write_kern); EXPORT_SYMBOL(osd_req_write_kern);
...@@ -828,13 +830,14 @@ void osd_req_flush_object(struct osd_request *or, ...@@ -828,13 +830,14 @@ void osd_req_flush_object(struct osd_request *or,
EXPORT_SYMBOL(osd_req_flush_object); EXPORT_SYMBOL(osd_req_flush_object);
void osd_req_read(struct osd_request *or, void osd_req_read(struct osd_request *or,
const struct osd_obj_id *obj, struct bio *bio, u64 offset) const struct osd_obj_id *obj, u64 offset,
struct bio *bio, u64 len)
{ {
_osd_req_encode_common(or, OSD_ACT_READ, obj, offset, bio->bi_size); _osd_req_encode_common(or, OSD_ACT_READ, obj, offset, len);
WARN_ON(or->in.bio || or->in.total_bytes); WARN_ON(or->in.bio || or->in.total_bytes);
bio->bi_rw &= ~(1 << BIO_RW); WARN_ON(1 == bio_rw_flagged(bio, BIO_RW));
or->in.bio = bio; or->in.bio = bio;
or->in.total_bytes = bio->bi_size; or->in.total_bytes = len;
} }
EXPORT_SYMBOL(osd_req_read); EXPORT_SYMBOL(osd_req_read);
...@@ -847,7 +850,7 @@ int osd_req_read_kern(struct osd_request *or, ...@@ -847,7 +850,7 @@ int osd_req_read_kern(struct osd_request *or,
if (IS_ERR(bio)) if (IS_ERR(bio))
return PTR_ERR(bio); return PTR_ERR(bio);
osd_req_read(or, obj, bio, offset); osd_req_read(or, obj, offset, bio, len);
return 0; return 0;
} }
EXPORT_SYMBOL(osd_req_read_kern); EXPORT_SYMBOL(osd_req_read_kern);
......
...@@ -266,7 +266,7 @@ static int read_exec(struct page_collect *pcol, bool is_sync) ...@@ -266,7 +266,7 @@ static int read_exec(struct page_collect *pcol, bool is_sync)
goto err; goto err;
} }
osd_req_read(or, &obj, pcol->bio, i_start); osd_req_read(or, &obj, i_start, pcol->bio, pcol->length);
if (is_sync) { if (is_sync) {
exofs_sync_op(or, pcol->sbi->s_timeout, oi->i_cred); exofs_sync_op(or, pcol->sbi->s_timeout, oi->i_cred);
...@@ -522,7 +522,8 @@ static int write_exec(struct page_collect *pcol) ...@@ -522,7 +522,8 @@ static int write_exec(struct page_collect *pcol)
*pcol_copy = *pcol; *pcol_copy = *pcol;
osd_req_write(or, &obj, pcol_copy->bio, i_start); pcol_copy->bio->bi_rw |= (1 << BIO_RW); /* FIXME: bio_set_dir() */
osd_req_write(or, &obj, i_start, pcol_copy->bio, pcol_copy->length);
ret = exofs_async_op(or, writepages_done, pcol_copy, oi->i_cred); ret = exofs_async_op(or, writepages_done, pcol_copy, oi->i_cred);
if (unlikely(ret)) { if (unlikely(ret)) {
EXOFS_ERR("write_exec: exofs_async_op() Faild\n"); EXOFS_ERR("write_exec: exofs_async_op() Faild\n");
......
...@@ -363,7 +363,7 @@ void osd_req_create_object(struct osd_request *or, struct osd_obj_id *); ...@@ -363,7 +363,7 @@ 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_remove_object(struct osd_request *or, struct osd_obj_id *);
void osd_req_write(struct osd_request *or, void osd_req_write(struct osd_request *or,
const struct osd_obj_id *, struct bio *data_out, u64 offset); const struct osd_obj_id *obj, u64 offset, struct bio *bio, u64 len);
int osd_req_write_kern(struct osd_request *or, 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);
void osd_req_append(struct osd_request *or, void osd_req_append(struct osd_request *or,
...@@ -380,7 +380,7 @@ void osd_req_flush_object(struct osd_request *or, ...@@ -380,7 +380,7 @@ void osd_req_flush_object(struct osd_request *or,
/*V2*/ u64 offset, /*V2*/ u64 len); /*V2*/ u64 offset, /*V2*/ u64 len);
void osd_req_read(struct osd_request *or, void osd_req_read(struct osd_request *or,
const struct osd_obj_id *, struct bio *data_in, u64 offset); const struct osd_obj_id *obj, u64 offset, struct bio *bio, u64 len);
int osd_req_read_kern(struct osd_request *or, 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);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册