aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block/rbd.c
diff options
context:
space:
mode:
authorAlex Elder <elder@inktank.com>2012-07-27 00:37:15 -0400
committerAlex Elder <elder@inktank.com>2012-10-01 15:30:48 -0400
commit28cb775de1bd1bcc62c43f767ab81b7b9cfb6678 (patch)
treea9ed5f43be03561446be1c08b8221c183ca6ca4c /drivers/block/rbd.c
parent6a52325f61760c6a7d7f3ea9736029bc9f63e7f3 (diff)
rbd: return earlier in rbd_header_from_disk()
The only caller of rbd_header_from_disk() is rbd_read_header(). It passes as allocated_snaps the number of snapshots it will have received from the server for the snapshot context that rbd_header_from_disk() is to interpret. The first time through it provides 0--mainly to extract the number of snapshots from the snapshot context header--so that it can allocate an appropriately-sized buffer to receive the entire snapshot context from the server in a second request. rbd_header_from_disk() will not fill in the array of snapshot ids unless the number in the snapshot matches the number the caller had allocated. This patch adjusts that logic a little further to be more efficient. rbd_read_header() doesn't even examine the snapshot context unless the snapshot count (stored in header->total_snaps) matches the number of snapshots allocated. So rbd_header_from_disk() doesn't need to allocate or fill in the snapshot context field at all in that case. Signed-off-by: Alex Elder <elder@inktank.com> Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
Diffstat (limited to 'drivers/block/rbd.c')
-rw-r--r--drivers/block/rbd.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index c9de0f8e808e..aff4e8a01ea5 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -540,7 +540,14 @@ static int rbd_header_from_disk(struct rbd_image_header *header,
540 header->comp_type = ondisk->options.comp_type; 540 header->comp_type = ondisk->options.comp_type;
541 header->total_snaps = snap_count; 541 header->total_snaps = snap_count;
542 542
543 /* Set up the snapshot context */ 543 /*
544 * If the number of snapshot ids provided by the caller
545 * doesn't match the number in the entire context there's
546 * no point in going further. Caller will try again after
547 * getting an updated snapshot context from the server.
548 */
549 if (allocated_snaps != snap_count)
550 return 0;
544 551
545 size = sizeof (struct ceph_snap_context); 552 size = sizeof (struct ceph_snap_context);
546 size += snap_count * sizeof (header->snapc->snaps[0]); 553 size += snap_count * sizeof (header->snapc->snaps[0]);
@@ -552,8 +559,10 @@ static int rbd_header_from_disk(struct rbd_image_header *header,
552 header->snapc->seq = le64_to_cpu(ondisk->snap_seq); 559 header->snapc->seq = le64_to_cpu(ondisk->snap_seq);
553 header->snapc->num_snaps = snap_count; 560 header->snapc->num_snaps = snap_count;
554 561
555 if (snap_count && allocated_snaps == snap_count) { 562 /* Fill in the snapshot information */
556 int i; 563
564 if (snap_count) {
565 u32 i;
557 566
558 for (i = 0; i < snap_count; i++) { 567 for (i = 0; i < snap_count; i++) {
559 header->snapc->snaps[i] = 568 header->snapc->snaps[i] =