summaryrefslogtreecommitdiff
path: root/fs/ceph/osdmap.c
diff options
context:
space:
mode:
authorSage Weil <sage@newdream.net>2009-10-28 22:15:05 (GMT)
committerSage Weil <sage@newdream.net>2009-10-29 00:45:41 (GMT)
commit645a102581b3639836b17d147c35d574fd6e8267 (patch)
treef7117157b3f4eb4803189eccd7a5d6464d4fb255 /fs/ceph/osdmap.c
parent5600f5ebd318f7af6f4b19a29f08d18bb85264e5 (diff)
downloadlinux-fsl-qoriq-645a102581b3639836b17d147c35d574fd6e8267.tar.xz
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>
Diffstat (limited to 'fs/ceph/osdmap.c')
-rw-r--r--fs/ceph/osdmap.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/fs/ceph/osdmap.c b/fs/ceph/osdmap.c
index a9a4143..5a5520c 100644
--- a/fs/ceph/osdmap.c
+++ b/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;