aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs
diff options
context:
space:
mode:
authorTrond Myklebust <Trond.Myklebust@netapp.com>2012-08-08 16:03:13 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2012-08-08 16:03:13 -0400
commit47fbf7976e0b7d9dcdd799e2a1baba19064d9631 (patch)
tree1d2a0b4d69f331f5f0d82f15be9a1f06b3d80aa1 /fs/nfs
parent7de6e28417c65919cf2c1621841a650c4a3afbbd (diff)
NFSv4.1: Remove a bogus BUG_ON() in nfs4_layoutreturn_done
Ever since commit 0a57cdac3f (NFSv4.1 send layoutreturn to fence disconnected data server) we've been sending layoutreturn calls while there is potentially still outstanding I/O to the data servers. The reason we do this is to avoid races between replayed writes to the MDS and the original writes to the DS. When this happens, the BUG_ON() in nfs4_layoutreturn_done can be triggered because it assumes that we would never call layoutreturn without knowing that all I/O to the DS is finished. The fix is to remove the BUG_ON() now that the assumptions behind the test are obsolete. Reported-by: Boaz Harrosh <bharrosh@panasas.com> Reported-by: Tigran Mkrtchyan <tigran.mkrtchyan@desy.de> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> Cc: stable@vger.kernel.org [>=3.5]
Diffstat (limited to 'fs/nfs')
-rw-r--r--fs/nfs/nfs4proc.c8
1 files changed, 2 insertions, 6 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index f94f6b3928fc..c77d296bdaa6 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -6359,12 +6359,8 @@ static void nfs4_layoutreturn_done(struct rpc_task *task, void *calldata)
6359 return; 6359 return;
6360 } 6360 }
6361 spin_lock(&lo->plh_inode->i_lock); 6361 spin_lock(&lo->plh_inode->i_lock);
6362 if (task->tk_status == 0) { 6362 if (task->tk_status == 0 && lrp->res.lrs_present)
6363 if (lrp->res.lrs_present) { 6363 pnfs_set_layout_stateid(lo, &lrp->res.stateid, true);
6364 pnfs_set_layout_stateid(lo, &lrp->res.stateid, true);
6365 } else
6366 BUG_ON(!list_empty(&lo->plh_segs));
6367 }
6368 lo->plh_block_lgets--; 6364 lo->plh_block_lgets--;
6369 spin_unlock(&lo->plh_inode->i_lock); 6365 spin_unlock(&lo->plh_inode->i_lock);
6370 dprintk("<-- %s\n", __func__); 6366 dprintk("<-- %s\n", __func__);