mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-28 07:13:34 +00:00
cachefiles: remove err_put_fd label in cachefiles_ondemand_daemon_read()
[ Upstream commit3e6d704f02
] 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: Baokun Li <libaokun1@huawei.com> Link: https://lore.kernel.org/r/20240522114308.2402121-6-libaokun@huaweicloud.com Acked-by: Jeff Layton <jlayton@kernel.org> Reviewed-by: Jia Zhu <zhujia.zj@bytedance.com> Reviewed-by: Gao Xiang <hsiangkao@linux.alibaba.com> Reviewed-by: Jingbo Xu <jefflexu@linux.alibaba.com> Signed-off-by: Christian Brauner <brauner@kernel.org> Stable-dep-of:4988e35e95
("cachefiles: never get a new anonymous fd if ondemand_id is valid") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
96caaf31b1
commit
e78ade4bd4
1 changed files with 16 additions and 29 deletions
|
@ -337,7 +337,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);
|
||||
|
@ -372,49 +371,37 @@ 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;
|
||||
if (msg->opcode == CACHEFILES_OP_OPEN)
|
||||
close_fd(((struct cachefiles_open *)msg->data)->fd);
|
||||
}
|
||||
|
||||
out:
|
||||
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);
|
||||
/* 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) {
|
||||
req->error = ret;
|
||||
complete(&req->done);
|
||||
xas_store(&xas, NULL);
|
||||
}
|
||||
xas_unlock(&xas);
|
||||
}
|
||||
|
||||
cachefiles_req_put(req);
|
||||
return n;
|
||||
|
||||
err_put_fd:
|
||||
if (msg->opcode == CACHEFILES_OP_OPEN)
|
||||
close_fd(((struct cachefiles_open *)msg->data)->fd);
|
||||
error:
|
||||
cachefiles_put_object(req->object, cachefiles_obj_put_read_req);
|
||||
xas_reset(&xas);
|
||||
xas_lock(&xas);
|
||||
if (xas_load(&xas) == req) {
|
||||
req->error = ret;
|
||||
complete(&req->done);
|
||||
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);
|
||||
|
|
Loading…
Reference in a new issue