@@ -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+
608616static 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
10141022retry :
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
11181131static 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