public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] NFSv4: Fix the locking in nfs_inode_reclaim_delegation()
@ 2010-04-20 10:26 David Howells
  2010-04-20 10:26 ` [PATCH 2/2] NFS: Fix RCU issues in the NFSv4 delegation code David Howells
  2010-04-20 22:21 ` [PATCH 1/2] NFSv4: Fix the locking in nfs_inode_reclaim_delegation() Paul E. McKenney
  0 siblings, 2 replies; 4+ messages in thread
From: David Howells @ 2010-04-20 10:26 UTC (permalink / raw)
  To: Trond.Myklebust; +Cc: paulmck, dhowells, linux-nfs, linux-kernel

From: Trond Myklebust <Trond.Myklebust@netapp.com>

Ensure that we correctly rcu-dereference the delegation itself, and that we
protect against removal while we're changing the contents.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Signed-off-by: David Howells <dhowells@redhat.com>
---

 fs/nfs/delegation.c |   42 ++++++++++++++++++++++++++++--------------
 1 files changed, 28 insertions(+), 14 deletions(-)

diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c
index 1567124..8d9ec49 100644
--- a/fs/nfs/delegation.c
+++ b/fs/nfs/delegation.c
@@ -129,21 +129,35 @@ again:
  */
 void nfs_inode_reclaim_delegation(struct inode *inode, struct rpc_cred *cred, struct nfs_openres *res)
 {
-	struct nfs_delegation *delegation = NFS_I(inode)->delegation;
-	struct rpc_cred *oldcred;
+	struct nfs_delegation *delegation;
+	struct rpc_cred *oldcred = NULL;
 
-	if (delegation == NULL)
-		return;
-	memcpy(delegation->stateid.data, res->delegation.data,
-			sizeof(delegation->stateid.data));
-	delegation->type = res->delegation_type;
-	delegation->maxsize = res->maxsize;
-	oldcred = delegation->cred;
-	delegation->cred = get_rpccred(cred);
-	clear_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags);
-	NFS_I(inode)->delegation_state = delegation->type;
-	smp_wmb();
-	put_rpccred(oldcred);
+	rcu_read_lock();
+	delegation = rcu_dereference(NFS_I(inode)->delegation);
+	if (delegation != NULL) {
+		spin_lock(&delegation->lock);
+		if (delegation->inode != NULL) {
+			memcpy(delegation->stateid.data, res->delegation.data,
+			       sizeof(delegation->stateid.data));
+			delegation->type = res->delegation_type;
+			delegation->maxsize = res->maxsize;
+			oldcred = delegation->cred;
+			delegation->cred = get_rpccred(cred);
+			clear_bit(NFS_DELEGATION_NEED_RECLAIM,
+				  &delegation->flags);
+			NFS_I(inode)->delegation_state = delegation->type;
+			spin_unlock(&delegation->lock);
+			put_rpccred(oldcred);
+			rcu_read_unlock();
+		} else {
+			/* We appear to have raced with a delegation return. */
+			spin_unlock(&delegation->lock);
+			rcu_read_unlock();
+			nfs_inode_set_delegation(inode, cred, res);
+		}
+	} else {
+		rcu_read_unlock();
+	}
 }
 
 static int nfs_do_return_delegation(struct inode *inode, struct nfs_delegation *delegation, int issync)


^ permalink raw reply related	[flat|nested] 4+ messages in thread
* [PATCH] fix RCU-lockdep splats in NFS
@ 2010-05-01  0:31 Paul E. McKenney
  2010-05-01  0:32 ` [PATCH 1/2] NFSv4: Fix the locking in nfs_inode_reclaim_delegation() Paul E. McKenney
  0 siblings, 1 reply; 4+ messages in thread
From: Paul E. McKenney @ 2010-05-01  0:31 UTC (permalink / raw)
  To: linux-kernel, linux-nfs; +Cc: mingo, peterz, Trond.Myklebust

Hello!

The following pair of fixes for RCU-lockdep splats have passed testing,
so are ready for inclusion.  Ingo suggests the NFS tree, so here they are!

							Thanx, Paul

------------------------------------------------------------------------

 b/fs/nfs/delegation.c |   42 ++++++++++++++++++++++++++++--------------
 fs/nfs/delegation.c   |   44 +++++++++++++++++++++++---------------------
 2 files changed, 51 insertions(+), 35 deletions(-)

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2010-05-01  0:32 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-04-20 10:26 [PATCH 1/2] NFSv4: Fix the locking in nfs_inode_reclaim_delegation() David Howells
2010-04-20 10:26 ` [PATCH 2/2] NFS: Fix RCU issues in the NFSv4 delegation code David Howells
2010-04-20 22:21 ` [PATCH 1/2] NFSv4: Fix the locking in nfs_inode_reclaim_delegation() Paul E. McKenney
  -- strict thread matches above, loose matches on Subject: below --
2010-05-01  0:31 [PATCH] fix RCU-lockdep splats in NFS Paul E. McKenney
2010-05-01  0:32 ` [PATCH 1/2] NFSv4: Fix the locking in nfs_inode_reclaim_delegation() Paul E. McKenney

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox