diff options
Diffstat (limited to 'fs/ceph/osdmap.c')
-rw-r--r-- | fs/ceph/osdmap.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/fs/ceph/osdmap.c b/fs/ceph/osdmap.c index 5a5520c5a2b..d62e111b8a3 100644 --- a/fs/ceph/osdmap.c +++ b/fs/ceph/osdmap.c | |||
@@ -731,7 +731,7 @@ void ceph_calc_file_object_mapping(struct ceph_file_layout *layout, | |||
731 | u32 sc = le32_to_cpu(layout->fl_stripe_count); | 731 | u32 sc = le32_to_cpu(layout->fl_stripe_count); |
732 | u32 bl, stripeno, stripepos, objsetno; | 732 | u32 bl, stripeno, stripepos, objsetno; |
733 | u32 su_per_object; | 733 | u32 su_per_object; |
734 | u64 t; | 734 | u64 t, su_offset; |
735 | 735 | ||
736 | dout("mapping %llu~%llu osize %u fl_su %u\n", off, *plen, | 736 | dout("mapping %llu~%llu osize %u fl_su %u\n", off, *plen, |
737 | osize, su); | 737 | osize, su); |
@@ -755,10 +755,15 @@ void ceph_calc_file_object_mapping(struct ceph_file_layout *layout, | |||
755 | 755 | ||
756 | /* *oxoff = *off % layout->fl_stripe_unit; # offset in su */ | 756 | /* *oxoff = *off % layout->fl_stripe_unit; # offset in su */ |
757 | t = off; | 757 | t = off; |
758 | *oxoff = do_div(t, su); | 758 | su_offset = do_div(t, su); |
759 | *oxoff += (stripeno % su_per_object) * su; | 759 | *oxoff = su_offset + (stripeno % su_per_object) * su; |
760 | 760 | ||
761 | *oxlen = min_t(u64, *plen, su - *oxoff); | 761 | /* |
762 | * Calculate the length of the extent being written to the selected | ||
763 | * object. This is the minimum of the full length requested (plen) or | ||
764 | * the remainder of the current stripe being written to. | ||
765 | */ | ||
766 | *oxlen = min_t(u64, *plen, su - su_offset); | ||
762 | *plen = *oxlen; | 767 | *plen = *oxlen; |
763 | 768 | ||
764 | dout(" obj extent %llu~%llu\n", *oxoff, *oxlen); | 769 | dout(" obj extent %llu~%llu\n", *oxoff, *oxlen); |