Hi Tigran, On Mon, 2018-11-12 at 14:59 +0100, Tigran Mkrtchyan wrote: > rfc8435 says: > > For tight coupling, ffds_stateid provides the stateid to be used by > the client to access the file. > > However current implementation replaces per-mirror provided stateid > with > by open or lock stateid. > > Ensure that per-mirror stateid is used by ff_layout_write_prepare_v4 > and > nfs4_ff_layout_prepare_ds. > > Signed-off-by: Tigran Mkrtchyan <tigran.mkrtchyan@xxxxxxx> > Signed-off-by: Rick Macklem <rmacklem@xxxxxxxxxxx> > --- > fs/nfs/flexfilelayout/flexfilelayout.c | 21 +++++++++++++-------- > fs/nfs/flexfilelayout/flexfilelayout.h | 2 ++ > fs/nfs/flexfilelayout/flexfilelayoutdev.c | 17 +++++++++++++++++ > 3 files changed, 32 insertions(+), 8 deletions(-) > > diff --git a/fs/nfs/flexfilelayout/flexfilelayout.c > b/fs/nfs/flexfilelayout/flexfilelayout.c > index 86bcba40ca61..4c7f042db9c4 100644 > --- a/fs/nfs/flexfilelayout/flexfilelayout.c > +++ b/fs/nfs/flexfilelayout/flexfilelayout.c > @@ -1363,10 +1363,6 @@ static void ff_layout_read_prepare_v4(struct > rpc_task *task, void *data) > > if (ff_layout_read_prepare_common(task, hdr)) > return; > - > - if (nfs4_set_rw_stateid(&hdr->args.stateid, hdr->args.context, > - hdr->args.lock_context, FMODE_READ) == -EIO) > - rpc_exit(task, -EIO); /* lost lock, terminate I/O */ > } > > static void ff_layout_read_call_done(struct rpc_task *task, void > *data) > @@ -1544,10 +1540,6 @@ static void ff_layout_write_prepare_v4(struct > rpc_task *task, void *data) > > if (ff_layout_write_prepare_common(task, hdr)) > return; > - > - if (nfs4_set_rw_stateid(&hdr->args.stateid, hdr->args.context, > - hdr->args.lock_context, FMODE_WRITE) == -EIO) > - rpc_exit(task, -EIO); /* lost lock, terminate I/O */ > } > > static void ff_layout_write_call_done(struct rpc_task *task, void > *data) > @@ -1713,6 +1705,7 @@ ff_layout_read_pagelist(struct nfs_pgio_header > *hdr) > u32 idx = hdr->pgio_mirror_idx; > int vers; > struct nfs_fh *fh; > + nfs4_stateid *stateid; > > dprintk("--> %s ino %lu pgbase %u req %zu@%llu\n", > __func__, hdr->inode->i_ino, > @@ -1742,6 +1735,12 @@ ff_layout_read_pagelist(struct nfs_pgio_header > *hdr) > fh = nfs4_ff_layout_select_ds_fh(lseg, idx); > if (fh) > hdr->args.fh = fh; > + > + stateid = nfs4_ff_layout_select_ds_stateid(lseg, idx); > + if (!stateid) > + goto out_failed; > + nfs4_stateid_copy(&hdr->args.stateid, stateid); > + > /* > * Note that if we ever decide to split across DSes, > * then we may need to handle dense-like offsets. > @@ -1774,6 +1773,7 @@ ff_layout_write_pagelist(struct nfs_pgio_header > *hdr, int sync) > loff_t offset = hdr->args.offset; > int vers; > struct nfs_fh *fh; > + nfs4_stateid *stateid; > int idx = hdr->pgio_mirror_idx; > > ds = nfs4_ff_layout_prepare_ds(lseg, idx, true); > @@ -1804,6 +1804,11 @@ ff_layout_write_pagelist(struct > nfs_pgio_header *hdr, int sync) > if (fh) > hdr->args.fh = fh; > > + stateid = nfs4_ff_layout_select_ds_stateid(lseg, idx); > + if (!stateid) > + goto out_failed; > + nfs4_stateid_copy(&hdr->args.stateid, stateid); Since the above 3 lines are repeated for both functions, and also force the stack allocation of a temporary pointer, why not just have the nfs4_ff_layout_select_ds_stateid() copy the stateid? > + > /* > * Note that if we ever decide to split across DSes, > * then we may need to handle dense-like offsets. > diff --git a/fs/nfs/flexfilelayout/flexfilelayout.h > b/fs/nfs/flexfilelayout/flexfilelayout.h > index 411798346e48..fdfbcb471999 100644 > --- a/fs/nfs/flexfilelayout/flexfilelayout.h > +++ b/fs/nfs/flexfilelayout/flexfilelayout.h > @@ -215,6 +215,8 @@ unsigned int ff_layout_fetch_ds_ioerr(struct > pnfs_layout_hdr *lo, > unsigned int maxnum); > struct nfs_fh * > nfs4_ff_layout_select_ds_fh(struct pnfs_layout_segment *lseg, u32 > mirror_idx); > +nfs4_stateid * > +nfs4_ff_layout_select_ds_stateid(struct pnfs_layout_segment *lseg, > u32 mirror_idx); > > struct nfs4_pnfs_ds * > nfs4_ff_layout_prepare_ds(struct pnfs_layout_segment *lseg, u32 > ds_idx, > diff --git a/fs/nfs/flexfilelayout/flexfilelayoutdev.c > b/fs/nfs/flexfilelayout/flexfilelayoutdev.c > index 74d8d5352438..91787cf68057 100644 > --- a/fs/nfs/flexfilelayout/flexfilelayoutdev.c > +++ b/fs/nfs/flexfilelayout/flexfilelayoutdev.c > @@ -370,6 +370,23 @@ nfs4_ff_layout_select_ds_fh(struct > pnfs_layout_segment *lseg, u32 mirror_idx) > return fh; > } > > +nfs4_stateid * > +nfs4_ff_layout_select_ds_stateid(struct pnfs_layout_segment *lseg, > u32 mirror_idx) > +{ > + struct nfs4_ff_layout_mirror *mirror = FF_LAYOUT_COMP(lseg, > mirror_idx); > + nfs4_stateid *stateid = NULL; > + > + if (!ff_layout_mirror_valid(lseg, mirror, false)) { > + pr_err_ratelimited("NFS: %s: No data server for mirror > offset index %d\n", > + __func__, mirror_idx); > + goto out; > + } > + > + stateid = &mirror->stateid; > +out: > + return stateid; > +} > + > /** > * nfs4_ff_layout_prepare_ds - prepare a DS connection for an RPC > call > * @lseg: the layout segment we're operating on -- Trond Myklebust Linux NFS client maintainer, Hammerspace trond.myklebust@xxxxxxxxxxxxxxx