Commit 525916ce authored by Joanne Koong's avatar Joanne Koong Committed by Jens Axboe
Browse files

io_uring/rsrc: fix lost entries after cloned range



When cloning with node replacements (IORING_REGISTER_DST_REPLACE),
destination entries after the cloned range are not copied over.

Add logic to copy them over to the new destination table.

Fixes: c1329532 ("io_uring/rsrc: allow cloning with node replacements")
Cc: stable@vger.kernel.org
Signed-off-by: default avatarJoanne Koong <joannelkoong@gmail.com>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent e29af2ab
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -1205,7 +1205,7 @@ static int io_clone_buffers(struct io_ring_ctx *ctx, struct io_ring_ctx *src_ctx
	if (ret)
		return ret;

	/* Fill entries in data from dst that won't overlap with src */
	/* Copy original dst nodes from before the cloned range */
	for (i = 0; i < min(arg->dst_off, ctx->buf_table.nr); i++) {
		struct io_rsrc_node *node = ctx->buf_table.nodes[i];

@@ -1238,6 +1238,16 @@ static int io_clone_buffers(struct io_ring_ctx *ctx, struct io_ring_ctx *src_ctx
		i++;
	}

	/* Copy original dst nodes from after the cloned range */
	for (i = nbufs; i < ctx->buf_table.nr; i++) {
		struct io_rsrc_node *node = ctx->buf_table.nodes[i];

		if (node) {
			data.nodes[i] = node;
			node->refs++;
		}
	}

	/*
	 * If asked for replace, put the old table. data->nodes[] holds both
	 * old and new nodes at this point.