]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-client.git/commitdiff
libceph: pass length to ceph_calc_file_object_mapping()
authorAlex Elder <elder@inktank.com>
Wed, 14 Nov 2012 15:38:19 +0000 (09:38 -0600)
committerAlex Elder <elder@inktank.com>
Mon, 19 Nov 2012 23:37:50 +0000 (17:37 -0600)
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>
fs/ceph/ioctl.c
include/linux/ceph/osdmap.h
net/ceph/osd_client.c
net/ceph/osdmap.c

index 36549a46e311cc7f7b717634e5723dbeddb58f5f..3b22150d3e1949dd97d5d3ea1eacfa50e11b9eec 100644 (file)
@@ -194,7 +194,7 @@ static long ceph_ioctl_get_dataloc(struct file *file, void __user *arg)
                return -EFAULT;
 
        down_read(&osdc->map_sem);
-       r = ceph_calc_file_object_mapping(&ci->i_layout, dl.file_offset, &len,
+       r = ceph_calc_file_object_mapping(&ci->i_layout, dl.file_offset, len,
                                          &dl.object_no, &dl.object_offset,
                                          &olen);
        if (r < 0)
index c841396b03a141e318a41987ab5053004ac1d1e8..9ea98d29f3d40ff277e8b28f1be83d6b4ae9e871 100644 (file)
@@ -110,7 +110,7 @@ extern void ceph_osdmap_destroy(struct ceph_osdmap *map);
 
 /* calculate mapping of a file extent to an object */
 extern int ceph_calc_file_object_mapping(struct ceph_file_layout *layout,
-                                        u64 off, u64 *plen,
+                                        u64 off, u64 len,
                                         u64 *bno, u64 *oxoff, u64 *oxlen);
 
 /* calculate mapping of object to a placement group */
index d550d9ea326bdc0c03c2cc92deb99df629c34e16..60c4e15b32564ffa5389bb9804dd9170365d28e9 100644 (file)
@@ -53,13 +53,15 @@ int ceph_calc_raw_layout(struct ceph_osd_client *osdc,
        reqhead->snapid = cpu_to_le64(snapid);
 
        /* object extent? */
-       r = ceph_calc_file_object_mapping(layout, off, plen, bno,
+       r = ceph_calc_file_object_mapping(layout, off, orig_len, bno,
                                          &objoff, &objlen);
        if (r < 0)
                return r;
-       if (*plen < orig_len)
+       if (objlen < orig_len) {
+               *plen = objlen;
                dout(" skipping last %llu, final file extent %llu~%llu\n",
                     orig_len - *plen, off, *plen);
+       }
 
        if (op_has_extent(op->op)) {
                op->extent.offset = objoff;
index 27e904effc5e6949707b83bf59dac5ba7fb8d9ea..d7baf5d4e9a12ed14bfe7529d6527abb00eaafec 100644 (file)
@@ -1012,7 +1012,7 @@ bad:
  * pass a stride back to the caller.
  */
 int ceph_calc_file_object_mapping(struct ceph_file_layout *layout,
-                                  u64 off, u64 *plen,
+                                  u64 off, u64 len,
                                   u64 *ono,
                                   u64 *oxoff, u64 *oxlen)
 {
@@ -1023,7 +1023,7 @@ int ceph_calc_file_object_mapping(struct ceph_file_layout *layout,
        u32 su_per_object;
        u64 t, su_offset;
 
-       dout("mapping %llu~%llu  osize %u fl_su %u\n", off, *plen,
+       dout("mapping %llu~%llu  osize %u fl_su %u\n", off, len,
             osize, su);
        if (su == 0 || sc == 0)
                goto invalid;
@@ -1056,11 +1056,10 @@ int ceph_calc_file_object_mapping(struct ceph_file_layout *layout,
 
        /*
         * Calculate the length of the extent being written to the selected
-        * object. This is the minimum of the full length requested (plen) or
+        * object. This is the minimum of the full length requested (len) or
         * the remainder of the current stripe being written to.
         */
-       *oxlen = min_t(u64, *plen, su - su_offset);
-       *plen = *oxlen;
+       *oxlen = min_t(u64, len, su - su_offset);
 
        dout(" obj extent %llu~%llu\n", *oxoff, *oxlen);
        return 0;