|
@@ -629,6 +629,14 @@ static int rbd_get_num_segments(struct rbd_image_header *header,
|
|
|
return end_seg - start_seg + 1;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * returns the size of an object in the image
|
|
|
+ */
|
|
|
+static u64 rbd_obj_bytes(struct rbd_image_header *header)
|
|
|
+{
|
|
|
+ return 1 << header->obj_order;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* bio helpers
|
|
|
*/
|
|
@@ -1765,6 +1773,13 @@ static int rbd_init_disk(struct rbd_device *rbd_dev)
|
|
|
q = blk_init_queue(rbd_rq_fn, &rbd_dev->lock);
|
|
|
if (!q)
|
|
|
goto out_disk;
|
|
|
+
|
|
|
+ /* set io sizes to object size */
|
|
|
+ blk_queue_max_hw_sectors(q, rbd_obj_bytes(&rbd_dev->header) / 512ULL);
|
|
|
+ blk_queue_max_segment_size(q, rbd_obj_bytes(&rbd_dev->header));
|
|
|
+ blk_queue_io_min(q, rbd_obj_bytes(&rbd_dev->header));
|
|
|
+ blk_queue_io_opt(q, rbd_obj_bytes(&rbd_dev->header));
|
|
|
+
|
|
|
blk_queue_merge_bvec(q, rbd_merge_bvec);
|
|
|
disk->queue = q;
|
|
|
|