Skip to content

Commit 2851150

Browse files
author
Trond Myklebust
committed
NFS/pnfs: Fix the error path in pnfs_layoutreturn_retry_later_locked()
If there isn't a valid layout, or the layout stateid has changed, the cleanup after a layout return should clear out the old data. Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
1 parent 6d6d7f9 commit 2851150

File tree

1 file changed

+13
-17
lines changed

1 file changed

+13
-17
lines changed

fs/nfs/pnfs.c

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1254,33 +1254,28 @@ static void pnfs_clear_layoutcommit(struct inode *inode,
12541254
static void
12551255
pnfs_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

12741268
void 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

12861281
void 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

Comments
 (0)