mirror of
https://github.com/torvalds/linux.git
synced 2024-11-28 15:11:31 +00:00
rbd: record image-relative offset in object requests
For an image object request we will need to know what offset within the rbd image the request covers. Record that when the object request gets created. Update the I/O error warnings so they use this so what's reported is more informative. Rename a local variable to fit the convention used everywhere else. Signed-off-by: Alex Elder <elder@inktank.com> Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
This commit is contained in:
parent
55f27e0931
commit
7da22d296d
@ -176,6 +176,7 @@ struct rbd_obj_request {
|
||||
u64 length; /* bytes from offset */
|
||||
|
||||
struct rbd_img_request *img_request;
|
||||
u64 img_offset; /* image relative offset */
|
||||
struct list_head links; /* img_request->obj_requests */
|
||||
u32 which; /* posn image request list */
|
||||
|
||||
@ -1576,8 +1577,13 @@ static void rbd_img_obj_callback(struct rbd_obj_request *obj_request)
|
||||
xferred = (unsigned int)obj_request->xferred;
|
||||
result = obj_request->result;
|
||||
if (result) {
|
||||
rbd_warn(NULL, "obj_request %s result %d xferred %u\n",
|
||||
struct rbd_device *rbd_dev = img_request->rbd_dev;
|
||||
|
||||
rbd_warn(rbd_dev, "%s %llx at %llx (%llx)\n",
|
||||
img_request->write_request ? "write" : "read",
|
||||
obj_request->length, obj_request->img_offset,
|
||||
obj_request->offset);
|
||||
rbd_warn(rbd_dev, " result %d xferred %x\n",
|
||||
result, xferred);
|
||||
if (!img_request->result)
|
||||
img_request->result = result;
|
||||
@ -1604,7 +1610,7 @@ static int rbd_img_request_fill_bio(struct rbd_img_request *img_request,
|
||||
struct rbd_obj_request *next_obj_request;
|
||||
bool write_request = img_request->write_request;
|
||||
unsigned int bio_offset;
|
||||
u64 image_offset;
|
||||
u64 img_offset;
|
||||
u64 resid;
|
||||
u16 opcode;
|
||||
|
||||
@ -1612,8 +1618,8 @@ static int rbd_img_request_fill_bio(struct rbd_img_request *img_request,
|
||||
|
||||
opcode = write_request ? CEPH_OSD_OP_WRITE : CEPH_OSD_OP_READ;
|
||||
bio_offset = 0;
|
||||
image_offset = img_request->offset;
|
||||
rbd_assert(image_offset == bio_list->bi_sector << SECTOR_SHIFT);
|
||||
img_offset = img_request->offset;
|
||||
rbd_assert(img_offset == bio_list->bi_sector << SECTOR_SHIFT);
|
||||
resid = img_request->length;
|
||||
rbd_assert(resid > 0);
|
||||
while (resid) {
|
||||
@ -1623,11 +1629,11 @@ static int rbd_img_request_fill_bio(struct rbd_img_request *img_request,
|
||||
u64 offset;
|
||||
u64 length;
|
||||
|
||||
object_name = rbd_segment_name(rbd_dev, image_offset);
|
||||
object_name = rbd_segment_name(rbd_dev, img_offset);
|
||||
if (!object_name)
|
||||
goto out_unwind;
|
||||
offset = rbd_segment_offset(rbd_dev, image_offset);
|
||||
length = rbd_segment_length(rbd_dev, image_offset, resid);
|
||||
offset = rbd_segment_offset(rbd_dev, img_offset);
|
||||
length = rbd_segment_length(rbd_dev, img_offset, resid);
|
||||
obj_request = rbd_obj_request_create(object_name,
|
||||
offset, length,
|
||||
OBJ_REQUEST_BIO);
|
||||
@ -1656,9 +1662,10 @@ static int rbd_img_request_fill_bio(struct rbd_img_request *img_request,
|
||||
obj_request->bio_list, obj_request->length);
|
||||
rbd_osd_req_format(obj_request, write_request);
|
||||
|
||||
obj_request->img_offset = img_offset;
|
||||
rbd_img_obj_request_add(img_request, obj_request);
|
||||
|
||||
image_offset += length;
|
||||
img_offset += length;
|
||||
resid -= length;
|
||||
}
|
||||
|
||||
@ -1993,8 +2000,10 @@ static void rbd_request_fn(struct request_queue *q)
|
||||
end_request:
|
||||
spin_lock_irq(q->queue_lock);
|
||||
if (result < 0) {
|
||||
rbd_warn(rbd_dev, "obj_request %s result %d\n",
|
||||
write_request ? "write" : "read", result);
|
||||
rbd_warn(rbd_dev, "%s %llx at %llx result %d\n",
|
||||
write_request ? "write" : "read",
|
||||
length, offset, result);
|
||||
|
||||
__blk_end_request_all(rq, result);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user