From: Xiubo Li <xiubli@xxxxxxxxxx> The messages from ceph maybe split into multiple socket packages and we just need to wait for all the data to be availiable on the sokcet. This will add a new _FINISH state for the sparse-read to mark the current sparse-read succeeded. Else it will treat it as a new sparse-read when the socket receives the last piece of the osd request reply message, and the cancel_request() later will help init the sparse-read context. URL: https://tracker.ceph.com/issues/63586 Signed-off-by: Xiubo Li <xiubli@xxxxxxxxxx> --- include/linux/ceph/osd_client.h | 1 + net/ceph/osd_client.c | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/include/linux/ceph/osd_client.h b/include/linux/ceph/osd_client.h index 493de3496cd3..00d98e13100f 100644 --- a/include/linux/ceph/osd_client.h +++ b/include/linux/ceph/osd_client.h @@ -47,6 +47,7 @@ enum ceph_sparse_read_state { CEPH_SPARSE_READ_DATA_LEN, CEPH_SPARSE_READ_DATA_PRE, CEPH_SPARSE_READ_DATA, + CEPH_SPARSE_READ_FINISH, }; /* diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c index 848ef19055a0..f1705b4f19eb 100644 --- a/net/ceph/osd_client.c +++ b/net/ceph/osd_client.c @@ -5802,8 +5802,6 @@ static int prep_next_sparse_read(struct ceph_connection *con, advance_cursor(cursor, sr->sr_req_len - end, false); } - ceph_init_sparse_read(sr); - /* find next op in this request (if any) */ while (++o->o_sparse_op_idx < req->r_num_ops) { op = &req->r_ops[o->o_sparse_op_idx]; @@ -5919,7 +5917,7 @@ static int osd_sparse_read(struct ceph_connection *con, return -EREMOTEIO; } - sr->sr_state = CEPH_SPARSE_READ_HDR; + sr->sr_state = CEPH_SPARSE_READ_FINISH; goto next_op; } @@ -5952,6 +5950,8 @@ static int osd_sparse_read(struct ceph_connection *con, /* Bump the array index */ ++sr->sr_index; break; + case CEPH_SPARSE_READ_FINISH: + return 0; } return ret; } -- 2.43.0