Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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>

authored by

Jonathan Curley and committed by
Anna Schumaker
06d157d6 8a8729db

+30 -12
+30 -12
fs/nfs/flexfilelayout/flexfilelayout.c
··· 605 605 _ff_layout_free_lseg(fls); 606 606 } 607 607 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 + 608 616 static u32 calc_mirror_idx_from_commit(struct pnfs_layout_segment *lseg, 609 617 u32 commit_index) 610 618 { ··· 1017 1009 struct nfs4_ff_layout_mirror *mirror; 1018 1010 struct nfs_pgio_mirror *pgm; 1019 1011 struct nfs4_pnfs_ds *ds; 1020 - u32 i; 1012 + u32 i, dss_id; 1021 1013 1022 1014 retry: 1023 1015 pnfs_generic_pg_check_layout(pgio, req); ··· 1042 1034 1043 1035 for (i = 0; i < pgio->pg_mirror_count; i++) { 1044 1036 mirror = FF_LAYOUT_COMP(pgio->pg_lseg, i); 1045 - ds = nfs4_ff_layout_prepare_ds(pgio->pg_lseg, mirror, 0, true); 1037 + dss_id = nfs4_ff_layout_calc_dss_id( 1038 + FF_LAYOUT_LSEG(pgio->pg_lseg)->stripe_unit, 1039 + mirror->dss_count, 1040 + req_offset(req)); 1041 + ds = nfs4_ff_layout_prepare_ds(pgio->pg_lseg, mirror, 1042 + dss_id, true); 1046 1043 if (IS_ERR(ds)) { 1047 1044 if (!ff_layout_no_fallback_to_mds(pgio->pg_lseg)) 1048 1045 goto out_mds; ··· 1057 1044 goto retry; 1058 1045 } 1059 1046 pgm = &pgio->pg_mirrors[i]; 1060 - pgm->pg_bsize = mirror->dss[0].mirror_ds->ds_versions[0].wsize; 1047 + pgm->pg_bsize = mirror->dss[dss_id].mirror_ds->ds_versions[0].wsize; 1061 1048 } 1062 1049 1063 1050 if (NFS_SERVER(pgio->pg_inode)->flags & ··· 1130 1117 1131 1118 static const struct nfs_pageio_ops ff_layout_pg_write_ops = { 1132 1119 .pg_init = ff_layout_pg_init_write, 1133 - .pg_test = pnfs_generic_pg_test, 1120 + .pg_test = ff_layout_pg_test, 1134 1121 .pg_doio = pnfs_generic_pg_writepages, 1135 1122 .pg_get_mirror_count = ff_layout_pg_get_mirror_count_write, 1136 1123 .pg_cleanup = pnfs_generic_pg_cleanup, ··· 2064 2051 int vers; 2065 2052 struct nfs_fh *fh; 2066 2053 u32 idx = hdr->pgio_mirror_idx; 2054 + u32 dss_id; 2067 2055 bool ds_fatal_error = false; 2068 2056 2069 2057 mirror = FF_LAYOUT_COMP(lseg, idx); 2070 - ds = nfs4_ff_layout_prepare_ds(lseg, mirror, 0, true); 2058 + dss_id = nfs4_ff_layout_calc_dss_id( 2059 + FF_LAYOUT_LSEG(lseg)->stripe_unit, 2060 + mirror->dss_count, 2061 + offset); 2062 + ds = nfs4_ff_layout_prepare_ds(lseg, mirror, dss_id, true); 2071 2063 if (IS_ERR(ds)) { 2072 2064 ds_fatal_error = nfs_error_is_fatal(PTR_ERR(ds)); 2073 2065 goto out_failed; 2074 2066 } 2075 2067 2076 2068 ds_clnt = nfs4_ff_find_or_create_ds_client(mirror, ds->ds_clp, 2077 - hdr->inode, 0); 2069 + hdr->inode, dss_id); 2078 2070 if (IS_ERR(ds_clnt)) 2079 2071 goto out_failed; 2080 2072 2081 - ds_cred = ff_layout_get_ds_cred(mirror, &lseg->pls_range, hdr->cred, 0); 2073 + ds_cred = ff_layout_get_ds_cred(mirror, &lseg->pls_range, hdr->cred, dss_id); 2082 2074 if (!ds_cred) 2083 2075 goto out_failed; 2084 2076 2085 - vers = nfs4_ff_layout_ds_version(mirror, 0); 2077 + vers = nfs4_ff_layout_ds_version(mirror, dss_id); 2086 2078 2087 2079 dprintk("%s ino %lu sync %d req %zu@%llu DS: %s cl_count %d vers %d\n", 2088 2080 __func__, hdr->inode->i_ino, sync, (size_t) hdr->args.count, ··· 2097 2079 hdr->pgio_done_cb = ff_layout_write_done_cb; 2098 2080 refcount_inc(&ds->ds_clp->cl_count); 2099 2081 hdr->ds_clp = ds->ds_clp; 2100 - hdr->ds_commit_idx = idx; 2101 - fh = nfs4_ff_layout_select_ds_fh(mirror, 0); 2082 + hdr->ds_commit_idx = calc_commit_idx(lseg, idx, dss_id); 2083 + fh = nfs4_ff_layout_select_ds_fh(mirror, dss_id); 2102 2084 if (fh) 2103 2085 hdr->args.fh = fh; 2104 2086 2105 - nfs4_ff_layout_select_ds_stateid(mirror, 0, &hdr->args.stateid); 2087 + nfs4_ff_layout_select_ds_stateid(mirror, dss_id, &hdr->args.stateid); 2106 2088 2107 2089 /* 2108 2090 * Note that if we ever decide to split across DSes, ··· 2111 2093 hdr->args.offset = offset; 2112 2094 2113 2095 /* Start IO accounting for local write */ 2114 - localio = ff_local_open_fh(lseg, idx, 0, ds->ds_clp, ds_cred, fh, 2096 + localio = ff_local_open_fh(lseg, idx, dss_id, ds->ds_clp, ds_cred, fh, 2115 2097 FMODE_READ|FMODE_WRITE); 2116 2098 if (localio) { 2117 2099 hdr->task.tk_start = ktime_get();