summaryrefslogtreecommitdiffstats
path: root/drivers/block/rbd.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/block/rbd.c')
-rw-r--r--drivers/block/rbd.c10
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);