Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 166bd5b8 authored by Trond Myklebust's avatar Trond Myklebust
Browse files

pNFS/flexfiles: Fix layoutstats handling during read failovers



During a read failover, we may end up changing the value of
the pgio_mirror_idx, so make sure that we record the layout
stats before that update.

Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
parent 5a698243
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -1289,6 +1289,7 @@ static void ff_layout_io_track_ds_error(struct pnfs_layout_segment *lseg,
static int ff_layout_read_done_cb(struct rpc_task *task,
				struct nfs_pgio_header *hdr)
{
	int new_idx = hdr->pgio_mirror_idx;
	int err;

	trace_nfs4_pnfs_read(hdr, task->tk_status);
@@ -1307,7 +1308,7 @@ static int ff_layout_read_done_cb(struct rpc_task *task,
	case -NFS4ERR_RESET_TO_PNFS:
		if (ff_layout_choose_best_ds_for_read(hdr->lseg,
					hdr->pgio_mirror_idx + 1,
					&hdr->pgio_mirror_idx))
					&new_idx))
			goto out_layouterror;
		set_bit(NFS_IOHDR_RESEND_PNFS, &hdr->flags);
		return task->tk_status;
@@ -1320,7 +1321,9 @@ static int ff_layout_read_done_cb(struct rpc_task *task,

	return 0;
out_layouterror:
	ff_layout_read_record_layoutstats_done(task, hdr);
	ff_layout_send_layouterror(hdr->lseg);
	hdr->pgio_mirror_idx = new_idx;
out_eagain:
	rpc_restart_call_prepare(task);
	return -EAGAIN;