nfs4_put_delegation(struct nfs4_delegation *dp)
 {
        if (atomic_dec_and_test(&dp->dl_count)) {
+               remove_stid(&dp->dl_stid);
                nfs4_free_stid(deleg_slab, &dp->dl_stid);
                num_delegations--;
        }
        struct nfs4_file *fp = dp->dl_file;
 
        spin_lock(&state_lock);
+       dp->dl_stid.sc_type = NFS4_CLOSED_DELEG_STID;
        list_del_init(&dp->dl_perclnt);
        list_del_init(&dp->dl_recall_lru);
        spin_lock(&fp->fi_lock);
        }
 }
 
-
-
 static void destroy_revoked_delegation(struct nfs4_delegation *dp)
 {
        list_del_init(&dp->dl_recall_lru);
-       remove_stid(&dp->dl_stid);
        nfs4_put_delegation(dp);
 }
 
 static void destroy_delegation(struct nfs4_delegation *dp)
 {
        unhash_delegation(dp);
-       remove_stid(&dp->dl_stid);
        nfs4_put_delegation(dp);
 }
 
                return nfs_ok;
        default:
                printk("unknown stateid type %x\n", s->sc_type);
+               /* Fallthrough */
        case NFS4_CLOSED_STID:
+       case NFS4_CLOSED_DELEG_STID:
                return nfserr_bad_stateid;
        }
 }
 
 #define NFS4_CLOSED_STID 8
 /* For a deleg stateid kept around only to process free_stateid's: */
 #define NFS4_REVOKED_DELEG_STID 16
+#define NFS4_CLOSED_DELEG_STID 32
        unsigned char sc_type;
        stateid_t sc_stateid;
        struct nfs4_client *sc_client;