浏览代码

ceph: fix object striping calculation for non-default striping schemes

We were incorrectly calculationing of object offset.  If we have multiple
stripe units per object, we need to shift to the start of the current
su in addition to the offset within the su.

Also rename bno to ono (object number) to avoid some variable naming
confusion.

Signed-off-by: Sage Weil <sage@newdream.net>
Sage Weil 15 年之前
父节点
当前提交
645a102581
共有 1 个文件被更改,包括 7 次插入4 次删除
  1. 7 4
      fs/ceph/osdmap.c

+ 7 - 4
fs/ceph/osdmap.c

@@ -723,7 +723,7 @@ bad:
  */
 void ceph_calc_file_object_mapping(struct ceph_file_layout *layout,
 				   u64 off, u64 *plen,
-				   u64 *bno,
+				   u64 *ono,
 				   u64 *oxoff, u64 *oxlen)
 {
 	u32 osize = le32_to_cpu(layout->fl_object_size);
@@ -750,11 +750,14 @@ void ceph_calc_file_object_mapping(struct ceph_file_layout *layout,
 	stripepos = bl % sc;
 	objsetno = stripeno / su_per_object;
 
-	*bno = objsetno * sc + stripepos;
-	dout("objset %u * sc %u = bno %u\n", objsetno, sc, (unsigned)*bno);
-	/* *oxoff = *off % layout->fl_stripe_unit; */
+	*ono = objsetno * sc + stripepos;
+	dout("objset %u * sc %u = ono %u\n", objsetno, sc, (unsigned)*ono);
+
+	/* *oxoff = *off % layout->fl_stripe_unit;  # offset in su */
 	t = off;
 	*oxoff = do_div(t, su);
+	*oxoff += (stripeno % su_per_object) * su;
+
 	*oxlen = min_t(u64, *plen, su - *oxoff);
 	*plen = *oxlen;