summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/block/rbd.c26
1 files changed, 9 insertions, 17 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index a29c6d2a49ad..d0328835bbd9 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -1163,7 +1163,6 @@ done:
static int rbd_do_op(struct request *rq,
struct rbd_device *rbd_dev,
struct ceph_snap_context *snapc,
- u64 snapid,
u64 ofs, u64 len,
struct bio *bio,
struct rbd_req_coll *coll,
@@ -1177,6 +1176,7 @@ static int rbd_do_op(struct request *rq,
u32 payload_len;
int opcode;
int flags;
+ u64 snapid;
seg_name = rbd_segment_name(rbd_dev, ofs);
if (!seg_name)
@@ -1187,10 +1187,13 @@ static int rbd_do_op(struct request *rq,
if (rq_data_dir(rq) == WRITE) {
opcode = CEPH_OSD_OP_WRITE;
flags = CEPH_OSD_FLAG_WRITE|CEPH_OSD_FLAG_ONDISK;
+ snapid = CEPH_NOSNAP;
payload_len = seg_len;
} else {
opcode = CEPH_OSD_OP_READ;
flags = CEPH_OSD_FLAG_READ;
+ snapc = NULL;
+ snapid = rbd_dev->mapping.snap_id;
payload_len = 0;
}
@@ -1518,24 +1521,13 @@ static void rbd_rq_fn(struct request_queue *q)
kref_get(&coll->kref);
bio = bio_chain_clone(&rq_bio, &next_bio, &bp,
op_size, GFP_ATOMIC);
- if (!bio) {
+ if (bio)
+ (void) rbd_do_op(rq, rbd_dev, snapc,
+ ofs, op_size,
+ bio, coll, cur_seg);
+ else
rbd_coll_end_req_index(rq, coll, cur_seg,
-ENOMEM, op_size);
- goto next_seg;
- }
-
- /* init OSD command: write or read */
- if (do_write)
- (void) rbd_do_op(rq, rbd_dev,
- snapc, CEPH_NOSNAP,
- ofs, op_size, bio,
- coll, cur_seg);
- else
- (void) rbd_do_op(rq, rbd_dev,
- NULL, rbd_dev->mapping.snap_id,
- ofs, op_size, bio,
- coll, cur_seg);
-next_seg:
size -= op_size;
ofs += op_size;