Skip to content

Commit 8a8729d

Browse files
Jonathan CurleyAnna Schumaker
authored andcommitted
NFSv4/flexfiles: Commit path updates for striped layouts
Updates the commit path to be stripe aware. This required updating the ds_commit_idx to be stripe aware. ds_commit_idx == mirror_idx * dss_count + dss_id. Updates code paths to utilize the new ds_commit_idx and derive dss_id & mirror_idx where appropriate to contact the correct DS using the corresponding parameters. Signed-off-by: Jonathan Curley <jcurley@purestorage.com> Signed-off-by: Anna Schumaker <anna.schumaker@oracle.com>
1 parent 4934ccb commit 8a8729d

1 file changed

Lines changed: 25 additions & 16 deletions

File tree

fs/nfs/flexfilelayout/flexfilelayout.c

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

608+
static u32 calc_mirror_idx_from_commit(struct pnfs_layout_segment *lseg,
609+
u32 commit_index)
610+
{
611+
return commit_index / FF_LAYOUT_LSEG(lseg)->mirror_array[0]->dss_count;
612+
}
613+
614+
static u32 calc_dss_id_from_commit(struct pnfs_layout_segment *lseg,
615+
u32 commit_index)
616+
{
617+
return commit_index % FF_LAYOUT_LSEG(lseg)->mirror_array[0]->dss_count;
618+
}
619+
608620
static void
609621
nfs4_ff_start_busy_timer(struct nfs4_ff_busy_timer *timer, ktime_t now)
610622
{
@@ -2105,20 +2117,15 @@ ff_layout_write_pagelist(struct nfs_pgio_header *hdr, int sync)
21052117
return PNFS_NOT_ATTEMPTED;
21062118
}
21072119

2108-
static u32 calc_ds_index_from_commit(struct pnfs_layout_segment *lseg, u32 i)
2109-
{
2110-
return i;
2111-
}
2112-
21132120
static struct nfs_fh *
2114-
select_ds_fh_from_commit(struct pnfs_layout_segment *lseg, u32 i)
2121+
select_ds_fh_from_commit(struct pnfs_layout_segment *lseg, u32 i, u32 dss_id)
21152122
{
21162123
struct nfs4_ff_layout_segment *flseg = FF_LAYOUT_LSEG(lseg);
21172124

21182125
/* FIXME: Assume that there is only one NFS version available
21192126
* for the DS.
21202127
*/
2121-
return &flseg->mirror_array[i]->dss[0].fh_versions[0];
2128+
return &flseg->mirror_array[i]->dss[dss_id].fh_versions[0];
21222129
}
21232130

21242131
static int ff_layout_initiate_commit(struct nfs_commit_data *data, int how)
@@ -2129,30 +2136,31 @@ static int ff_layout_initiate_commit(struct nfs_commit_data *data, int how)
21292136
struct nfsd_file *localio;
21302137
struct nfs4_ff_layout_mirror *mirror;
21312138
const struct cred *ds_cred;
2132-
u32 idx;
2139+
u32 idx, dss_id;
21332140
int vers, ret;
21342141
struct nfs_fh *fh;
21352142

21362143
if (!lseg || !(pnfs_is_valid_lseg(lseg) ||
21372144
test_bit(NFS_LSEG_LAYOUTRETURN, &lseg->pls_flags)))
21382145
goto out_err;
21392146

2140-
idx = calc_ds_index_from_commit(lseg, data->ds_commit_index);
2147+
idx = calc_mirror_idx_from_commit(lseg, data->ds_commit_index);
21412148
mirror = FF_LAYOUT_COMP(lseg, idx);
2142-
ds = nfs4_ff_layout_prepare_ds(lseg, mirror, 0, true);
2149+
dss_id = calc_dss_id_from_commit(lseg, data->ds_commit_index);
2150+
ds = nfs4_ff_layout_prepare_ds(lseg, mirror, dss_id, true);
21432151
if (IS_ERR(ds))
21442152
goto out_err;
21452153

21462154
ds_clnt = nfs4_ff_find_or_create_ds_client(mirror, ds->ds_clp,
2147-
data->inode, 0);
2155+
data->inode, dss_id);
21482156
if (IS_ERR(ds_clnt))
21492157
goto out_err;
21502158

2151-
ds_cred = ff_layout_get_ds_cred(mirror, &lseg->pls_range, data->cred, 0);
2159+
ds_cred = ff_layout_get_ds_cred(mirror, &lseg->pls_range, data->cred, dss_id);
21522160
if (!ds_cred)
21532161
goto out_err;
21542162

2155-
vers = nfs4_ff_layout_ds_version(mirror, 0);
2163+
vers = nfs4_ff_layout_ds_version(mirror, dss_id);
21562164

21572165
dprintk("%s ino %lu, how %d cl_count %d vers %d\n", __func__,
21582166
data->inode->i_ino, how, refcount_read(&ds->ds_clp->cl_count),
@@ -2161,12 +2169,12 @@ static int ff_layout_initiate_commit(struct nfs_commit_data *data, int how)
21612169
data->cred = ds_cred;
21622170
refcount_inc(&ds->ds_clp->cl_count);
21632171
data->ds_clp = ds->ds_clp;
2164-
fh = select_ds_fh_from_commit(lseg, data->ds_commit_index);
2172+
fh = select_ds_fh_from_commit(lseg, idx, dss_id);
21652173
if (fh)
21662174
data->args.fh = fh;
21672175

21682176
/* Start IO accounting for local commit */
2169-
localio = ff_local_open_fh(lseg, idx, 0, ds->ds_clp, ds_cred, fh,
2177+
localio = ff_local_open_fh(lseg, idx, dss_id, ds->ds_clp, ds_cred, fh,
21702178
FMODE_READ|FMODE_WRITE);
21712179
if (localio) {
21722180
data->task.tk_start = ktime_get();
@@ -2270,8 +2278,9 @@ ff_layout_setup_ds_info(struct pnfs_ds_commit_info *fl_cinfo,
22702278
struct nfs4_ff_layout_segment *flseg = FF_LAYOUT_LSEG(lseg);
22712279
struct inode *inode = lseg->pls_layout->plh_inode;
22722280
struct pnfs_commit_array *array, *new;
2281+
u32 size = flseg->mirror_array_cnt * flseg->mirror_array[0]->dss_count;
22732282

2274-
new = pnfs_alloc_commit_array(flseg->mirror_array_cnt,
2283+
new = pnfs_alloc_commit_array(size,
22752284
nfs_io_gfp_mask());
22762285
if (new) {
22772286
spin_lock(&inode->i_lock);

0 commit comments

Comments
 (0)