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: