Unverified Commit 3e6d704f authored by Baokun Li's avatar Baokun Li Committed by Christian Brauner
Browse files

cachefiles: remove err_put_fd label in cachefiles_ondemand_daemon_read()



The err_put_fd label is only used once, so remove it to make the code
more readable. In addition, the logic for deleting error request and
CLOSE request is merged to simplify the code.

Signed-off-by: default avatarBaokun Li <libaokun1@huawei.com>
Link: https://lore.kernel.org/r/20240522114308.2402121-6-libaokun@huaweicloud.com


Acked-by: default avatarJeff Layton <jlayton@kernel.org>
Reviewed-by: default avatarJia Zhu <zhujia.zj@bytedance.com>
Reviewed-by: default avatarGao Xiang <hsiangkao@linux.alibaba.com>
Reviewed-by: default avatarJingbo Xu <jefflexu@linux.alibaba.com>
Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
parent da4a8274
Loading
Loading
Loading
Loading
+16 −29
Original line number Diff line number Diff line
@@ -305,7 +305,6 @@ ssize_t cachefiles_ondemand_daemon_read(struct cachefiles_cache *cache,
{
	struct cachefiles_req *req;
	struct cachefiles_msg *msg;
	unsigned long id = 0;
	size_t n;
	int ret = 0;
	XA_STATE(xas, &cache->reqs, cache->req_id_next);
@@ -340,39 +339,26 @@ ssize_t cachefiles_ondemand_daemon_read(struct cachefiles_cache *cache,
	cachefiles_grab_object(req->object, cachefiles_obj_get_read_req);
	xa_unlock(&cache->reqs);

	id = xas.xa_index;

	if (msg->opcode == CACHEFILES_OP_OPEN) {
		ret = cachefiles_ondemand_get_fd(req);
		if (ret) {
			cachefiles_ondemand_set_object_close(req->object);
			goto error;
			goto out;
		}
	}

	msg->msg_id = id;
	msg->msg_id = xas.xa_index;
	msg->object_id = req->object->ondemand->ondemand_id;

	if (copy_to_user(_buffer, msg, n) != 0) {
		ret = -EFAULT;
		goto err_put_fd;
	}

	cachefiles_put_object(req->object, cachefiles_obj_put_read_req);
	/* CLOSE request has no reply */
	if (msg->opcode == CACHEFILES_OP_CLOSE) {
		xa_erase(&cache->reqs, id);
		complete(&req->done);
	}

	cachefiles_req_put(req);
	return n;

err_put_fd:
		if (msg->opcode == CACHEFILES_OP_OPEN)
			close_fd(((struct cachefiles_open *)msg->data)->fd);
error:
	}
out:
	cachefiles_put_object(req->object, cachefiles_obj_put_read_req);
	/* Remove error request and CLOSE request has no reply */
	if (ret || msg->opcode == CACHEFILES_OP_CLOSE) {
		xas_reset(&xas);
		xas_lock(&xas);
		if (xas_load(&xas) == req) {
@@ -381,8 +367,9 @@ ssize_t cachefiles_ondemand_daemon_read(struct cachefiles_cache *cache,
			xas_store(&xas, NULL);
		}
		xas_unlock(&xas);
	}
	cachefiles_req_put(req);
	return ret;
	return ret ? ret : n;
}

typedef int (*init_req_fn)(struct cachefiles_req *req, void *private);