Skip to content

Commit 06d157d

Browse files
Jonathan CurleyAnna Schumaker
authored andcommitted
NFSv4/flexfiles: Write path updates for striped layouts
Updates write path to calculate and use dss_id to direct IO to the appropriate stripe DS. Signed-off-by: Jonathan Curley <jcurley@purestorage.com> Signed-off-by: Anna Schumaker <anna.schumaker@oracle.com>
1 parent 8a8729d commit 06d157d

1 file changed

Lines changed: 30 additions & 12 deletions

File tree

fs/nfs/flexfilelayout/flexfilelayout.c

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -605,6 +605,14 @@ ff_layout_free_lseg(struct pnfs_layout_segment *lseg)
605605
_ff_layout_free_lseg(fls);
606606
}
607607

608+
static u32 calc_commit_idx(struct pnfs_layout_segment *lseg,
609+
u32 mirror_idx, u32 dss_id)
610+
{
611+
struct nfs4_ff_layout_segment *flseg = FF_LAYOUT_LSEG(lseg);
612+
613+
return (mirror_idx * flseg->mirror_array[0]->dss_count) + dss_id;
614+
}
615+
608616
static u32 calc_mirror_idx_from_commit(struct pnfs_layout_segment *lseg,
609617
u32 commit_index)
610618
{
@@ -1009,7 +1017,7 @@ ff_layout_pg_init_write(struct nfs_pageio_descriptor *pgio,
10091017
struct nfs4_ff_layout_mirror *mirror;
10101018
struct nfs_pgio_mirror *pgm;
10111019
struct nfs4_pnfs_ds *ds;
1012-
u32 i;
1020+
u32 i, dss_id;
10131021

10141022
retry:
10151023
pnfs_generic_pg_check_layout(pgio, req);
@@ -1034,7 +1042,12 @@ ff_layout_pg_init_write(struct nfs_pageio_descriptor *pgio,
10341042

10351043
for (i = 0; i < pgio->pg_mirror_count; i++) {
10361044
mirror = FF_LAYOUT_COMP(pgio->pg_lseg, i);
1037-
ds = nfs4_ff_layout_prepare_ds(pgio->pg_lseg, mirror, 0, true);
1045+
dss_id = nfs4_ff_layout_calc_dss_id(
1046+
FF_LAYOUT_LSEG(pgio->pg_lseg)->stripe_unit,
1047+
mirror->dss_count,
1048+
req_offset(req));
1049+
ds = nfs4_ff_layout_prepare_ds(pgio->pg_lseg, mirror,
1050+
dss_id, true);
10381051
if (IS_ERR(ds)) {
10391052
if (!ff_layout_no_fallback_to_mds(pgio->pg_lseg))
10401053
goto out_mds;
@@ -1044,7 +1057,7 @@ ff_layout_pg_init_write(struct nfs_pageio_descriptor *pgio,
10441057
goto retry;
10451058
}
10461059
pgm = &pgio->pg_mirrors[i];
1047-
pgm->pg_bsize = mirror->dss[0].mirror_ds->ds_versions[0].wsize;
1060+
pgm->pg_bsize = mirror->dss[dss_id].mirror_ds->ds_versions[0].wsize;
10481061
}
10491062

10501063
if (NFS_SERVER(pgio->pg_inode)->flags &
@@ -1117,7 +1130,7 @@ static const struct nfs_pageio_ops ff_layout_pg_read_ops = {
11171130

11181131
static const struct nfs_pageio_ops ff_layout_pg_write_ops = {
11191132
.pg_init = ff_layout_pg_init_write,
1120-
.pg_test = pnfs_generic_pg_test,
1133+
.pg_test = ff_layout_pg_test,
11211134
.pg_doio = pnfs_generic_pg_writepages,
11221135
.pg_get_mirror_count = ff_layout_pg_get_mirror_count_write,
11231136
.pg_cleanup = pnfs_generic_pg_cleanup,
@@ -2051,25 +2064,30 @@ ff_layout_write_pagelist(struct nfs_pgio_header *hdr, int sync)
20512064
int vers;
20522065
struct nfs_fh *fh;
20532066
u32 idx = hdr->pgio_mirror_idx;
2067+
u32 dss_id;
20542068
bool ds_fatal_error = false;
20552069

20562070
mirror = FF_LAYOUT_COMP(lseg, idx);
2057-
ds = nfs4_ff_layout_prepare_ds(lseg, mirror, 0, true);
2071+
dss_id = nfs4_ff_layout_calc_dss_id(
2072+
FF_LAYOUT_LSEG(lseg)->stripe_unit,
2073+
mirror->dss_count,
2074+
offset);
2075+
ds = nfs4_ff_layout_prepare_ds(lseg, mirror, dss_id, true);
20582076
if (IS_ERR(ds)) {
20592077
ds_fatal_error = nfs_error_is_fatal(PTR_ERR(ds));
20602078
goto out_failed;
20612079
}
20622080

20632081
ds_clnt = nfs4_ff_find_or_create_ds_client(mirror, ds->ds_clp,
2064-
hdr->inode, 0);
2082+
hdr->inode, dss_id);
20652083
if (IS_ERR(ds_clnt))
20662084
goto out_failed;
20672085

2068-
ds_cred = ff_layout_get_ds_cred(mirror, &lseg->pls_range, hdr->cred, 0);
2086+
ds_cred = ff_layout_get_ds_cred(mirror, &lseg->pls_range, hdr->cred, dss_id);
20692087
if (!ds_cred)
20702088
goto out_failed;
20712089

2072-
vers = nfs4_ff_layout_ds_version(mirror, 0);
2090+
vers = nfs4_ff_layout_ds_version(mirror, dss_id);
20732091

20742092
dprintk("%s ino %lu sync %d req %zu@%llu DS: %s cl_count %d vers %d\n",
20752093
__func__, hdr->inode->i_ino, sync, (size_t) hdr->args.count,
@@ -2079,12 +2097,12 @@ ff_layout_write_pagelist(struct nfs_pgio_header *hdr, int sync)
20792097
hdr->pgio_done_cb = ff_layout_write_done_cb;
20802098
refcount_inc(&ds->ds_clp->cl_count);
20812099
hdr->ds_clp = ds->ds_clp;
2082-
hdr->ds_commit_idx = idx;
2083-
fh = nfs4_ff_layout_select_ds_fh(mirror, 0);
2100+
hdr->ds_commit_idx = calc_commit_idx(lseg, idx, dss_id);
2101+
fh = nfs4_ff_layout_select_ds_fh(mirror, dss_id);
20842102
if (fh)
20852103
hdr->args.fh = fh;
20862104

2087-
nfs4_ff_layout_select_ds_stateid(mirror, 0, &hdr->args.stateid);
2105+
nfs4_ff_layout_select_ds_stateid(mirror, dss_id, &hdr->args.stateid);
20882106

20892107
/*
20902108
* Note that if we ever decide to split across DSes,
@@ -2093,7 +2111,7 @@ ff_layout_write_pagelist(struct nfs_pgio_header *hdr, int sync)
20932111
hdr->args.offset = offset;
20942112

20952113
/* Start IO accounting for local write */
2096-
localio = ff_local_open_fh(lseg, idx, 0, ds->ds_clp, ds_cred, fh,
2114+
localio = ff_local_open_fh(lseg, idx, dss_id, ds->ds_clp, ds_cred, fh,
20972115
FMODE_READ|FMODE_WRITE);
20982116
if (localio) {
20992117
hdr->task.tk_start = ktime_get();

0 commit comments

Comments
 (0)