]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
filer: add helper to map from object extent to file extents
authorSage Weil <sage@inktank.com>
Sat, 6 Oct 2012 00:34:19 +0000 (17:34 -0700)
committerSage Weil <sage@inktank.com>
Mon, 15 Oct 2012 22:34:03 +0000 (15:34 -0700)
Given an extent in an object and a layout, map it back to extent(s) in the
original file.

Signed-off-by: Sage Weil <sage@inktank.com>
src/osdc/Filer.cc
src/osdc/Filer.h

index d5a8bdab123c221f90ca7e8f82d8fbbd06099493..089abcf7d0165c9580aaa2e58912cd3299a78059 100644 (file)
@@ -395,3 +395,39 @@ void Filer::file_to_extents(CephContext *cct, const char *object_format,
     extents.push_back(it->second);
   }
 }
+
+void Filer::extent_to_file(CephContext *cct, ceph_file_layout *layout,
+                          uint64_t objectno, uint64_t off, uint64_t len,
+                          vector<pair<uint64_t, uint64_t> >& extents)
+{
+  ldout(cct, 10) << "extent_to_file " << objectno << " " << off << "~" << len << dendl;
+
+  __u32 object_size = layout->fl_object_size;
+  __u32 su = layout->fl_stripe_unit;
+  __u32 stripe_count = layout->fl_stripe_count;
+  assert(object_size >= su);
+  uint64_t stripes_per_object = object_size / su;
+  ldout(cct, 20) << " stripes_per_object " << stripes_per_object << dendl;
+
+  uint64_t off_in_block = off % su;
+
+  extents.reserve(len / su + 1);
+
+  while (len > 0) {
+    uint64_t stripepos = objectno % stripe_count;
+    uint64_t objectsetno = objectno / stripe_count;
+    uint64_t stripeno = off / su + objectsetno * stripes_per_object;
+    uint64_t blockno = stripeno * stripe_count + stripepos;
+    uint64_t extent_off = blockno * su + off_in_block;
+    uint64_t extent_len = MIN(len, su - off_in_block);
+    extents.push_back(make_pair(extent_off, extent_len));
+
+    ldout(cct, 20) << " object " << off << "~" << extent_len
+                  << " -> file " << extent_off << "~" << extent_len
+                  << dendl;
+
+    off_in_block = 0;
+    off += extent_len;
+    len -= extent_len;
+  }
+}
index 0cca029a3fcf2bf4b19c349aea096348afb4ad6a..41733acf414ab8ca72f93dd2ddba2fb0fdc404f6 100644 (file)
@@ -115,7 +115,14 @@ class Filer {
 
     file_to_extents(cct, buf, layout, offset, len, extents);
   }
-  
+
+  /**
+   * reverse map an object extent to file extents
+   */
+  static void extent_to_file(CephContext *cct, ceph_file_layout *layout,
+                            uint64_t objectno, uint64_t off, uint64_t len,
+                            vector<pair<uint64_t, uint64_t> >& extents);
+
 
   /*** async file interface.  scatter/gather as needed. ***/