NFS/flexfiles: refactor calls to fs4_ff_layout_prepare_ds()
While we may want to skip attempting to connect to a downed mirror when we're deciding which mirror to select for a read, we do not want to do so once we've committed to attempting the I/O in ff_layout_read/write_pagelist(), or ff_layout_initiate_commit() Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
This commit is contained in:
@@ -794,6 +794,7 @@ ff_layout_choose_best_ds_for_read(struct pnfs_layout_segment *lseg,
|
||||
int *best_idx)
|
||||
{
|
||||
struct nfs4_ff_layout_segment *fls = FF_LAYOUT_LSEG(lseg);
|
||||
struct nfs4_ff_layout_mirror *mirror;
|
||||
struct nfs4_pnfs_ds *ds;
|
||||
bool fail_return = false;
|
||||
int idx;
|
||||
@@ -802,7 +803,12 @@ ff_layout_choose_best_ds_for_read(struct pnfs_layout_segment *lseg,
|
||||
for (idx = start_idx; idx < fls->mirror_array_cnt; idx++) {
|
||||
if (idx+1 == fls->mirror_array_cnt)
|
||||
fail_return = true;
|
||||
ds = nfs4_ff_layout_prepare_ds(lseg, idx, fail_return);
|
||||
|
||||
mirror = FF_LAYOUT_COMP(lseg, idx);
|
||||
if (ff_layout_test_devid_unavailable(&mirror->mirror_ds->id_node))
|
||||
continue;
|
||||
|
||||
ds = nfs4_ff_layout_prepare_ds(lseg, mirror, fail_return);
|
||||
if (ds) {
|
||||
*best_idx = idx;
|
||||
return ds;
|
||||
@@ -925,7 +931,10 @@ retry:
|
||||
goto out_mds;
|
||||
|
||||
for (i = 0; i < pgio->pg_mirror_count; i++) {
|
||||
ds = nfs4_ff_layout_prepare_ds(pgio->pg_lseg, i, true);
|
||||
mirror = FF_LAYOUT_COMP(pgio->pg_lseg, i);
|
||||
if (ff_layout_test_devid_unavailable(&mirror->mirror_ds->id_node))
|
||||
continue;
|
||||
ds = nfs4_ff_layout_prepare_ds(pgio->pg_lseg, mirror, true);
|
||||
if (!ds) {
|
||||
if (!ff_layout_no_fallback_to_mds(pgio->pg_lseg))
|
||||
goto out_mds;
|
||||
@@ -936,7 +945,6 @@ retry:
|
||||
goto retry;
|
||||
}
|
||||
pgm = &pgio->pg_mirrors[i];
|
||||
mirror = FF_LAYOUT_COMP(pgio->pg_lseg, i);
|
||||
pgm->pg_bsize = mirror->mirror_ds->ds_versions[0].wsize;
|
||||
}
|
||||
|
||||
@@ -1724,6 +1732,7 @@ ff_layout_read_pagelist(struct nfs_pgio_header *hdr)
|
||||
struct pnfs_layout_segment *lseg = hdr->lseg;
|
||||
struct nfs4_pnfs_ds *ds;
|
||||
struct rpc_clnt *ds_clnt;
|
||||
struct nfs4_ff_layout_mirror *mirror;
|
||||
const struct cred *ds_cred;
|
||||
loff_t offset = hdr->args.offset;
|
||||
u32 idx = hdr->pgio_mirror_idx;
|
||||
@@ -1734,7 +1743,8 @@ ff_layout_read_pagelist(struct nfs_pgio_header *hdr)
|
||||
__func__, hdr->inode->i_ino,
|
||||
hdr->args.pgbase, (size_t)hdr->args.count, offset);
|
||||
|
||||
ds = nfs4_ff_layout_prepare_ds(lseg, idx, false);
|
||||
mirror = FF_LAYOUT_COMP(lseg, idx);
|
||||
ds = nfs4_ff_layout_prepare_ds(lseg, mirror, false);
|
||||
if (!ds)
|
||||
goto out_failed;
|
||||
|
||||
@@ -1791,13 +1801,15 @@ ff_layout_write_pagelist(struct nfs_pgio_header *hdr, int sync)
|
||||
struct pnfs_layout_segment *lseg = hdr->lseg;
|
||||
struct nfs4_pnfs_ds *ds;
|
||||
struct rpc_clnt *ds_clnt;
|
||||
struct nfs4_ff_layout_mirror *mirror;
|
||||
const struct cred *ds_cred;
|
||||
loff_t offset = hdr->args.offset;
|
||||
int vers;
|
||||
struct nfs_fh *fh;
|
||||
int idx = hdr->pgio_mirror_idx;
|
||||
|
||||
ds = nfs4_ff_layout_prepare_ds(lseg, idx, true);
|
||||
mirror = FF_LAYOUT_COMP(lseg, idx);
|
||||
ds = nfs4_ff_layout_prepare_ds(lseg, mirror, true);
|
||||
if (!ds)
|
||||
goto out_failed;
|
||||
|
||||
@@ -1870,6 +1882,7 @@ static int ff_layout_initiate_commit(struct nfs_commit_data *data, int how)
|
||||
struct pnfs_layout_segment *lseg = data->lseg;
|
||||
struct nfs4_pnfs_ds *ds;
|
||||
struct rpc_clnt *ds_clnt;
|
||||
struct nfs4_ff_layout_mirror *mirror;
|
||||
const struct cred *ds_cred;
|
||||
u32 idx;
|
||||
int vers, ret;
|
||||
@@ -1880,7 +1893,8 @@ static int ff_layout_initiate_commit(struct nfs_commit_data *data, int how)
|
||||
goto out_err;
|
||||
|
||||
idx = calc_ds_index_from_commit(lseg, data->ds_commit_index);
|
||||
ds = nfs4_ff_layout_prepare_ds(lseg, idx, true);
|
||||
mirror = FF_LAYOUT_COMP(lseg, idx);
|
||||
ds = nfs4_ff_layout_prepare_ds(lseg, mirror, true);
|
||||
if (!ds)
|
||||
goto out_err;
|
||||
|
||||
|
Reference in New Issue
Block a user