diff options
author | Alex Elder <elder@inktank.com> | 2012-11-14 13:25:18 -0500 |
---|---|---|
committer | Alex Elder <elder@inktank.com> | 2013-01-17 17:34:58 -0500 |
commit | 0829661863fb5c8031c1c5c119693ea157517783 (patch) | |
tree | 716416a4d4798a26e174a50563987796c82e12f1 /drivers/block/rbd.c | |
parent | 2b5fc648af5eec2f4fe984cb6b926214e02c5cf4 (diff) |
rbd: pull in ceph_calc_raw_layout()
This is the first in a series of patches aimed at eliminating
the use of ceph_calc_raw_layout() by rbd.
It simply pulls in a copy of that function and renames it
rbd_calc_raw_layout().
Signed-off-by: Alex Elder <elder@inktank.com>
Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
Diffstat (limited to 'drivers/block/rbd.c')
-rw-r--r-- | drivers/block/rbd.c | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 7ce178fd6fe5..eee0d3649dcf 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c | |||
@@ -1101,6 +1101,40 @@ static void rbd_layout_init(struct ceph_file_layout *layout, u64 pool_id) | |||
1101 | layout->fl_pg_pool = cpu_to_le32((u32) pool_id); | 1101 | layout->fl_pg_pool = cpu_to_le32((u32) pool_id); |
1102 | } | 1102 | } |
1103 | 1103 | ||
1104 | int rbd_calc_raw_layout(struct ceph_file_layout *layout, | ||
1105 | u64 off, u64 *plen, u64 *bno, | ||
1106 | struct ceph_osd_request *req, | ||
1107 | struct ceph_osd_req_op *op) | ||
1108 | { | ||
1109 | u64 orig_len = *plen; | ||
1110 | u64 objoff, objlen; /* extent in object */ | ||
1111 | int r; | ||
1112 | |||
1113 | /* object extent? */ | ||
1114 | r = ceph_calc_file_object_mapping(layout, off, orig_len, bno, | ||
1115 | &objoff, &objlen); | ||
1116 | if (r < 0) | ||
1117 | return r; | ||
1118 | if (objlen < orig_len) { | ||
1119 | *plen = objlen; | ||
1120 | dout(" skipping last %llu, final file extent %llu~%llu\n", | ||
1121 | orig_len - *plen, off, *plen); | ||
1122 | } | ||
1123 | |||
1124 | if (op->op == CEPH_OSD_OP_READ || op->op == CEPH_OSD_OP_WRITE) { | ||
1125 | op->extent.offset = objoff; | ||
1126 | op->extent.length = objlen; | ||
1127 | } | ||
1128 | req->r_num_pages = calc_pages_for(off, *plen); | ||
1129 | req->r_page_alignment = off & ~PAGE_MASK; | ||
1130 | if (op->op == CEPH_OSD_OP_WRITE) | ||
1131 | op->payload_len = *plen; | ||
1132 | |||
1133 | dout("calc_layout bno=%llx %llu~%llu (%d pages)\n", | ||
1134 | *bno, objoff, objlen, req->r_num_pages); | ||
1135 | return 0; | ||
1136 | } | ||
1137 | |||
1104 | /* | 1138 | /* |
1105 | * Send ceph osd request | 1139 | * Send ceph osd request |
1106 | */ | 1140 | */ |
@@ -1167,7 +1201,7 @@ static int rbd_do_request(struct request *rq, | |||
1167 | osd_req->r_oid_len = strlen(osd_req->r_oid); | 1201 | osd_req->r_oid_len = strlen(osd_req->r_oid); |
1168 | 1202 | ||
1169 | rbd_layout_init(&osd_req->r_file_layout, rbd_dev->spec->pool_id); | 1203 | rbd_layout_init(&osd_req->r_file_layout, rbd_dev->spec->pool_id); |
1170 | ret = ceph_calc_raw_layout(&osd_req->r_file_layout, | 1204 | ret = rbd_calc_raw_layout(&osd_req->r_file_layout, |
1171 | ofs, &len, &bno, osd_req, op); | 1205 | ofs, &len, &bno, osd_req, op); |
1172 | rbd_assert(ret == 0); | 1206 | rbd_assert(ret == 0); |
1173 | 1207 | ||