Skip to contentSkip to conversation

libceph: tighten up some interfaces

PATCH New Alex Elder 1 participant 5 messages Nov 14, 2012

Subsystems (4)
lore
Share & tools
lore

Alex Elder

author
#0 lore raw

cover libceph: tighten up some interfaces

While investigating exactly how and why rbd uses ceph_calc_raw_layout() I implemented some small changes to some functions to make it obvious to the caller that certain functions won't cause side-effects, or that certain functions do or don't need certain parameters.

-Alex

[PATCH 1/4] libceph: pass length to ceph_osdc_build_request() [PATCH 2/4] libceph: pass length to ceph_calc_file_object_mapping() [PATCH 3/4] libceph: drop snapid in ceph_calc_raw_layout() [PATCH 4/4] libceph: drop osdc from ceph_calc_raw_layout()

author
#1 lore raw

PATCH 1/4 libceph: pass length to ceph_osdc_build_request()

The len argument to ceph_osdc_build_request() is set up to be passed by address, but that function never updates its value so there's no need to do this. Tighten up the interface by passing the length directly.

---
 drivers/block/rbd.c             |    2 +-
 include/linux/ceph/osd_client.h |    2 +-
 net/ceph/osd_client.c           |    6 +++---
 3 files changed, 5 insertions(+), 5 deletions(-)
drivers/block/rbd.c +1 -1
index 9dc1d5f..08d1b6e 100644
@@ -1174,7 +1174,7 @@ static int rbd_do_request(struct request *rq,
 				snapid, ofs, &len, &bno, osd_req, ops);
 	rbd_assert(ret == 0);
 
-	ceph_osdc_build_request(osd_req, ofs, &len, ops, snapc, &mtime);
+	ceph_osdc_build_request(osd_req, ofs, len, ops, snapc, &mtime);
 
 	if (linger_req) {
 		ceph_osdc_set_request_linger(osdc, osd_req);
(quoted diff) +0 -0

b/include/linux/ceph/osd_client.h
index 61562c7..4bfb458 100644

include/linux/ceph/osd_client.h +0 -0
@@ -224,7 +224,7 @@ extern struct ceph_osd_request

*ceph_osdc_alloc_request(struct ceph_osd_client *
struct bio *bio);

extern void ceph_osdc_build_request(struct ceph_osd_request *req,
- u64 off, u64 *plen,
+ u64 off, u64 len,
struct ceph_osd_req_op *src_ops, struct ceph_snap_context *snapc, struct timespec *mtime);

net/ceph/osd_client.c +0 -0
index 20b7921..d550d9e 100644
@@ -328,7 +328,7 @@ static void osd_req_encode_op(struct

ceph_osd_request *req,
*
*/
void ceph_osdc_build_request(struct ceph_osd_request *req,
- u64 off, u64 *plen,
+ u64 off, u64 len,
struct ceph_osd_req_op *src_ops, struct ceph_snap_context *snapc, struct timespec *mtime)
@@ -382,7 +382,7 @@ void ceph_osdc_build_request(struct ceph_osd_request *req,

if (flags & CEPH_OSD_FLAG_WRITE) {
req->r_request->hdr.data_off = cpu_to_le16(off);
- req->r_request->hdr.data_len = cpu_to_le32(*plen + data_len);
+ req->r_request->hdr.data_len = cpu_to_le32(len + data_len);
} else if (data_len) {
req->r_request->hdr.data_off = 0; req->r_request->hdr.data_len = cpu_to_le32(data_len);
@@ -456,7 +456,7 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc,
req->r_num_pages = calc_pages_for(page_align, *plen); req->r_page_alignment = page_align;

- ceph_osdc_build_request(req, off, plen, ops,
+ ceph_osdc_build_request(req, off, *plen, ops,
snapc,
mtime);

Signature · 1 line
1.7.9.5
author
#2 lore raw

PATCH 2/4 libceph: pass length to ceph_calc_file_object_mapping()

In reply to Alex Elder

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.

---
 fs/ceph/ioctl.c             |    2 +-
 include/linux/ceph/osdmap.h |    2 +-
 net/ceph/osd_client.c       |    6 ++++--
 net/ceph/osdmap.c           |    9 ++++-----
 4 files changed, 10 insertions(+), 9 deletions(-)
fs/ceph/ioctl.c +0 -0
index 36549a4..3b22150 100644
@@ -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)

include/linux/ceph/osdmap.h +0 -0
index c841396..9ea98d2 100644
@@ -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 */

net/ceph/osd_client.c +4 -2
index d550d9e..60c4e15 100644
@@ -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;
net/ceph/osdmap.c +1 -1
index 27e904e..d7baf5d 100644
@@ -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;

Signature · 1 line
1.7.9.5
author
#3 lore raw

PATCH 3/4 libceph: drop snapid in ceph_calc_raw_layout()

In reply to Alex Elder

A snapshot id must be provided to ceph_calc_raw_layout() even though it is not needed at all for calculating the layout.

Where the snapshot id *is* needed is when building the request message for an osd operation.

Drop the snapid parameter from ceph_calc_raw_layout() and pass that value instead in ceph_osdc_build_request().

---
 drivers/block/rbd.c             |    4 ++--
 include/linux/ceph/osd_client.h |    2 +-
 net/ceph/osd_client.c           |   14 ++++----------
 3 files changed, 7 insertions(+), 13 deletions(-)
drivers/block/rbd.c +2 -2
index 08d1b6e..4e44085 100644
@@ -1171,10 +1171,10 @@ static int rbd_do_request(struct request *rq,
 
 	rbd_layout_init(&osd_req->r_file_layout, rbd_dev->spec->pool_id);
 	ret = ceph_calc_raw_layout(osdc, &osd_req->r_file_layout,
-				snapid, ofs, &len, &bno, osd_req, ops);
+				ofs, &len, &bno, osd_req, ops);
 	rbd_assert(ret == 0);
 
-	ceph_osdc_build_request(osd_req, ofs, len, ops, snapc, &mtime);
+	ceph_osdc_build_request(osd_req, ofs, len, ops, snapc, snapid, &mtime);
 
 	if (linger_req) {
 		ceph_osdc_set_request_linger(osdc, osd_req);
(quoted diff) +0 -0

b/include/linux/ceph/osd_client.h
index 4bfb458..0e82a0a 100644

include/linux/ceph/osd_client.h +0 -0
@@ -209,7 +209,6 @@ extern void ceph_osdc_handle_map(struct

ceph_osd_client *osdc,

extern int ceph_calc_raw_layout(struct ceph_osd_client *osdc,
struct ceph_file_layout *layout,
- u64 snapid,
u64 off, u64 *plen, u64 *bno, struct ceph_osd_request *req, struct ceph_osd_req_op *op);
@@ -227,6 +226,7 @@ extern void ceph_osdc_build_request(struct ceph_osd_request *req,
u64 off, u64 len, struct ceph_osd_req_op *src_ops, struct ceph_snap_context *snapc,
+ u64 snap_id,
struct timespec *mtime);

extern struct ceph_osd_request *ceph_osdc_new_request(struct
ceph_osd_client *,

net/ceph/osd_client.c +1 -6
index 60c4e15..f844a35 100644
@@ -40,18 +40,14 @@ static int op_has_extent(int op)
 
 int ceph_calc_raw_layout(struct ceph_osd_client *osdc,
 			struct ceph_file_layout *layout,
-			u64 snapid,
 			u64 off, u64 *plen, u64 *bno,
 			struct ceph_osd_request *req,
 			struct ceph_osd_req_op *op)
 {
-	struct ceph_osd_request_head *reqhead = req->r_request->front.iov_base;
 	u64 orig_len = *plen;
 	u64 objoff, objlen;    /* extent in object */
 	int r;
 
-	reqhead->snapid = cpu_to_le64(snapid);
-
 	/* object extent? */
 	r = ceph_calc_file_object_mapping(layout, off, orig_len, bno,
 					  &objoff, &objlen);
@@ -113,8 +109,7 @@ static int calc_layout(struct ceph_osd_client *osdc,
 	u64 bno;
 	int r;
 
-	r = ceph_calc_raw_layout(osdc, layout, vino.snap, off,
-				 plen, &bno, req, op);
+	r = ceph_calc_raw_layout(osdc, layout, off, plen, &bno, req, op);
 	if (r < 0)
 		return r;
 
@@ -332,7 +327,7 @@ static void osd_req_encode_op(struct

ceph_osd_request *req,
void ceph_osdc_build_request(struct ceph_osd_request *req,
u64 off, u64 len,
struct ceph_osd_req_op *src_ops,
- struct ceph_snap_context *snapc,
+ struct ceph_snap_context *snapc, u64 snap_id,
struct timespec *mtime)
{
struct ceph_msg *msg = req->r_request;
@@ -347,6 +342,7 @@ void ceph_osdc_build_request(struct ceph_osd_request *req,
int i;

head = msg->front.iov_base;
+ head->snapid = cpu_to_le64(snap_id);
op = (void *)(head + 1);
p = (void *)(op + num_op);

@@ -458,9 +454,7 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc,
req->r_num_pages = calc_pages_for(page_align, *plen); req->r_page_alignment = page_align;

- ceph_osdc_build_request(req, off, *plen, ops,
- snapc,
- mtime);
+ ceph_osdc_build_request(req, off, *plen, ops, snapc, vino.snap, mtime);

return req;
}

Signature · 1 line
1.7.9.5
author
#4 lore raw

PATCH 4/4 libceph: drop osdc from ceph_calc_raw_layout()

In reply to Alex Elder

The osdc parameter to ceph_calc_raw_layout() is not used, so get rid of it. Consequently, the corresponding parameter in calc_layout() becomes unused, so get rid of that as well.

---
 drivers/block/rbd.c             |    2 +-
 include/linux/ceph/osd_client.h |    3 +--
 net/ceph/osd_client.c           |   10 ++++------
 3 files changed, 6 insertions(+), 9 deletions(-)
drivers/block/rbd.c +1 -1
index 4e44085..2d10504 100644
@@ -1170,7 +1170,7 @@ static int rbd_do_request(struct request *rq,
 	osd_req->r_oid_len = strlen(osd_req->r_oid);
 
 	rbd_layout_init(&osd_req->r_file_layout, rbd_dev->spec->pool_id);
-	ret = ceph_calc_raw_layout(osdc, &osd_req->r_file_layout,
+	ret = ceph_calc_raw_layout(&osd_req->r_file_layout,
 				ofs, &len, &bno, osd_req, ops);
 	rbd_assert(ret == 0);
 
(quoted diff) +0 -0

b/include/linux/ceph/osd_client.h
index 0e82a0a..fe3a6e8 100644

include/linux/ceph/osd_client.h +0 -0
@@ -207,8 +207,7 @@ extern void ceph_osdc_handle_reply(struct

ceph_osd_client *osdc,
extern void ceph_osdc_handle_map(struct ceph_osd_client *osdc,
struct ceph_msg *msg);

-extern int ceph_calc_raw_layout(struct ceph_osd_client *osdc,
- struct ceph_file_layout *layout,
+extern int ceph_calc_raw_layout(struct ceph_file_layout *layout,
u64 off, u64 *plen, u64 *bno, struct ceph_osd_request *req, struct ceph_osd_req_op *op);

net/ceph/osd_client.c +3 -5
index f844a35..baaec06 100644
@@ -38,8 +38,7 @@ static int op_has_extent(int op)
 		op == CEPH_OSD_OP_WRITE);
 }
 
-int ceph_calc_raw_layout(struct ceph_osd_client *osdc,
-			struct ceph_file_layout *layout,
+int ceph_calc_raw_layout(struct ceph_file_layout *layout,
 			u64 off, u64 *plen, u64 *bno,
 			struct ceph_osd_request *req,
 			struct ceph_osd_req_op *op)
@@ -99,8 +98,7 @@ EXPORT_SYMBOL(ceph_calc_raw_layout);
  *
  * fill osd op in request message.
  */
-static int calc_layout(struct ceph_osd_client *osdc,
-		       struct ceph_vino vino,
+static int calc_layout(struct ceph_vino vino,
 		       struct ceph_file_layout *layout,
 		       u64 off, u64 *plen,
 		       struct ceph_osd_request *req,
@@ -109,7 +107,7 @@ static int calc_layout(struct ceph_osd_client *osdc,
 	u64 bno;
 	int r;
 
-	r = ceph_calc_raw_layout(osdc, layout, off, plen, &bno, req, op);
+	r = ceph_calc_raw_layout(layout, off, plen, &bno, req, op);
 	if (r < 0)
 		return r;
 
@@ -444,7 +442,7 @@ struct ceph_osd_request

*ceph_osdc_new_request(struct ceph_osd_client *osdc,
return ERR_PTR(-ENOMEM);

/* calculate max write size */
- r = calc_layout(osdc, vino, layout, off, plen, req, ops);
+ r = calc_layout(vino, layout, off, plen, req, ops);
if (r < 0)
return ERR_PTR(r);
req->r_file_layout = *layout; /* keep a copy */

Signature · 1 line
1.7.9.5