@@ -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+
608620static void
609621nfs4_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-
21132120static 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
21242131static 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