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

Commit 42f86b44 authored by Trond Myklebust's avatar Trond Myklebust
Browse files

pNFS/flexfiles: Don't tie up all the rpciod threads in resends



We do not want to have rpciod threads perform recursive calls into the
RPC layer since that can deadlock. In particular, having to wait for
a layoutget can be nasty... We want rather to defer scheduling those
retries until we're in the rpc_release() callback, since that is
called from the nfsiod workqueue.

Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
parent 0dae72d5
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -1243,17 +1243,18 @@ static int ff_layout_read_done_cb(struct rpc_task *task,
					   hdr->ds_clp, hdr->lseg,
					   hdr->pgio_mirror_idx);

	clear_bit(NFS_IOHDR_RESEND_PNFS, &hdr->flags);
	clear_bit(NFS_IOHDR_RESEND_MDS, &hdr->flags);
	switch (err) {
	case -NFS4ERR_RESET_TO_PNFS:
		if (ff_layout_choose_best_ds_for_read(hdr->lseg,
					hdr->pgio_mirror_idx + 1,
					&hdr->pgio_mirror_idx))
			goto out_eagain;
		ff_layout_read_record_layoutstats_done(task, hdr);
		pnfs_read_resend_pnfs(hdr);
		set_bit(NFS_IOHDR_RESEND_PNFS, &hdr->flags);
		return task->tk_status;
	case -NFS4ERR_RESET_TO_MDS:
		ff_layout_reset_read(hdr);
		set_bit(NFS_IOHDR_RESEND_MDS, &hdr->flags);
		return task->tk_status;
	case -EAGAIN:
		goto out_eagain;
@@ -1403,6 +1404,10 @@ static void ff_layout_read_release(void *data)
	struct nfs_pgio_header *hdr = data;

	ff_layout_read_record_layoutstats_done(&hdr->task, hdr);
	if (test_bit(NFS_IOHDR_RESEND_PNFS, &hdr->flags))
		pnfs_read_resend_pnfs(hdr);
	else if (test_bit(NFS_IOHDR_RESEND_MDS, &hdr->flags))
		ff_layout_reset_read(hdr);
	pnfs_generic_rw_release(data);
}

+2 −0
Original line number Diff line number Diff line
@@ -1438,6 +1438,8 @@ enum {
	NFS_IOHDR_EOF,
	NFS_IOHDR_REDO,
	NFS_IOHDR_STAT,
	NFS_IOHDR_RESEND_PNFS,
	NFS_IOHDR_RESEND_MDS,
};

struct nfs_io_completion;