Patch "pNFS: Fix LAYOUTGET handling of NFS4ERR_BAD_STATEID and NFS4ERR_EXPIRED" has been added to the 4.7-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
pNFS: Fix LAYOUTGET handling of NFS4ERR_BAD_STATEID and NFS4ERR_EXPIRED
to the 4.7-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
pnfs-fix-layoutget-handling-of-nfs4err_bad_stateid-and-nfs4err_expired.patch
and it can be found in the queue-4.7 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
f7db0b283868411dc6bc8a223fd032b211d2d91fMon Sep 17 00:00:00 2001
From: Trond Myklebust <[email protected]>
Date: Thu, 14 Jul 2016 15:14:02 -0400
Subject: pNFS: Fix LAYOUTGET handling of NFS4ERR_BAD_STATEID and NFS4ERR_EXPIRED
From: Trond Myklebust <[email protected]>
commit f7db0b283868411dc6bc8a223fd032b211d2d91f upstream.
We want to recover the open stateid if there is no layout stateid and/or the stateid argument matches an open stateid. Otherwise throw out the existing layout and recover from scratch, as the layout stateid is bad.
--- fs/nfs/nfs4proc.c | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-)
fs/nfs/nfs4proc.c +14 -18
@@ -7872,6 +7872,7 @@ nfs4_layoutget_handle_exception(struct rstruct pnfs_layout_hdr *lo;int nfs4err = task->tk_status;int err, status =0 ; +LIST_HEAD (head);dprintk ("--> %s tk_status => %d\n" , __func__, -task->tk_status);
@@ -7916,30 +7917,25 @@ nfs4_layoutget_handle_exception(struct rcase -NFS4ERR_BAD_STATEID : exception->timeout =0 ;spin_lock (&inode->i_lock); -if (nfs4_stateid_match (&lgp->args.stateid, + lo =NFS_I (inode)->layout; +/* If the open stateid was bad, then recover it. */ +if (!lo ||test_bit (NFS_LAYOUT_INVALID_STID , &lo->plh_flags) || +nfs4_stateid_match_other (&lgp->args.stateid, &lgp->args.ctx->state->stateid)) {spin_unlock (&inode->i_lock); -/* If the open stateid was bad, then recover it. */ exception->state = lgp->args.ctx->state;break ; } - lo =NFS_I (inode)->layout; -if (lo && !test_bit (NFS_LAYOUT_INVALID_STID , &lo->plh_flags) && -nfs4_stateid_match_other (&lgp->args.stateid, &lo->plh_stateid)) { -LIST_HEAD (head); -/* -* Mark the bad layout state as invalid, then retry -* with the current stateid. -*/ -set_bit (NFS_LAYOUT_INVALID_STID , &lo->plh_flags); -pnfs_mark_matching_lsegs_invalid (lo, &head,NULL ,0 ); -spin_unlock (&inode->i_lock); -pnfs_free_lseg_list (&head); - status = -EAGAIN ; - goto out; - }else -spin_unlock (&inode->i_lock); +/* +* Mark the bad layout state as invalid, then retry +*/ +set_bit (NFS_LAYOUT_INVALID_STID , &lo->plh_flags); +pnfs_mark_matching_lsegs_invalid (lo, &head,NULL ,0 ); +spin_unlock (&inode->i_lock); +pnfs_free_lseg_list (&head); + status = -EAGAIN ; + goto out; } err =nfs4_handle_exception (server, nfs4err, exception);
Patches currently in stable-queue which might be from [email protected] are
queue-4.7/nfs-don-t-create-zero-length-requests.patch queue-4.7/pnfs-separate-handling-of-nfs4err_layouttrylater-and-recallconflict.patch queue-4.7/pnfs-handle-nfs4err_recallconflict-correctly-in-layoutget.patch queue-4.7/pnfs-fix-layoutget-handling-of-nfs4err_bad_stateid-and-nfs4err_expired.patch queue-4.7/pnfs-fix-post-layoutget-error-handling-in-pnfs_update_layout.patch