obj_req 640 drivers/block/rbd.c static void rbd_obj_handle_request(struct rbd_obj_request *obj_req, int result); obj_req 1389 drivers/block/rbd.c static void rbd_obj_zero_range(struct rbd_obj_request *obj_req, u32 off, obj_req 1392 drivers/block/rbd.c dout("%s %p data buf %u~%u\n", __func__, obj_req, off, bytes); obj_req 1394 drivers/block/rbd.c switch (obj_req->img_request->data_type) { obj_req 1396 drivers/block/rbd.c zero_bios(&obj_req->bio_pos, off, bytes); obj_req 1400 drivers/block/rbd.c zero_bvecs(&obj_req->bvec_pos, off, bytes); obj_req 1446 drivers/block/rbd.c struct rbd_obj_request *obj_req = osd_req->r_priv; obj_req 1449 drivers/block/rbd.c __func__, osd_req, obj_req, obj_req->ex.oe_objno, obj_req 1450 drivers/block/rbd.c obj_req->ex.oe_off, obj_req->ex.oe_len); obj_req 1477 drivers/block/rbd.c static bool rbd_obj_is_entire(struct rbd_obj_request *obj_req) obj_req 1479 drivers/block/rbd.c struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev; obj_req 1481 drivers/block/rbd.c return !obj_req->ex.oe_off && obj_req 1482 drivers/block/rbd.c obj_req->ex.oe_len == rbd_dev->layout.object_size; obj_req 1485 drivers/block/rbd.c static bool rbd_obj_is_tail(struct rbd_obj_request *obj_req) obj_req 1487 drivers/block/rbd.c struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev; obj_req 1489 drivers/block/rbd.c return obj_req->ex.oe_off + obj_req->ex.oe_len == obj_req 1496 drivers/block/rbd.c static bool rbd_obj_copyup_enabled(struct rbd_obj_request *obj_req) obj_req 1498 drivers/block/rbd.c if (!obj_req->num_img_extents || obj_req 1499 drivers/block/rbd.c (rbd_obj_is_entire(obj_req) && obj_req 1500 drivers/block/rbd.c !obj_req->img_request->snapc->num_snaps)) obj_req 1506 drivers/block/rbd.c static u64 rbd_obj_img_extents_bytes(struct rbd_obj_request *obj_req) obj_req 1508 drivers/block/rbd.c return ceph_file_extents_bytes(obj_req->img_extents, obj_req 1509 drivers/block/rbd.c obj_req->num_img_extents); obj_req 1528 drivers/block/rbd.c struct rbd_obj_request *obj_req = osd_req->r_priv; obj_req 1532 drivers/block/rbd.c osd_req->r_result, obj_req); obj_req 1539 drivers/block/rbd.c if (osd_req->r_result > 0 && rbd_img_is_write(obj_req->img_request)) obj_req 1544 drivers/block/rbd.c rbd_obj_handle_request(obj_req, result); obj_req 1565 drivers/block/rbd.c __rbd_obj_add_osd_request(struct rbd_obj_request *obj_req, obj_req 1568 drivers/block/rbd.c struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev; obj_req 1579 drivers/block/rbd.c list_add_tail(&req->r_private_item, &obj_req->osd_reqs); obj_req 1581 drivers/block/rbd.c req->r_priv = obj_req; obj_req 1592 drivers/block/rbd.c obj_req->ex.oe_objno); obj_req 1600 drivers/block/rbd.c rbd_obj_add_osd_request(struct rbd_obj_request *obj_req, int num_ops) obj_req 1602 drivers/block/rbd.c return __rbd_obj_add_osd_request(obj_req, obj_req->img_request->snapc, obj_req 2084 drivers/block/rbd.c static int rbd_object_map_update_finish(struct rbd_obj_request *obj_req, obj_req 2087 drivers/block/rbd.c struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev; obj_req 2112 drivers/block/rbd.c rbd_assert(objno == obj_req->ex.oe_objno); obj_req 2131 drivers/block/rbd.c struct rbd_obj_request *obj_req = osd_req->r_priv; obj_req 2135 drivers/block/rbd.c osd_req->r_result, obj_req); obj_req 2137 drivers/block/rbd.c result = rbd_object_map_update_finish(obj_req, osd_req); obj_req 2138 drivers/block/rbd.c rbd_obj_handle_request(obj_req, result); obj_req 2191 drivers/block/rbd.c static int rbd_object_map_update(struct rbd_obj_request *obj_req, u64 snap_id, obj_req 2194 drivers/block/rbd.c struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev; obj_req 2202 drivers/block/rbd.c if (!update_needed(rbd_dev, obj_req->ex.oe_objno, new_state)) obj_req 2212 drivers/block/rbd.c list_add_tail(&req->r_private_item, &obj_req->osd_reqs); obj_req 2214 drivers/block/rbd.c req->r_priv = obj_req; obj_req 2232 drivers/block/rbd.c ret = rbd_cls_object_map_update(req, which, obj_req->ex.oe_objno, obj_req 2269 drivers/block/rbd.c static int rbd_obj_calc_img_extents(struct rbd_obj_request *obj_req, obj_req 2272 drivers/block/rbd.c struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev; obj_req 2278 drivers/block/rbd.c ret = ceph_extent_to_file(&rbd_dev->layout, obj_req->ex.oe_objno, obj_req 2279 drivers/block/rbd.c entire ? 0 : obj_req->ex.oe_off, obj_req 2281 drivers/block/rbd.c obj_req->ex.oe_len, obj_req 2282 drivers/block/rbd.c &obj_req->img_extents, obj_req 2283 drivers/block/rbd.c &obj_req->num_img_extents); obj_req 2287 drivers/block/rbd.c prune_extents(obj_req->img_extents, &obj_req->num_img_extents, obj_req 2294 drivers/block/rbd.c struct rbd_obj_request *obj_req = osd_req->r_priv; obj_req 2296 drivers/block/rbd.c switch (obj_req->img_request->data_type) { obj_req 2299 drivers/block/rbd.c &obj_req->bio_pos, obj_req 2300 drivers/block/rbd.c obj_req->ex.oe_len); obj_req 2304 drivers/block/rbd.c rbd_assert(obj_req->bvec_pos.iter.bi_size == obj_req 2305 drivers/block/rbd.c obj_req->ex.oe_len); obj_req 2306 drivers/block/rbd.c rbd_assert(obj_req->bvec_idx == obj_req->bvec_count); obj_req 2308 drivers/block/rbd.c &obj_req->bvec_pos); obj_req 2341 drivers/block/rbd.c struct rbd_obj_request *obj_req = osd_req->r_priv; obj_req 2348 drivers/block/rbd.c osd_req_op_cls_request_data_bvecs(osd_req, which, obj_req->copyup_bvecs, obj_req 2349 drivers/block/rbd.c obj_req->copyup_bvec_count, bytes); obj_req 2353 drivers/block/rbd.c static int rbd_obj_init_read(struct rbd_obj_request *obj_req) obj_req 2355 drivers/block/rbd.c obj_req->read_state = RBD_OBJ_READ_START; obj_req 2362 drivers/block/rbd.c struct rbd_obj_request *obj_req = osd_req->r_priv; obj_req 2363 drivers/block/rbd.c struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev; obj_req 2367 drivers/block/rbd.c !(obj_req->flags & RBD_OBJ_FLAG_MAY_EXIST)) { obj_req 2373 drivers/block/rbd.c if (rbd_obj_is_entire(obj_req)) obj_req 2379 drivers/block/rbd.c obj_req->ex.oe_off, obj_req->ex.oe_len, 0, 0); obj_req 2383 drivers/block/rbd.c static int rbd_obj_init_write(struct rbd_obj_request *obj_req) obj_req 2388 drivers/block/rbd.c ret = rbd_obj_calc_img_extents(obj_req, true); obj_req 2392 drivers/block/rbd.c if (rbd_obj_copyup_enabled(obj_req)) obj_req 2393 drivers/block/rbd.c obj_req->flags |= RBD_OBJ_FLAG_COPYUP_ENABLED; obj_req 2395 drivers/block/rbd.c obj_req->write_state = RBD_OBJ_WRITE_START; obj_req 2399 drivers/block/rbd.c static u16 truncate_or_zero_opcode(struct rbd_obj_request *obj_req) obj_req 2401 drivers/block/rbd.c return rbd_obj_is_tail(obj_req) ? CEPH_OSD_OP_TRUNCATE : obj_req 2408 drivers/block/rbd.c struct rbd_obj_request *obj_req = osd_req->r_priv; obj_req 2410 drivers/block/rbd.c if (rbd_obj_is_entire(obj_req) && !obj_req->num_img_extents) { obj_req 2411 drivers/block/rbd.c rbd_assert(obj_req->flags & RBD_OBJ_FLAG_DELETION); obj_req 2415 drivers/block/rbd.c truncate_or_zero_opcode(obj_req), obj_req 2416 drivers/block/rbd.c obj_req->ex.oe_off, obj_req->ex.oe_len, obj_req 2421 drivers/block/rbd.c static int rbd_obj_init_discard(struct rbd_obj_request *obj_req) obj_req 2423 drivers/block/rbd.c struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev; obj_req 2436 drivers/block/rbd.c !rbd_obj_is_tail(obj_req)) { obj_req 2437 drivers/block/rbd.c off = round_up(obj_req->ex.oe_off, rbd_dev->opts->alloc_size); obj_req 2438 drivers/block/rbd.c next_off = round_down(obj_req->ex.oe_off + obj_req->ex.oe_len, obj_req 2444 drivers/block/rbd.c obj_req, obj_req->ex.oe_off, obj_req->ex.oe_len, obj_req 2446 drivers/block/rbd.c obj_req->ex.oe_off = off; obj_req 2447 drivers/block/rbd.c obj_req->ex.oe_len = next_off - off; obj_req 2451 drivers/block/rbd.c ret = rbd_obj_calc_img_extents(obj_req, true); obj_req 2455 drivers/block/rbd.c obj_req->flags |= RBD_OBJ_FLAG_NOOP_FOR_NONEXISTENT; obj_req 2456 drivers/block/rbd.c if (rbd_obj_is_entire(obj_req) && !obj_req->num_img_extents) obj_req 2457 drivers/block/rbd.c obj_req->flags |= RBD_OBJ_FLAG_DELETION; obj_req 2459 drivers/block/rbd.c obj_req->write_state = RBD_OBJ_WRITE_START; obj_req 2466 drivers/block/rbd.c struct rbd_obj_request *obj_req = osd_req->r_priv; obj_req 2469 drivers/block/rbd.c if (rbd_obj_is_entire(obj_req)) { obj_req 2470 drivers/block/rbd.c if (obj_req->num_img_extents) { obj_req 2471 drivers/block/rbd.c if (!(obj_req->flags & RBD_OBJ_FLAG_COPYUP_ENABLED)) obj_req 2476 drivers/block/rbd.c rbd_assert(obj_req->flags & RBD_OBJ_FLAG_DELETION); obj_req 2482 drivers/block/rbd.c opcode = truncate_or_zero_opcode(obj_req); obj_req 2487 drivers/block/rbd.c obj_req->ex.oe_off, obj_req->ex.oe_len, obj_req 2491 drivers/block/rbd.c static int rbd_obj_init_zeroout(struct rbd_obj_request *obj_req) obj_req 2496 drivers/block/rbd.c ret = rbd_obj_calc_img_extents(obj_req, true); obj_req 2500 drivers/block/rbd.c if (rbd_obj_copyup_enabled(obj_req)) obj_req 2501 drivers/block/rbd.c obj_req->flags |= RBD_OBJ_FLAG_COPYUP_ENABLED; obj_req 2502 drivers/block/rbd.c if (!obj_req->num_img_extents) { obj_req 2503 drivers/block/rbd.c obj_req->flags |= RBD_OBJ_FLAG_NOOP_FOR_NONEXISTENT; obj_req 2504 drivers/block/rbd.c if (rbd_obj_is_entire(obj_req)) obj_req 2505 drivers/block/rbd.c obj_req->flags |= RBD_OBJ_FLAG_DELETION; obj_req 2508 drivers/block/rbd.c obj_req->write_state = RBD_OBJ_WRITE_START; obj_req 2512 drivers/block/rbd.c static int count_write_ops(struct rbd_obj_request *obj_req) obj_req 2514 drivers/block/rbd.c struct rbd_img_request *img_req = obj_req->img_request; obj_req 2519 drivers/block/rbd.c !(obj_req->flags & RBD_OBJ_FLAG_MAY_EXIST)) obj_req 2526 drivers/block/rbd.c if (rbd_obj_is_entire(obj_req) && obj_req->num_img_extents && obj_req 2527 drivers/block/rbd.c !(obj_req->flags & RBD_OBJ_FLAG_COPYUP_ENABLED)) obj_req 2539 drivers/block/rbd.c struct rbd_obj_request *obj_req = osd_req->r_priv; obj_req 2541 drivers/block/rbd.c switch (obj_req->img_request->op_type) { obj_req 2563 drivers/block/rbd.c struct rbd_obj_request *obj_req, *next_obj_req; obj_req 2566 drivers/block/rbd.c for_each_obj_request_safe(img_req, obj_req, next_obj_req) { obj_req 2569 drivers/block/rbd.c ret = rbd_obj_init_read(obj_req); obj_req 2572 drivers/block/rbd.c ret = rbd_obj_init_write(obj_req); obj_req 2575 drivers/block/rbd.c ret = rbd_obj_init_discard(obj_req); obj_req 2578 drivers/block/rbd.c ret = rbd_obj_init_zeroout(obj_req); obj_req 2586 drivers/block/rbd.c rbd_img_obj_request_del(img_req, obj_req); obj_req 2612 drivers/block/rbd.c struct rbd_obj_request *obj_req; obj_req 2614 drivers/block/rbd.c obj_req = rbd_obj_request_create(); obj_req 2615 drivers/block/rbd.c if (!obj_req) obj_req 2618 drivers/block/rbd.c rbd_img_obj_request_add(img_req, obj_req); obj_req 2619 drivers/block/rbd.c return &obj_req->ex; obj_req 2682 drivers/block/rbd.c struct rbd_obj_request *obj_req; obj_req 2712 drivers/block/rbd.c for_each_obj_request(img_req, obj_req) { obj_req 2713 drivers/block/rbd.c obj_req->bvec_pos.bvecs = kmalloc_array(obj_req->bvec_count, obj_req 2714 drivers/block/rbd.c sizeof(*obj_req->bvec_pos.bvecs), obj_req 2716 drivers/block/rbd.c if (!obj_req->bvec_pos.bvecs) obj_req 2753 drivers/block/rbd.c struct rbd_obj_request *obj_req = obj_req 2758 drivers/block/rbd.c obj_req->bio_pos = *it; obj_req 2764 drivers/block/rbd.c struct rbd_obj_request *obj_req = obj_req 2770 drivers/block/rbd.c obj_req->bvec_count++; obj_req 2777 drivers/block/rbd.c struct rbd_obj_request *obj_req = obj_req 2783 drivers/block/rbd.c obj_req->bvec_pos.bvecs[obj_req->bvec_idx++] = bv; obj_req 2784 drivers/block/rbd.c obj_req->bvec_pos.iter.bi_size += bv.bv_len; obj_req 2816 drivers/block/rbd.c struct rbd_obj_request *obj_req = obj_req 2820 drivers/block/rbd.c obj_req->bvec_pos = *it; obj_req 2821 drivers/block/rbd.c ceph_bvec_iter_shorten(&obj_req->bvec_pos, bytes); obj_req 2827 drivers/block/rbd.c struct rbd_obj_request *obj_req = obj_req 2832 drivers/block/rbd.c obj_req->bvec_count++; obj_req 2838 drivers/block/rbd.c struct rbd_obj_request *obj_req = obj_req 2843 drivers/block/rbd.c obj_req->bvec_pos.bvecs[obj_req->bvec_idx++] = bv; obj_req 2844 drivers/block/rbd.c obj_req->bvec_pos.iter.bi_size += bv.bv_len; obj_req 2895 drivers/block/rbd.c static bool rbd_obj_may_exist(struct rbd_obj_request *obj_req) obj_req 2897 drivers/block/rbd.c struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev; obj_req 2899 drivers/block/rbd.c if (rbd_object_map_may_exist(rbd_dev, obj_req->ex.oe_objno)) { obj_req 2900 drivers/block/rbd.c obj_req->flags |= RBD_OBJ_FLAG_MAY_EXIST; obj_req 2904 drivers/block/rbd.c dout("%s %p objno %llu assuming dne\n", __func__, obj_req, obj_req 2905 drivers/block/rbd.c obj_req->ex.oe_objno); obj_req 2909 drivers/block/rbd.c static int rbd_obj_read_object(struct rbd_obj_request *obj_req) obj_req 2914 drivers/block/rbd.c osd_req = __rbd_obj_add_osd_request(obj_req, NULL, 1); obj_req 2919 drivers/block/rbd.c obj_req->ex.oe_off, obj_req->ex.oe_len, 0, 0); obj_req 2931 drivers/block/rbd.c static int rbd_obj_read_from_parent(struct rbd_obj_request *obj_req) obj_req 2933 drivers/block/rbd.c struct rbd_img_request *img_req = obj_req->img_request; obj_req 2943 drivers/block/rbd.c child_img_req->obj_request = obj_req; obj_req 2946 drivers/block/rbd.c obj_req); obj_req 2952 drivers/block/rbd.c obj_req->img_extents, obj_req 2953 drivers/block/rbd.c obj_req->num_img_extents, obj_req 2954 drivers/block/rbd.c &obj_req->bio_pos); obj_req 2959 drivers/block/rbd.c obj_req->img_extents, obj_req 2960 drivers/block/rbd.c obj_req->num_img_extents, obj_req 2961 drivers/block/rbd.c &obj_req->bvec_pos); obj_req 2968 drivers/block/rbd.c obj_req->img_extents, obj_req 2969 drivers/block/rbd.c obj_req->num_img_extents, obj_req 2970 drivers/block/rbd.c obj_req->copyup_bvecs); obj_req 2982 drivers/block/rbd.c static bool rbd_obj_advance_read(struct rbd_obj_request *obj_req, int *result) obj_req 2984 drivers/block/rbd.c struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev; obj_req 2988 drivers/block/rbd.c switch (obj_req->read_state) { obj_req 2992 drivers/block/rbd.c if (!rbd_obj_may_exist(obj_req)) { obj_req 2994 drivers/block/rbd.c obj_req->read_state = RBD_OBJ_READ_OBJECT; obj_req 2998 drivers/block/rbd.c ret = rbd_obj_read_object(obj_req); obj_req 3003 drivers/block/rbd.c obj_req->read_state = RBD_OBJ_READ_OBJECT; obj_req 3008 drivers/block/rbd.c ret = rbd_obj_calc_img_extents(obj_req, false); obj_req 3013 drivers/block/rbd.c if (obj_req->num_img_extents) { obj_req 3014 drivers/block/rbd.c ret = rbd_obj_read_from_parent(obj_req); obj_req 3019 drivers/block/rbd.c obj_req->read_state = RBD_OBJ_READ_PARENT; obj_req 3030 drivers/block/rbd.c rbd_obj_zero_range(obj_req, 0, obj_req->ex.oe_len); obj_req 3033 drivers/block/rbd.c if (*result < obj_req->ex.oe_len) obj_req 3034 drivers/block/rbd.c rbd_obj_zero_range(obj_req, *result, obj_req 3035 drivers/block/rbd.c obj_req->ex.oe_len - *result); obj_req 3037 drivers/block/rbd.c rbd_assert(*result == obj_req->ex.oe_len); obj_req 3047 drivers/block/rbd.c u32 obj_overlap = rbd_obj_img_extents_bytes(obj_req); obj_req 3049 drivers/block/rbd.c if (obj_overlap < obj_req->ex.oe_len) obj_req 3050 drivers/block/rbd.c rbd_obj_zero_range(obj_req, obj_overlap, obj_req 3051 drivers/block/rbd.c obj_req->ex.oe_len - obj_overlap); obj_req 3059 drivers/block/rbd.c static bool rbd_obj_write_is_noop(struct rbd_obj_request *obj_req) obj_req 3061 drivers/block/rbd.c struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev; obj_req 3063 drivers/block/rbd.c if (rbd_object_map_may_exist(rbd_dev, obj_req->ex.oe_objno)) obj_req 3064 drivers/block/rbd.c obj_req->flags |= RBD_OBJ_FLAG_MAY_EXIST; obj_req 3066 drivers/block/rbd.c if (!(obj_req->flags & RBD_OBJ_FLAG_MAY_EXIST) && obj_req 3067 drivers/block/rbd.c (obj_req->flags & RBD_OBJ_FLAG_NOOP_FOR_NONEXISTENT)) { obj_req 3068 drivers/block/rbd.c dout("%s %p noop for nonexistent\n", __func__, obj_req); obj_req 3081 drivers/block/rbd.c static int rbd_obj_write_pre_object_map(struct rbd_obj_request *obj_req) obj_req 3083 drivers/block/rbd.c struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev; obj_req 3089 drivers/block/rbd.c if (obj_req->flags & RBD_OBJ_FLAG_DELETION) obj_req 3094 drivers/block/rbd.c return rbd_object_map_update(obj_req, CEPH_NOSNAP, new_state, NULL); obj_req 3097 drivers/block/rbd.c static int rbd_obj_write_object(struct rbd_obj_request *obj_req) obj_req 3100 drivers/block/rbd.c int num_ops = count_write_ops(obj_req); obj_req 3104 drivers/block/rbd.c if (obj_req->flags & RBD_OBJ_FLAG_COPYUP_ENABLED) obj_req 3107 drivers/block/rbd.c osd_req = rbd_obj_add_osd_request(obj_req, num_ops); obj_req 3111 drivers/block/rbd.c if (obj_req->flags & RBD_OBJ_FLAG_COPYUP_ENABLED) { obj_req 3148 drivers/block/rbd.c static int rbd_obj_copyup_empty_snapc(struct rbd_obj_request *obj_req, obj_req 3154 drivers/block/rbd.c dout("%s obj_req %p bytes %u\n", __func__, obj_req, bytes); obj_req 3157 drivers/block/rbd.c osd_req = __rbd_obj_add_osd_request(obj_req, &rbd_empty_snapc, 1); obj_req 3175 drivers/block/rbd.c static int rbd_obj_copyup_current_snapc(struct rbd_obj_request *obj_req, obj_req 3179 drivers/block/rbd.c int num_ops = count_write_ops(obj_req); obj_req 3183 drivers/block/rbd.c dout("%s obj_req %p bytes %u\n", __func__, obj_req, bytes); obj_req 3188 drivers/block/rbd.c osd_req = rbd_obj_add_osd_request(obj_req, num_ops); obj_req 3209 drivers/block/rbd.c static int setup_copyup_bvecs(struct rbd_obj_request *obj_req, u64 obj_overlap) obj_req 3213 drivers/block/rbd.c rbd_assert(!obj_req->copyup_bvecs); obj_req 3214 drivers/block/rbd.c obj_req->copyup_bvec_count = calc_pages_for(0, obj_overlap); obj_req 3215 drivers/block/rbd.c obj_req->copyup_bvecs = kcalloc(obj_req->copyup_bvec_count, obj_req 3216 drivers/block/rbd.c sizeof(*obj_req->copyup_bvecs), obj_req 3218 drivers/block/rbd.c if (!obj_req->copyup_bvecs) obj_req 3221 drivers/block/rbd.c for (i = 0; i < obj_req->copyup_bvec_count; i++) { obj_req 3224 drivers/block/rbd.c obj_req->copyup_bvecs[i].bv_page = alloc_page(GFP_NOIO); obj_req 3225 drivers/block/rbd.c if (!obj_req->copyup_bvecs[i].bv_page) obj_req 3228 drivers/block/rbd.c obj_req->copyup_bvecs[i].bv_offset = 0; obj_req 3229 drivers/block/rbd.c obj_req->copyup_bvecs[i].bv_len = len; obj_req 3242 drivers/block/rbd.c static int rbd_obj_copyup_read_parent(struct rbd_obj_request *obj_req) obj_req 3244 drivers/block/rbd.c struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev; obj_req 3247 drivers/block/rbd.c rbd_assert(obj_req->num_img_extents); obj_req 3248 drivers/block/rbd.c prune_extents(obj_req->img_extents, &obj_req->num_img_extents, obj_req 3250 drivers/block/rbd.c if (!obj_req->num_img_extents) { obj_req 3257 drivers/block/rbd.c return rbd_obj_copyup_current_snapc(obj_req, MODS_ONLY); obj_req 3260 drivers/block/rbd.c ret = setup_copyup_bvecs(obj_req, rbd_obj_img_extents_bytes(obj_req)); obj_req 3264 drivers/block/rbd.c return rbd_obj_read_from_parent(obj_req); obj_req 3267 drivers/block/rbd.c static void rbd_obj_copyup_object_maps(struct rbd_obj_request *obj_req) obj_req 3269 drivers/block/rbd.c struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev; obj_req 3270 drivers/block/rbd.c struct ceph_snap_context *snapc = obj_req->img_request->snapc; obj_req 3275 drivers/block/rbd.c rbd_assert(!obj_req->pending.result && !obj_req->pending.num_pending); obj_req 3280 drivers/block/rbd.c if (obj_req->flags & RBD_OBJ_FLAG_COPYUP_ZEROS) obj_req 3290 drivers/block/rbd.c ret = rbd_object_map_update(obj_req, snapc->snaps[i], obj_req 3293 drivers/block/rbd.c obj_req->pending.result = ret; obj_req 3298 drivers/block/rbd.c obj_req->pending.num_pending++; obj_req 3302 drivers/block/rbd.c static void rbd_obj_copyup_write_object(struct rbd_obj_request *obj_req) obj_req 3304 drivers/block/rbd.c u32 bytes = rbd_obj_img_extents_bytes(obj_req); obj_req 3307 drivers/block/rbd.c rbd_assert(!obj_req->pending.result && !obj_req->pending.num_pending); obj_req 3314 drivers/block/rbd.c if (obj_req->flags & RBD_OBJ_FLAG_COPYUP_ZEROS) obj_req 3317 drivers/block/rbd.c if (obj_req->img_request->snapc->num_snaps && bytes > 0) { obj_req 3324 drivers/block/rbd.c ret = rbd_obj_copyup_empty_snapc(obj_req, bytes); obj_req 3326 drivers/block/rbd.c obj_req->pending.result = ret; obj_req 3330 drivers/block/rbd.c obj_req->pending.num_pending++; obj_req 3334 drivers/block/rbd.c ret = rbd_obj_copyup_current_snapc(obj_req, bytes); obj_req 3336 drivers/block/rbd.c obj_req->pending.result = ret; obj_req 3340 drivers/block/rbd.c obj_req->pending.num_pending++; obj_req 3343 drivers/block/rbd.c static bool rbd_obj_advance_copyup(struct rbd_obj_request *obj_req, int *result) obj_req 3345 drivers/block/rbd.c struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev; obj_req 3349 drivers/block/rbd.c switch (obj_req->copyup_state) { obj_req 3353 drivers/block/rbd.c ret = rbd_obj_copyup_read_parent(obj_req); obj_req 3358 drivers/block/rbd.c if (obj_req->num_img_extents) obj_req 3359 drivers/block/rbd.c obj_req->copyup_state = RBD_OBJ_COPYUP_READ_PARENT; obj_req 3361 drivers/block/rbd.c obj_req->copyup_state = RBD_OBJ_COPYUP_WRITE_OBJECT; obj_req 3367 drivers/block/rbd.c if (is_zero_bvecs(obj_req->copyup_bvecs, obj_req 3368 drivers/block/rbd.c rbd_obj_img_extents_bytes(obj_req))) { obj_req 3369 drivers/block/rbd.c dout("%s %p detected zeros\n", __func__, obj_req); obj_req 3370 drivers/block/rbd.c obj_req->flags |= RBD_OBJ_FLAG_COPYUP_ZEROS; obj_req 3373 drivers/block/rbd.c rbd_obj_copyup_object_maps(obj_req); obj_req 3374 drivers/block/rbd.c if (!obj_req->pending.num_pending) { obj_req 3375 drivers/block/rbd.c *result = obj_req->pending.result; obj_req 3376 drivers/block/rbd.c obj_req->copyup_state = RBD_OBJ_COPYUP_OBJECT_MAPS; obj_req 3379 drivers/block/rbd.c obj_req->copyup_state = __RBD_OBJ_COPYUP_OBJECT_MAPS; obj_req 3382 drivers/block/rbd.c if (!pending_result_dec(&obj_req->pending, result)) obj_req 3392 drivers/block/rbd.c rbd_obj_copyup_write_object(obj_req); obj_req 3393 drivers/block/rbd.c if (!obj_req->pending.num_pending) { obj_req 3394 drivers/block/rbd.c *result = obj_req->pending.result; obj_req 3395 drivers/block/rbd.c obj_req->copyup_state = RBD_OBJ_COPYUP_WRITE_OBJECT; obj_req 3398 drivers/block/rbd.c obj_req->copyup_state = __RBD_OBJ_COPYUP_WRITE_OBJECT; obj_req 3401 drivers/block/rbd.c if (!pending_result_dec(&obj_req->pending, result)) obj_req 3417 drivers/block/rbd.c static int rbd_obj_write_post_object_map(struct rbd_obj_request *obj_req) obj_req 3419 drivers/block/rbd.c struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev; obj_req 3425 drivers/block/rbd.c if (!(obj_req->flags & RBD_OBJ_FLAG_DELETION)) obj_req 3428 drivers/block/rbd.c return rbd_object_map_update(obj_req, CEPH_NOSNAP, OBJECT_NONEXISTENT, obj_req 3432 drivers/block/rbd.c static bool rbd_obj_advance_write(struct rbd_obj_request *obj_req, int *result) obj_req 3434 drivers/block/rbd.c struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev; obj_req 3438 drivers/block/rbd.c switch (obj_req->write_state) { obj_req 3442 drivers/block/rbd.c if (rbd_obj_write_is_noop(obj_req)) obj_req 3445 drivers/block/rbd.c ret = rbd_obj_write_pre_object_map(obj_req); obj_req 3450 drivers/block/rbd.c obj_req->write_state = RBD_OBJ_WRITE_PRE_OBJECT_MAP; obj_req 3460 drivers/block/rbd.c ret = rbd_obj_write_object(obj_req); obj_req 3465 drivers/block/rbd.c obj_req->write_state = RBD_OBJ_WRITE_OBJECT; obj_req 3469 drivers/block/rbd.c if (obj_req->flags & RBD_OBJ_FLAG_COPYUP_ENABLED) { obj_req 3471 drivers/block/rbd.c obj_req->copyup_state = RBD_OBJ_COPYUP_START; obj_req 3472 drivers/block/rbd.c obj_req->write_state = __RBD_OBJ_WRITE_COPYUP; obj_req 3479 drivers/block/rbd.c if (obj_req->flags & RBD_OBJ_FLAG_DELETION) obj_req 3485 drivers/block/rbd.c obj_req->write_state = RBD_OBJ_WRITE_COPYUP; obj_req 3488 drivers/block/rbd.c if (!rbd_obj_advance_copyup(obj_req, result)) obj_req 3496 drivers/block/rbd.c ret = rbd_obj_write_post_object_map(obj_req); obj_req 3501 drivers/block/rbd.c obj_req->write_state = RBD_OBJ_WRITE_POST_OBJECT_MAP; obj_req 3518 drivers/block/rbd.c static bool __rbd_obj_handle_request(struct rbd_obj_request *obj_req, obj_req 3521 drivers/block/rbd.c struct rbd_img_request *img_req = obj_req->img_request; obj_req 3525 drivers/block/rbd.c mutex_lock(&obj_req->state_mutex); obj_req 3527 drivers/block/rbd.c done = rbd_obj_advance_read(obj_req, result); obj_req 3529 drivers/block/rbd.c done = rbd_obj_advance_write(obj_req, result); obj_req 3530 drivers/block/rbd.c mutex_unlock(&obj_req->state_mutex); obj_req 3535 drivers/block/rbd.c obj_op_name(img_req->op_type), obj_req->ex.oe_objno, obj_req 3536 drivers/block/rbd.c obj_req->ex.oe_off, obj_req->ex.oe_len, *result); obj_req 3545 drivers/block/rbd.c static void rbd_obj_handle_request(struct rbd_obj_request *obj_req, int result) obj_req 3547 drivers/block/rbd.c if (__rbd_obj_handle_request(obj_req, &result)) obj_req 3548 drivers/block/rbd.c rbd_img_handle_request(obj_req->img_request, result); obj_req 3628 drivers/block/rbd.c struct rbd_obj_request *obj_req; obj_req 3632 drivers/block/rbd.c for_each_obj_request(img_req, obj_req) { obj_req 3635 drivers/block/rbd.c if (__rbd_obj_handle_request(obj_req, &result)) { obj_req 3730 drivers/block/rbd.c struct rbd_obj_request *obj_req = img_req->obj_request; obj_req 3733 drivers/block/rbd.c if (__rbd_obj_handle_request(obj_req, &result)) { obj_req 3734 drivers/block/rbd.c img_req = obj_req->img_request;