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;