@@ -1254,33 +1254,28 @@ static void pnfs_clear_layoutcommit(struct inode *inode,
1254
1254
static void
1255
1255
pnfs_layoutreturn_retry_later_locked (struct pnfs_layout_hdr * lo ,
1256
1256
const nfs4_stateid * arg_stateid ,
1257
- const struct pnfs_layout_range * range )
1257
+ const struct pnfs_layout_range * range ,
1258
+ struct list_head * freeme )
1258
1259
{
1259
- const struct pnfs_layout_segment * lseg ;
1260
- u32 seq = be32_to_cpu (arg_stateid -> seqid );
1261
-
1262
1260
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 );
1272
1266
}
1273
1267
1274
1268
void pnfs_layoutreturn_retry_later (struct pnfs_layout_hdr * lo ,
1275
1269
const nfs4_stateid * arg_stateid ,
1276
1270
const struct pnfs_layout_range * range )
1277
1271
{
1278
1272
struct inode * inode = lo -> plh_inode ;
1273
+ LIST_HEAD (freeme );
1279
1274
1280
1275
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 );
1283
1277
spin_unlock (& inode -> i_lock );
1278
+ pnfs_free_lseg_list (& freeme );
1284
1279
}
1285
1280
1286
1281
void pnfs_layoutreturn_free_lsegs (struct pnfs_layout_hdr * lo ,
@@ -1716,6 +1711,7 @@ void pnfs_roc_release(struct nfs4_layoutreturn_args *args,
1716
1711
struct inode * inode = args -> inode ;
1717
1712
const nfs4_stateid * res_stateid = NULL ;
1718
1713
struct nfs4_xdr_opaque_data * ld_private = args -> ld_private ;
1714
+ LIST_HEAD (freeme );
1719
1715
1720
1716
switch (ret ) {
1721
1717
case - NFS4ERR_BADSESSION :
@@ -1724,9 +1720,9 @@ void pnfs_roc_release(struct nfs4_layoutreturn_args *args,
1724
1720
case - NFS4ERR_NOMATCHING_LAYOUT :
1725
1721
spin_lock (& inode -> i_lock );
1726
1722
pnfs_layoutreturn_retry_later_locked (lo , & args -> stateid ,
1727
- & args -> range );
1728
- pnfs_clear_layoutreturn_waitbit (lo );
1723
+ & args -> range , & freeme );
1729
1724
spin_unlock (& inode -> i_lock );
1725
+ pnfs_free_lseg_list (& freeme );
1730
1726
break ;
1731
1727
case 0 :
1732
1728
if (res -> lrs_present )
0 commit comments