Lines Matching defs:obj_req
343 struct list_head object_extents; /* obj_req.ex structs */
643 static void rbd_obj_handle_request(struct rbd_obj_request *obj_req, int result);
1308 * Zero a range in @obj_req data buffer defined by a bio (list) or
1313 static void rbd_obj_zero_range(struct rbd_obj_request *obj_req, u32 off,
1316 dout("%s %p data buf %u~%u\n", __func__, obj_req, off, bytes);
1318 switch (obj_req->img_request->data_type) {
1320 zero_bios(&obj_req->bio_pos, off, bytes);
1324 zero_bvecs(&obj_req->bvec_pos, off, bytes);
1361 struct rbd_obj_request *obj_req = osd_req->r_priv;
1363 dout("%s osd_req %p for obj_req %p objno %llu %llu~%llu\n",
1364 __func__, osd_req, obj_req, obj_req->ex.oe_objno,
1365 obj_req->ex.oe_off, obj_req->ex.oe_len);
1384 static bool rbd_obj_is_entire(struct rbd_obj_request *obj_req)
1386 struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev;
1388 return !obj_req->ex.oe_off &&
1389 obj_req->ex.oe_len == rbd_dev->layout.object_size;
1392 static bool rbd_obj_is_tail(struct rbd_obj_request *obj_req)
1394 struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev;
1396 return obj_req->ex.oe_off + obj_req->ex.oe_len ==
1403 static void rbd_obj_set_copyup_enabled(struct rbd_obj_request *obj_req)
1405 rbd_assert(obj_req->img_request->snapc);
1407 if (obj_req->img_request->op_type == OBJ_OP_DISCARD) {
1408 dout("%s %p objno %llu discard\n", __func__, obj_req,
1409 obj_req->ex.oe_objno);
1413 if (!obj_req->num_img_extents) {
1414 dout("%s %p objno %llu not overlapping\n", __func__, obj_req,
1415 obj_req->ex.oe_objno);
1419 if (rbd_obj_is_entire(obj_req) &&
1420 !obj_req->img_request->snapc->num_snaps) {
1421 dout("%s %p objno %llu entire\n", __func__, obj_req,
1422 obj_req->ex.oe_objno);
1426 obj_req->flags |= RBD_OBJ_FLAG_COPYUP_ENABLED;
1429 static u64 rbd_obj_img_extents_bytes(struct rbd_obj_request *obj_req)
1431 return ceph_file_extents_bytes(obj_req->img_extents,
1432 obj_req->num_img_extents);
1451 struct rbd_obj_request *obj_req = osd_req->r_priv;
1454 dout("%s osd_req %p result %d for obj_req %p\n", __func__, osd_req,
1455 osd_req->r_result, obj_req);
1462 if (osd_req->r_result > 0 && rbd_img_is_write(obj_req->img_request))
1467 rbd_obj_handle_request(obj_req, result);
1490 __rbd_obj_add_osd_request(struct rbd_obj_request *obj_req,
1493 struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev;
1504 list_add_tail(&req->r_private_item, &obj_req->osd_reqs);
1506 req->r_priv = obj_req;
1517 obj_req->ex.oe_objno);
1525 rbd_obj_add_osd_request(struct rbd_obj_request *obj_req, int num_ops)
1527 rbd_assert(obj_req->img_request->snapc);
1528 return __rbd_obj_add_osd_request(obj_req, obj_req->img_request->snapc,
2013 static int rbd_object_map_update_finish(struct rbd_obj_request *obj_req,
2016 struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev;
2041 rbd_assert(objno == obj_req->ex.oe_objno);
2060 struct rbd_obj_request *obj_req = osd_req->r_priv;
2063 dout("%s osd_req %p result %d for obj_req %p\n", __func__, osd_req,
2064 osd_req->r_result, obj_req);
2066 result = rbd_object_map_update_finish(obj_req, osd_req);
2067 rbd_obj_handle_request(obj_req, result);
2120 static int rbd_object_map_update(struct rbd_obj_request *obj_req, u64 snap_id,
2123 struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev;
2131 if (!update_needed(rbd_dev, obj_req->ex.oe_objno, new_state))
2141 list_add_tail(&req->r_private_item, &obj_req->osd_reqs);
2143 req->r_priv = obj_req;
2161 ret = rbd_cls_object_map_update(req, which, obj_req->ex.oe_objno,
2198 static int rbd_obj_calc_img_extents(struct rbd_obj_request *obj_req,
2201 struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev;
2207 ret = ceph_extent_to_file(&rbd_dev->layout, obj_req->ex.oe_objno,
2208 entire ? 0 : obj_req->ex.oe_off,
2210 obj_req->ex.oe_len,
2211 &obj_req->img_extents,
2212 &obj_req->num_img_extents);
2216 prune_extents(obj_req->img_extents, &obj_req->num_img_extents,
2223 struct rbd_obj_request *obj_req = osd_req->r_priv;
2225 switch (obj_req->img_request->data_type) {
2228 &obj_req->bio_pos,
2229 obj_req->ex.oe_len);
2233 rbd_assert(obj_req->bvec_pos.iter.bi_size ==
2234 obj_req->ex.oe_len);
2235 rbd_assert(obj_req->bvec_idx == obj_req->bvec_count);
2237 &obj_req->bvec_pos);
2270 struct rbd_obj_request *obj_req = osd_req->r_priv;
2277 osd_req_op_cls_request_data_bvecs(osd_req, which, obj_req->copyup_bvecs,
2278 obj_req->copyup_bvec_count, bytes);
2282 static int rbd_obj_init_read(struct rbd_obj_request *obj_req)
2284 obj_req->read_state = RBD_OBJ_READ_START;
2291 struct rbd_obj_request *obj_req = osd_req->r_priv;
2292 struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev;
2296 !(obj_req->flags & RBD_OBJ_FLAG_MAY_EXIST)) {
2303 if (rbd_obj_is_entire(obj_req))
2309 obj_req->ex.oe_off, obj_req->ex.oe_len, 0, 0);
2313 static int rbd_obj_init_write(struct rbd_obj_request *obj_req)
2318 ret = rbd_obj_calc_img_extents(obj_req, true);
2322 obj_req->write_state = RBD_OBJ_WRITE_START;
2326 static u16 truncate_or_zero_opcode(struct rbd_obj_request *obj_req)
2328 return rbd_obj_is_tail(obj_req) ? CEPH_OSD_OP_TRUNCATE :
2335 struct rbd_obj_request *obj_req = osd_req->r_priv;
2337 if (rbd_obj_is_entire(obj_req) && !obj_req->num_img_extents) {
2338 rbd_assert(obj_req->flags & RBD_OBJ_FLAG_DELETION);
2342 truncate_or_zero_opcode(obj_req),
2343 obj_req->ex.oe_off, obj_req->ex.oe_len,
2348 static int rbd_obj_init_discard(struct rbd_obj_request *obj_req)
2350 struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev;
2363 !rbd_obj_is_tail(obj_req)) {
2364 off = round_up(obj_req->ex.oe_off, rbd_dev->opts->alloc_size);
2365 next_off = round_down(obj_req->ex.oe_off + obj_req->ex.oe_len,
2371 obj_req, obj_req->ex.oe_off, obj_req->ex.oe_len,
2373 obj_req->ex.oe_off = off;
2374 obj_req->ex.oe_len = next_off - off;
2378 ret = rbd_obj_calc_img_extents(obj_req, true);
2382 obj_req->flags |= RBD_OBJ_FLAG_NOOP_FOR_NONEXISTENT;
2383 if (rbd_obj_is_entire(obj_req) && !obj_req->num_img_extents)
2384 obj_req->flags |= RBD_OBJ_FLAG_DELETION;
2386 obj_req->write_state = RBD_OBJ_WRITE_START;
2393 struct rbd_obj_request *obj_req = osd_req->r_priv;
2396 if (rbd_obj_is_entire(obj_req)) {
2397 if (obj_req->num_img_extents) {
2398 if (!(obj_req->flags & RBD_OBJ_FLAG_COPYUP_ENABLED))
2403 rbd_assert(obj_req->flags & RBD_OBJ_FLAG_DELETION);
2409 opcode = truncate_or_zero_opcode(obj_req);
2414 obj_req->ex.oe_off, obj_req->ex.oe_len,
2418 static int rbd_obj_init_zeroout(struct rbd_obj_request *obj_req)
2423 ret = rbd_obj_calc_img_extents(obj_req, true);
2427 if (!obj_req->num_img_extents) {
2428 obj_req->flags |= RBD_OBJ_FLAG_NOOP_FOR_NONEXISTENT;
2429 if (rbd_obj_is_entire(obj_req))
2430 obj_req->flags |= RBD_OBJ_FLAG_DELETION;
2433 obj_req->write_state = RBD_OBJ_WRITE_START;
2437 static int count_write_ops(struct rbd_obj_request *obj_req)
2439 struct rbd_img_request *img_req = obj_req->img_request;
2444 !(obj_req->flags & RBD_OBJ_FLAG_MAY_EXIST))
2451 if (rbd_obj_is_entire(obj_req) && obj_req->num_img_extents &&
2452 !(obj_req->flags & RBD_OBJ_FLAG_COPYUP_ENABLED))
2464 struct rbd_obj_request *obj_req = osd_req->r_priv;
2466 switch (obj_req->img_request->op_type) {
2488 struct rbd_obj_request *obj_req, *next_obj_req;
2491 for_each_obj_request_safe(img_req, obj_req, next_obj_req) {
2494 ret = rbd_obj_init_read(obj_req);
2497 ret = rbd_obj_init_write(obj_req);
2500 ret = rbd_obj_init_discard(obj_req);
2503 ret = rbd_obj_init_zeroout(obj_req);
2511 rbd_img_obj_request_del(img_req, obj_req);
2537 struct rbd_obj_request *obj_req;
2539 obj_req = rbd_obj_request_create();
2540 if (!obj_req)
2543 rbd_img_obj_request_add(img_req, obj_req);
2544 return &obj_req->ex;
2607 struct rbd_obj_request *obj_req;
2637 for_each_obj_request(img_req, obj_req) {
2638 obj_req->bvec_pos.bvecs = kmalloc_array(obj_req->bvec_count,
2639 sizeof(*obj_req->bvec_pos.bvecs),
2641 if (!obj_req->bvec_pos.bvecs)
2678 struct rbd_obj_request *obj_req =
2683 obj_req->bio_pos = *it;
2689 struct rbd_obj_request *obj_req =
2695 obj_req->bvec_count++;
2702 struct rbd_obj_request *obj_req =
2708 obj_req->bvec_pos.bvecs[obj_req->bvec_idx++] = bv;
2709 obj_req->bvec_pos.iter.bi_size += bv.bv_len;
2741 struct rbd_obj_request *obj_req =
2745 obj_req->bvec_pos = *it;
2746 ceph_bvec_iter_shorten(&obj_req->bvec_pos, bytes);
2752 struct rbd_obj_request *obj_req =
2757 obj_req->bvec_count++;
2763 struct rbd_obj_request *obj_req =
2768 obj_req->bvec_pos.bvecs[obj_req->bvec_idx++] = bv;
2769 obj_req->bvec_pos.iter.bi_size += bv.bv_len;
2820 static bool rbd_obj_may_exist(struct rbd_obj_request *obj_req)
2822 struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev;
2824 if (rbd_object_map_may_exist(rbd_dev, obj_req->ex.oe_objno)) {
2825 obj_req->flags |= RBD_OBJ_FLAG_MAY_EXIST;
2829 dout("%s %p objno %llu assuming dne\n", __func__, obj_req,
2830 obj_req->ex.oe_objno);
2834 static int rbd_obj_read_object(struct rbd_obj_request *obj_req)
2839 osd_req = __rbd_obj_add_osd_request(obj_req, NULL, 1);
2844 obj_req->ex.oe_off, obj_req->ex.oe_len, 0, 0);
2856 static int rbd_obj_read_from_parent(struct rbd_obj_request *obj_req)
2858 struct rbd_img_request *img_req = obj_req->img_request;
2869 child_img_req->obj_request = obj_req;
2875 dout("%s child_img_req %p for obj_req %p\n", __func__, child_img_req,
2876 obj_req);
2882 obj_req->img_extents,
2883 obj_req->num_img_extents,
2884 &obj_req->bio_pos);
2889 obj_req->img_extents,
2890 obj_req->num_img_extents,
2891 &obj_req->bvec_pos);
2898 obj_req->img_extents,
2899 obj_req->num_img_extents,
2900 obj_req->copyup_bvecs);
2912 static bool rbd_obj_advance_read(struct rbd_obj_request *obj_req, int *result)
2914 struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev;
2918 switch (obj_req->read_state) {
2922 if (!rbd_obj_may_exist(obj_req)) {
2924 obj_req->read_state = RBD_OBJ_READ_OBJECT;
2928 ret = rbd_obj_read_object(obj_req);
2933 obj_req->read_state = RBD_OBJ_READ_OBJECT;
2938 ret = rbd_obj_calc_img_extents(obj_req, false);
2943 if (obj_req->num_img_extents) {
2944 ret = rbd_obj_read_from_parent(obj_req);
2949 obj_req->read_state = RBD_OBJ_READ_PARENT;
2960 rbd_obj_zero_range(obj_req, 0, obj_req->ex.oe_len);
2963 if (*result < obj_req->ex.oe_len)
2964 rbd_obj_zero_range(obj_req, *result,
2965 obj_req->ex.oe_len - *result);
2967 rbd_assert(*result == obj_req->ex.oe_len);
2977 u32 obj_overlap = rbd_obj_img_extents_bytes(obj_req);
2979 if (obj_overlap < obj_req->ex.oe_len)
2980 rbd_obj_zero_range(obj_req, obj_overlap,
2981 obj_req->ex.oe_len - obj_overlap);
2989 static bool rbd_obj_write_is_noop(struct rbd_obj_request *obj_req)
2991 struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev;
2993 if (rbd_object_map_may_exist(rbd_dev, obj_req->ex.oe_objno))
2994 obj_req->flags |= RBD_OBJ_FLAG_MAY_EXIST;
2996 if (!(obj_req->flags & RBD_OBJ_FLAG_MAY_EXIST) &&
2997 (obj_req->flags & RBD_OBJ_FLAG_NOOP_FOR_NONEXISTENT)) {
2998 dout("%s %p noop for nonexistent\n", __func__, obj_req);
3011 static int rbd_obj_write_pre_object_map(struct rbd_obj_request *obj_req)
3013 struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev;
3019 if (obj_req->flags & RBD_OBJ_FLAG_DELETION)
3024 return rbd_object_map_update(obj_req, CEPH_NOSNAP, new_state, NULL);
3027 static int rbd_obj_write_object(struct rbd_obj_request *obj_req)
3030 int num_ops = count_write_ops(obj_req);
3034 if (obj_req->flags & RBD_OBJ_FLAG_COPYUP_ENABLED)
3037 osd_req = rbd_obj_add_osd_request(obj_req, num_ops);
3041 if (obj_req->flags & RBD_OBJ_FLAG_COPYUP_ENABLED) {
3078 static int rbd_obj_copyup_empty_snapc(struct rbd_obj_request *obj_req,
3084 dout("%s obj_req %p bytes %u\n", __func__, obj_req, bytes);
3087 osd_req = __rbd_obj_add_osd_request(obj_req, &rbd_empty_snapc, 1);
3105 static int rbd_obj_copyup_current_snapc(struct rbd_obj_request *obj_req,
3109 int num_ops = count_write_ops(obj_req);
3113 dout("%s obj_req %p bytes %u\n", __func__, obj_req, bytes);
3118 osd_req = rbd_obj_add_osd_request(obj_req, num_ops);
3139 static int setup_copyup_bvecs(struct rbd_obj_request *obj_req, u64 obj_overlap)
3143 rbd_assert(!obj_req->copyup_bvecs);
3144 obj_req->copyup_bvec_count = calc_pages_for(0, obj_overlap);
3145 obj_req->copyup_bvecs = kcalloc(obj_req->copyup_bvec_count,
3146 sizeof(*obj_req->copyup_bvecs),
3148 if (!obj_req->copyup_bvecs)
3151 for (i = 0; i < obj_req->copyup_bvec_count; i++) {
3154 obj_req->copyup_bvecs[i].bv_page = alloc_page(GFP_NOIO);
3155 if (!obj_req->copyup_bvecs[i].bv_page)
3158 obj_req->copyup_bvecs[i].bv_offset = 0;
3159 obj_req->copyup_bvecs[i].bv_len = len;
3172 static int rbd_obj_copyup_read_parent(struct rbd_obj_request *obj_req)
3174 struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev;
3177 rbd_assert(obj_req->num_img_extents);
3178 prune_extents(obj_req->img_extents, &obj_req->num_img_extents,
3180 if (!obj_req->num_img_extents) {
3187 return rbd_obj_copyup_current_snapc(obj_req, MODS_ONLY);
3190 ret = setup_copyup_bvecs(obj_req, rbd_obj_img_extents_bytes(obj_req));
3194 return rbd_obj_read_from_parent(obj_req);
3197 static void rbd_obj_copyup_object_maps(struct rbd_obj_request *obj_req)
3199 struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev;
3200 struct ceph_snap_context *snapc = obj_req->img_request->snapc;
3205 rbd_assert(!obj_req->pending.result && !obj_req->pending.num_pending);
3210 if (obj_req->flags & RBD_OBJ_FLAG_COPYUP_ZEROS)
3220 ret = rbd_object_map_update(obj_req, snapc->snaps[i],
3223 obj_req->pending.result = ret;
3228 obj_req->pending.num_pending++;
3232 static void rbd_obj_copyup_write_object(struct rbd_obj_request *obj_req)
3234 u32 bytes = rbd_obj_img_extents_bytes(obj_req);
3237 rbd_assert(!obj_req->pending.result && !obj_req->pending.num_pending);
3244 if (obj_req->flags & RBD_OBJ_FLAG_COPYUP_ZEROS)
3247 if (obj_req->img_request->snapc->num_snaps && bytes > 0) {
3254 ret = rbd_obj_copyup_empty_snapc(obj_req, bytes);
3256 obj_req->pending.result = ret;
3260 obj_req->pending.num_pending++;
3264 ret = rbd_obj_copyup_current_snapc(obj_req, bytes);
3266 obj_req->pending.result = ret;
3270 obj_req->pending.num_pending++;
3273 static bool rbd_obj_advance_copyup(struct rbd_obj_request *obj_req, int *result)
3275 struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev;
3279 switch (obj_req->copyup_state) {
3283 ret = rbd_obj_copyup_read_parent(obj_req);
3288 if (obj_req->num_img_extents)
3289 obj_req->copyup_state = RBD_OBJ_COPYUP_READ_PARENT;
3291 obj_req->copyup_state = RBD_OBJ_COPYUP_WRITE_OBJECT;
3297 if (is_zero_bvecs(obj_req->copyup_bvecs,
3298 rbd_obj_img_extents_bytes(obj_req))) {
3299 dout("%s %p detected zeros\n", __func__, obj_req);
3300 obj_req->flags |= RBD_OBJ_FLAG_COPYUP_ZEROS;
3303 rbd_obj_copyup_object_maps(obj_req);
3304 if (!obj_req->pending.num_pending) {
3305 *result = obj_req->pending.result;
3306 obj_req->copyup_state = RBD_OBJ_COPYUP_OBJECT_MAPS;
3309 obj_req->copyup_state = __RBD_OBJ_COPYUP_OBJECT_MAPS;
3312 if (!pending_result_dec(&obj_req->pending, result))
3322 rbd_obj_copyup_write_object(obj_req);
3323 if (!obj_req->pending.num_pending) {
3324 *result = obj_req->pending.result;
3325 obj_req->copyup_state = RBD_OBJ_COPYUP_WRITE_OBJECT;
3328 obj_req->copyup_state = __RBD_OBJ_COPYUP_WRITE_OBJECT;
3331 if (!pending_result_dec(&obj_req->pending, result))
3347 static int rbd_obj_write_post_object_map(struct rbd_obj_request *obj_req)
3349 struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev;
3355 if (!(obj_req->flags & RBD_OBJ_FLAG_DELETION))
3358 return rbd_object_map_update(obj_req, CEPH_NOSNAP, OBJECT_NONEXISTENT,
3362 static bool rbd_obj_advance_write(struct rbd_obj_request *obj_req, int *result)
3364 struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev;
3368 switch (obj_req->write_state) {
3372 rbd_obj_set_copyup_enabled(obj_req);
3373 if (rbd_obj_write_is_noop(obj_req))
3376 ret = rbd_obj_write_pre_object_map(obj_req);
3381 obj_req->write_state = RBD_OBJ_WRITE_PRE_OBJECT_MAP;
3391 ret = rbd_obj_write_object(obj_req);
3396 obj_req->write_state = RBD_OBJ_WRITE_OBJECT;
3400 if (obj_req->flags & RBD_OBJ_FLAG_COPYUP_ENABLED) {
3402 obj_req->copyup_state = RBD_OBJ_COPYUP_START;
3403 obj_req->write_state = __RBD_OBJ_WRITE_COPYUP;
3410 if (obj_req->flags & RBD_OBJ_FLAG_DELETION)
3416 obj_req->write_state = RBD_OBJ_WRITE_COPYUP;
3419 if (!rbd_obj_advance_copyup(obj_req, result))
3427 ret = rbd_obj_write_post_object_map(obj_req);
3432 obj_req->write_state = RBD_OBJ_WRITE_POST_OBJECT_MAP;
3447 * Return true if @obj_req is completed.
3449 static bool __rbd_obj_handle_request(struct rbd_obj_request *obj_req,
3452 struct rbd_img_request *img_req = obj_req->img_request;
3456 mutex_lock(&obj_req->state_mutex);
3458 done = rbd_obj_advance_read(obj_req, result);
3460 done = rbd_obj_advance_write(obj_req, result);
3461 mutex_unlock(&obj_req->state_mutex);
3466 obj_op_name(img_req->op_type), obj_req->ex.oe_objno,
3467 obj_req->ex.oe_off, obj_req->ex.oe_len, *result);
3476 static void rbd_obj_handle_request(struct rbd_obj_request *obj_req, int result)
3478 if (__rbd_obj_handle_request(obj_req, &result))
3479 rbd_img_handle_request(obj_req->img_request, result);
3561 struct rbd_obj_request *obj_req;
3574 for_each_obj_request(img_req, obj_req) {
3577 if (__rbd_obj_handle_request(obj_req, &result)) {
3668 struct rbd_obj_request *obj_req = img_req->obj_request;
3671 if (__rbd_obj_handle_request(obj_req, &result)) {
3672 img_req = obj_req->img_request;