aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorAlex Elder <elder@inktank.com>2012-11-14 10:38:19 -0500
committerAlex Elder <elder@inktank.com>2013-01-17 16:52:04 -0500
commite8afad656cbcd06d02a7bacd4b318fa0e2907de0 (patch)
tree800e3e84158606a74c2b0c2ecf1e48581aca16ed /net
parent0120be3c60d46d6d55f4bf7a3d654cc705eb0c54 (diff)
libceph: pass length to ceph_calc_file_object_mapping()
ceph_calc_file_object_mapping() takes (among other things) a "file" offset and length, and based on the layout, determines the object number ("bno") backing the affected portion of the file's data and the offset into that object where the desired range begins. It also computes the size that should be used for the request--either the amount requested or something less if that would exceed the end of the object. This patch changes the input length parameter in this function so it is used only for input. That is, the argument will be passed by value rather than by address, so the value provided won't get updated by the function. The value would only get updated if the length would surpass the current object, and in that case the value it got updated to would be exactly that returned in *oxlen. Only one of the two callers is affected by this change. Update ceph_calc_raw_layout() so it records any updated value. Signed-off-by: Alex Elder <elder@inktank.com> Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
Diffstat (limited to 'net')
-rw-r--r--net/ceph/osd_client.c6
-rw-r--r--net/ceph/osdmap.c9
2 files changed, 8 insertions, 7 deletions
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c
index e29a3ed92958..47e5f5b1f94c 100644
--- a/net/ceph/osd_client.c
+++ b/net/ceph/osd_client.c
@@ -53,13 +53,15 @@ int ceph_calc_raw_layout(struct ceph_osd_client *osdc,
53 reqhead->snapid = cpu_to_le64(snapid); 53 reqhead->snapid = cpu_to_le64(snapid);
54 54
55 /* object extent? */ 55 /* object extent? */
56 r = ceph_calc_file_object_mapping(layout, off, plen, bno, 56 r = ceph_calc_file_object_mapping(layout, off, orig_len, bno,
57 &objoff, &objlen); 57 &objoff, &objlen);
58 if (r < 0) 58 if (r < 0)
59 return r; 59 return r;
60 if (*plen < orig_len) 60 if (objlen < orig_len) {
61 *plen = objlen;
61 dout(" skipping last %llu, final file extent %llu~%llu\n", 62 dout(" skipping last %llu, final file extent %llu~%llu\n",
62 orig_len - *plen, off, *plen); 63 orig_len - *plen, off, *plen);
64 }
63 65
64 if (op_has_extent(op->op)) { 66 if (op_has_extent(op->op)) {
65 u32 osize = le32_to_cpu(layout->fl_object_size); 67 u32 osize = le32_to_cpu(layout->fl_object_size);
diff --git a/net/ceph/osdmap.c b/net/ceph/osdmap.c
index ca05871635bc..369f03ba9ee5 100644
--- a/net/ceph/osdmap.c
+++ b/net/ceph/osdmap.c
@@ -1016,7 +1016,7 @@ bad:
1016 * pass a stride back to the caller. 1016 * pass a stride back to the caller.
1017 */ 1017 */
1018int ceph_calc_file_object_mapping(struct ceph_file_layout *layout, 1018int ceph_calc_file_object_mapping(struct ceph_file_layout *layout,
1019 u64 off, u64 *plen, 1019 u64 off, u64 len,
1020 u64 *ono, 1020 u64 *ono,
1021 u64 *oxoff, u64 *oxlen) 1021 u64 *oxoff, u64 *oxlen)
1022{ 1022{
@@ -1027,7 +1027,7 @@ int ceph_calc_file_object_mapping(struct ceph_file_layout *layout,
1027 u32 su_per_object; 1027 u32 su_per_object;
1028 u64 t, su_offset; 1028 u64 t, su_offset;
1029 1029
1030 dout("mapping %llu~%llu osize %u fl_su %u\n", off, *plen, 1030 dout("mapping %llu~%llu osize %u fl_su %u\n", off, len,
1031 osize, su); 1031 osize, su);
1032 if (su == 0 || sc == 0) 1032 if (su == 0 || sc == 0)
1033 goto invalid; 1033 goto invalid;
@@ -1060,11 +1060,10 @@ int ceph_calc_file_object_mapping(struct ceph_file_layout *layout,
1060 1060
1061 /* 1061 /*
1062 * Calculate the length of the extent being written to the selected 1062 * Calculate the length of the extent being written to the selected
1063 * object. This is the minimum of the full length requested (plen) or 1063 * object. This is the minimum of the full length requested (len) or
1064 * the remainder of the current stripe being written to. 1064 * the remainder of the current stripe being written to.
1065 */ 1065 */
1066 *oxlen = min_t(u64, *plen, su - su_offset); 1066 *oxlen = min_t(u64, len, su - su_offset);
1067 *plen = *oxlen;
1068 1067
1069 dout(" obj extent %llu~%llu\n", *oxoff, *oxlen); 1068 dout(" obj extent %llu~%llu\n", *oxoff, *oxlen);
1070 return 0; 1069 return 0;