s->sc_type = 0;
 }
 
+static void
+hash_delegation_locked(struct nfs4_delegation *dp, struct nfs4_file *fp)
+{
+       lockdep_assert_held(&recall_lock);
+
+       list_add(&dp->dl_perfile, &fp->fi_delegations);
+       list_add(&dp->dl_perclnt, &dp->dl_stid.sc_client->cl_delegations);
+}
+
 /* Called under the state lock. */
 static void
 unhash_delegation(struct nfs4_delegation *dp)
 {
-       list_del_init(&dp->dl_perclnt);
        spin_lock(&recall_lock);
+       list_del_init(&dp->dl_perclnt);
        list_del_init(&dp->dl_perfile);
        list_del_init(&dp->dl_recall_lru);
        spin_unlock(&recall_lock);
        status = vfs_setlease(fl->fl_file, fl->fl_type, &fl);
        if (status)
                goto out_free;
-       list_add(&dp->dl_perclnt, &dp->dl_stid.sc_client->cl_delegations);
        fp->fi_lease = fl;
        fp->fi_deleg_file = get_file(fl->fl_file);
        atomic_set(&fp->fi_delegees, 1);
-       list_add(&dp->dl_perfile, &fp->fi_delegations);
+       spin_lock(&recall_lock);
+       hash_delegation_locked(dp, fp);
+       spin_unlock(&recall_lock);
        return 0;
 out_free:
        locks_free_lock(fl);
                spin_unlock(&recall_lock);
                return -EAGAIN;
        }
-       list_add(&dp->dl_perfile, &fp->fi_delegations);
+       hash_delegation_locked(dp, fp);
        spin_unlock(&recall_lock);
-       list_add(&dp->dl_perclnt, &dp->dl_stid.sc_client->cl_delegations);
        return 0;
 }
 
        struct nfs4_delegation *dp, *next;
        u64 count = 0;
 
+       lockdep_assert_held(&recall_lock);
        list_for_each_entry_safe(dp, next, &clp->cl_delegations, dl_perclnt) {
                if (victims)
                        list_move(&dp->dl_recall_lru, victims);