mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-09 15:29:16 +00:00
[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: Boaz Harrosh <bharrosh@panasas.com> CC: Jeff Garzik <jeff@garzik.org> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
This commit is contained in:
parent
546881aea9
commit
62f469b596
@ -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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
*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 *);
|
|||||||
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,
|
|||||||
/*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);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user