]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd: Correct readahead divide by zero exception 2770/head
authorJason Dillaman <dillaman@redhat.com>
Tue, 21 Oct 2014 07:42:13 +0000 (03:42 -0400)
committerJason Dillaman <dillaman@redhat.com>
Tue, 21 Oct 2014 08:35:00 +0000 (04:35 -0400)
When readahead is used on old-format RBD images, a divide
by zero signal will be thrown.  This was caused by initializing
the readahead alignments prior to initializing the stripe layout
of old-format RBD images.

Fixes: 9857
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/ImageCtx.cc

index ee757d9464ab25089ebab851ef630c8403169a8d..c9b74f232a8e16a5403ca513dcdfed6613832b4f 100644 (file)
@@ -162,17 +162,11 @@ namespace librbd {
     }
 
     md_config_t *conf = cct->_conf;
-    vector<uint64_t> alignments;
-    alignments.push_back(stripe_count << order); // object set (in file striping terminology)
-    alignments.push_back(stripe_unit * stripe_count); // stripe
-    alignments.push_back(stripe_unit); // stripe unit
     readahead.set_trigger_requests(conf->rbd_readahead_trigger_requests);
     readahead.set_max_readahead_size(conf->rbd_readahead_max_bytes);
-    readahead.set_alignments(alignments);
-
     return 0;
   }
-  
+
   void ImageCtx::init_layout()
   {
     if (stripe_unit == 0 || stripe_count == 0) {
@@ -180,6 +174,12 @@ namespace librbd {
       stripe_count = 1;
     }
 
+    vector<uint64_t> alignments;
+    alignments.push_back(stripe_count << order); // object set (in file striping terminology)
+    alignments.push_back(stripe_unit * stripe_count); // stripe
+    alignments.push_back(stripe_unit); // stripe unit
+    readahead.set_alignments(alignments);
+
     memset(&layout, 0, sizeof(layout));
     layout.fl_stripe_unit = stripe_unit;
     layout.fl_stripe_count = stripe_count;