diff options
Diffstat (limited to 'drivers/block/rbd.c')
-rw-r--r-- | drivers/block/rbd.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index d93a0372b37b..f5e49b639818 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c | |||
@@ -1863,9 +1863,11 @@ static void rbd_osd_req_callback(struct ceph_osd_request *osd_req, | |||
1863 | rbd_osd_read_callback(obj_request); | 1863 | rbd_osd_read_callback(obj_request); |
1864 | break; | 1864 | break; |
1865 | case CEPH_OSD_OP_SETALLOCHINT: | 1865 | case CEPH_OSD_OP_SETALLOCHINT: |
1866 | rbd_assert(osd_req->r_ops[1].op == CEPH_OSD_OP_WRITE); | 1866 | rbd_assert(osd_req->r_ops[1].op == CEPH_OSD_OP_WRITE || |
1867 | osd_req->r_ops[1].op == CEPH_OSD_OP_WRITEFULL); | ||
1867 | /* fall through */ | 1868 | /* fall through */ |
1868 | case CEPH_OSD_OP_WRITE: | 1869 | case CEPH_OSD_OP_WRITE: |
1870 | case CEPH_OSD_OP_WRITEFULL: | ||
1869 | rbd_osd_write_callback(obj_request); | 1871 | rbd_osd_write_callback(obj_request); |
1870 | break; | 1872 | break; |
1871 | case CEPH_OSD_OP_STAT: | 1873 | case CEPH_OSD_OP_STAT: |
@@ -2401,7 +2403,10 @@ static void rbd_img_obj_request_fill(struct rbd_obj_request *obj_request, | |||
2401 | opcode = CEPH_OSD_OP_ZERO; | 2403 | opcode = CEPH_OSD_OP_ZERO; |
2402 | } | 2404 | } |
2403 | } else if (op_type == OBJ_OP_WRITE) { | 2405 | } else if (op_type == OBJ_OP_WRITE) { |
2404 | opcode = CEPH_OSD_OP_WRITE; | 2406 | if (!offset && length == object_size) |
2407 | opcode = CEPH_OSD_OP_WRITEFULL; | ||
2408 | else | ||
2409 | opcode = CEPH_OSD_OP_WRITE; | ||
2405 | osd_req_op_alloc_hint_init(osd_request, num_ops, | 2410 | osd_req_op_alloc_hint_init(osd_request, num_ops, |
2406 | object_size, object_size); | 2411 | object_size, object_size); |
2407 | num_ops++; | 2412 | num_ops++; |
@@ -3760,6 +3765,7 @@ static int rbd_init_disk(struct rbd_device *rbd_dev) | |||
3760 | /* set io sizes to object size */ | 3765 | /* set io sizes to object size */ |
3761 | segment_size = rbd_obj_bytes(&rbd_dev->header); | 3766 | segment_size = rbd_obj_bytes(&rbd_dev->header); |
3762 | blk_queue_max_hw_sectors(q, segment_size / SECTOR_SIZE); | 3767 | blk_queue_max_hw_sectors(q, segment_size / SECTOR_SIZE); |
3768 | q->limits.max_sectors = queue_max_hw_sectors(q); | ||
3763 | blk_queue_max_segments(q, segment_size / SECTOR_SIZE); | 3769 | blk_queue_max_segments(q, segment_size / SECTOR_SIZE); |
3764 | blk_queue_max_segment_size(q, segment_size); | 3770 | blk_queue_max_segment_size(q, segment_size); |
3765 | blk_queue_io_min(q, segment_size); | 3771 | blk_queue_io_min(q, segment_size); |