From: John L. Hammond Date: Wed, 29 Nov 2017 14:45:47 +0000 (-0600) Subject: LU-10267 llog: fix EOF handling in llog_client_next_block() X-Git-Tag: 2.10.3-RC1~15 X-Git-Url: https://git.whamcloud.com/gitweb?a=commitdiff_plain;h=37047ec8599e9b5ec3884be45c83e58a2b4f5270;p=fs%2Flustre-release.git LU-10267 llog: fix EOF handling in llog_client_next_block() In llog_client_next_block() update *cur_idx and *cur_offset in the special case that the handler has returned -EIO after reaching the end of the log without finding the desired record. This fixes client side EOF detection in llog_process_thread(). Lustre-change: https://review.whamcloud.com/30313 Lustre-commit: a485c51379a0218aaf01f7c0baf8e4cc993d8824 Signed-off-by: John L. Hammond Change-Id: If30ebec065ddd38fb7b06c3e16f96bb3cd76fa1b Reviewed-by: Mike Pershin Reviewed-by: Andreas Dilger Signed-off-by: Minh Diep Reviewed-on: https://review.whamcloud.com/30582 Tested-by: Jenkins Tested-by: Maloo --- diff --git a/lustre/ptlrpc/llog_client.c b/lustre/ptlrpc/llog_client.c index e57a331..a39db55 100644 --- a/lustre/ptlrpc/llog_client.c +++ b/lustre/ptlrpc/llog_client.c @@ -202,21 +202,36 @@ static int llog_client_next_block(const struct lu_env *env, req_capsule_set_size(&req->rq_pill, &RMF_EADATA, RCL_SERVER, len); ptlrpc_request_set_replen(req); rc = ptlrpc_queue_wait(req); - if (rc) - GOTO(out, rc); + /* -EIO has a special meaning here. If llog_osd_next_block() + * reaches the end of the log without finding the desired + * record then it updates *cur_offset and *cur_idx and returns + * -EIO. In llog_process_thread() we use this to detect + * EOF. But we must be careful to distinguish between -EIO + * coming from llog_osd_next_block() and -EIO coming from + * ptlrpc or below. */ + if (rc == -EIO) { + if (req->rq_repmsg == NULL || + lustre_msg_get_status(req->rq_repmsg) != -EIO) + GOTO(out, rc); + } else if (rc < 0) { + GOTO(out, rc); + } - body = req_capsule_server_get(&req->rq_pill, &RMF_LLOGD_BODY); - if (body == NULL) - GOTO(out, rc =-EFAULT); + body = req_capsule_server_get(&req->rq_pill, &RMF_LLOGD_BODY); + if (body == NULL) + GOTO(out, rc = -EFAULT); + + *cur_idx = body->lgd_saved_index; + *cur_offset = body->lgd_cur_offset; + + if (rc < 0) + GOTO(out, rc); /* The log records are swabbed as they are processed */ ptr = req_capsule_server_get(&req->rq_pill, &RMF_EADATA); if (ptr == NULL) GOTO(out, rc =-EFAULT); - *cur_idx = body->lgd_saved_index; - *cur_offset = body->lgd_cur_offset; - memcpy(buf, ptr, len); EXIT; out: