nfsd4: modify fi_delegations under recall_lock
authorJ. Bruce Fields <bfields@redhat.com>
Mon, 7 Feb 2011 21:53:46 +0000 (16:53 -0500)
committerJ. Bruce Fields <bfields@redhat.com>
Mon, 14 Feb 2011 15:35:19 +0000 (10:35 -0500)
Modify fi_delegations only under the recall_lock, allowing us to use
that list on lease breaks.

Also some trivial cleanup to simplify later changes.

Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/nfs4state.c

index d978192838a3d35ac3eb6841e8223a56f21e6b72..8b6cd3cf48350cb87904ebbfa75130e86663832c 100644 (file)
@@ -277,9 +277,9 @@ nfs4_close_delegation(struct nfs4_delegation *dp)
 static void
 unhash_delegation(struct nfs4_delegation *dp)
 {
-       list_del_init(&dp->dl_perfile);
        list_del_init(&dp->dl_perclnt);
        spin_lock(&recall_lock);
+       list_del_init(&dp->dl_perfile);
        list_del_init(&dp->dl_recall_lru);
        spin_unlock(&recall_lock);
        nfs4_close_delegation(dp);
@@ -2336,9 +2336,7 @@ static void nfsd_break_one_deleg(struct nfs4_delegation *dp)
         * it's safe to take a reference: */
        atomic_inc(&dp->dl_count);
 
-       spin_lock(&recall_lock);
        list_add_tail(&dp->dl_recall_lru, &del_recall_lru);
-       spin_unlock(&recall_lock);
 
        /* only place dl_time is set. protected by lock_flocks*/
        dp->dl_time = get_seconds();
@@ -2363,8 +2361,10 @@ static void nfsd_break_deleg_cb(struct file_lock *fl)
         */
        fl->fl_break_time = 0;
 
-       nfsd_break_one_deleg(dp);
+       spin_lock(&recall_lock);
        dp->dl_file->fi_had_conflict = true;
+       nfsd_break_one_deleg(dp);
+       spin_unlock(&recall_lock);
 }
 
 static