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

Commit 446ca219 authored by Tom Haynes's avatar Tom Haynes Committed by Anna Schumaker
Browse files

pNFS/flexfiles: When initing reads or writes, we might have to retry connecting to DSes



If we are initializing reads or writes and can not connect to a DS, then
check whether or not IO is allowed through the MDS. If it is allowed,
reset to the MDS. Else, fail the layout segment and force a retry
of a new layout segment.

Signed-off-by: default avatarTom Haynes <loghyr@primarydata.com>
Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
parent 3b13b4b3
Loading
Loading
Loading
Loading
+25 −4
Original line number Diff line number Diff line
@@ -848,8 +848,13 @@ ff_layout_pg_init_read(struct nfs_pageio_descriptor *pgio,
		goto out_mds;

	ds = ff_layout_choose_best_ds_for_read(pgio->pg_lseg, 0, &ds_idx);
	if (!ds)
	if (!ds) {
		if (ff_layout_no_fallback_to_mds(pgio->pg_lseg))
			goto out_pnfs;
		else
			goto out_mds;
	}

	mirror = FF_LAYOUT_COMP(pgio->pg_lseg, ds_idx);

	pgio->pg_mirror_idx = ds_idx;
@@ -863,6 +868,12 @@ ff_layout_pg_init_read(struct nfs_pageio_descriptor *pgio,
	pnfs_put_lseg(pgio->pg_lseg);
	pgio->pg_lseg = NULL;
	nfs_pageio_reset_read_mds(pgio);
	return;

out_pnfs:
	pnfs_set_lo_fail(pgio->pg_lseg);
	pnfs_put_lseg(pgio->pg_lseg);
	pgio->pg_lseg = NULL;
}

static void
@@ -905,8 +916,12 @@ ff_layout_pg_init_write(struct nfs_pageio_descriptor *pgio,

	for (i = 0; i < pgio->pg_mirror_count; i++) {
		ds = nfs4_ff_layout_prepare_ds(pgio->pg_lseg, i, true);
		if (!ds)
		if (!ds) {
			if (ff_layout_no_fallback_to_mds(pgio->pg_lseg))
				goto out_pnfs;
			else
				goto out_mds;
		}
		pgm = &pgio->pg_mirrors[i];
		mirror = FF_LAYOUT_COMP(pgio->pg_lseg, i);
		pgm->pg_bsize = mirror->mirror_ds->ds_versions[0].wsize;
@@ -918,6 +933,12 @@ ff_layout_pg_init_write(struct nfs_pageio_descriptor *pgio,
	pnfs_put_lseg(pgio->pg_lseg);
	pgio->pg_lseg = NULL;
	nfs_pageio_reset_write_mds(pgio);
	return;

out_pnfs:
	pnfs_set_lo_fail(pgio->pg_lseg);
	pnfs_put_lseg(pgio->pg_lseg);
	pgio->pg_lseg = NULL;
}

static unsigned int