@@ -1254,33 +1254,28 @@ static void pnfs_clear_layoutcommit(struct inode *inode,
12541254static void
12551255pnfs_layoutreturn_retry_later_locked (struct pnfs_layout_hdr * lo ,
12561256 const nfs4_stateid * arg_stateid ,
1257- const struct pnfs_layout_range * range )
1257+ const struct pnfs_layout_range * range ,
1258+ struct list_head * freeme )
12581259{
1259- const struct pnfs_layout_segment * lseg ;
1260- u32 seq = be32_to_cpu (arg_stateid -> seqid );
1261-
12621260 if (pnfs_layout_is_valid (lo ) &&
1263- nfs4_stateid_match_other (& lo -> plh_stateid , arg_stateid )) {
1264- list_for_each_entry (lseg , & lo -> plh_return_segs , pls_list ) {
1265- if (pnfs_seqid_is_newer (lseg -> pls_seq , seq ) ||
1266- !pnfs_should_free_range (& lseg -> pls_range , range ))
1267- continue ;
1268- pnfs_set_plh_return_info (lo , range -> iomode , seq );
1269- break ;
1270- }
1271- }
1261+ nfs4_stateid_match_other (& lo -> plh_stateid , arg_stateid ))
1262+ pnfs_reset_return_info (lo );
1263+ else
1264+ pnfs_mark_layout_stateid_invalid (lo , freeme );
1265+ pnfs_clear_layoutreturn_waitbit (lo );
12721266}
12731267
12741268void pnfs_layoutreturn_retry_later (struct pnfs_layout_hdr * lo ,
12751269 const nfs4_stateid * arg_stateid ,
12761270 const struct pnfs_layout_range * range )
12771271{
12781272 struct inode * inode = lo -> plh_inode ;
1273+ LIST_HEAD (freeme );
12791274
12801275 spin_lock (& inode -> i_lock );
1281- pnfs_layoutreturn_retry_later_locked (lo , arg_stateid , range );
1282- pnfs_clear_layoutreturn_waitbit (lo );
1276+ pnfs_layoutreturn_retry_later_locked (lo , arg_stateid , range , & freeme );
12831277 spin_unlock (& inode -> i_lock );
1278+ pnfs_free_lseg_list (& freeme );
12841279}
12851280
12861281void pnfs_layoutreturn_free_lsegs (struct pnfs_layout_hdr * lo ,
@@ -1716,6 +1711,7 @@ void pnfs_roc_release(struct nfs4_layoutreturn_args *args,
17161711 struct inode * inode = args -> inode ;
17171712 const nfs4_stateid * res_stateid = NULL ;
17181713 struct nfs4_xdr_opaque_data * ld_private = args -> ld_private ;
1714+ LIST_HEAD (freeme );
17191715
17201716 switch (ret ) {
17211717 case - NFS4ERR_BADSESSION :
@@ -1724,9 +1720,9 @@ void pnfs_roc_release(struct nfs4_layoutreturn_args *args,
17241720 case - NFS4ERR_NOMATCHING_LAYOUT :
17251721 spin_lock (& inode -> i_lock );
17261722 pnfs_layoutreturn_retry_later_locked (lo , & args -> stateid ,
1727- & args -> range );
1728- pnfs_clear_layoutreturn_waitbit (lo );
1723+ & args -> range , & freeme );
17291724 spin_unlock (& inode -> i_lock );
1725+ pnfs_free_lseg_list (& freeme );
17301726 break ;
17311727 case 0 :
17321728 if (res -> lrs_present )
0 commit comments