|
@@ -616,6 +616,7 @@ void
|
|
nfs4_put_delegation(struct nfs4_delegation *dp)
|
|
nfs4_put_delegation(struct nfs4_delegation *dp)
|
|
{
|
|
{
|
|
if (atomic_dec_and_test(&dp->dl_count)) {
|
|
if (atomic_dec_and_test(&dp->dl_count)) {
|
|
|
|
+ remove_stid(&dp->dl_stid);
|
|
nfs4_free_stid(deleg_slab, &dp->dl_stid);
|
|
nfs4_free_stid(deleg_slab, &dp->dl_stid);
|
|
num_delegations--;
|
|
num_delegations--;
|
|
}
|
|
}
|
|
@@ -657,6 +658,7 @@ unhash_delegation(struct nfs4_delegation *dp)
|
|
struct nfs4_file *fp = dp->dl_file;
|
|
struct nfs4_file *fp = dp->dl_file;
|
|
|
|
|
|
spin_lock(&state_lock);
|
|
spin_lock(&state_lock);
|
|
|
|
+ dp->dl_stid.sc_type = NFS4_CLOSED_DELEG_STID;
|
|
list_del_init(&dp->dl_perclnt);
|
|
list_del_init(&dp->dl_perclnt);
|
|
list_del_init(&dp->dl_recall_lru);
|
|
list_del_init(&dp->dl_recall_lru);
|
|
spin_lock(&fp->fi_lock);
|
|
spin_lock(&fp->fi_lock);
|
|
@@ -670,19 +672,15 @@ unhash_delegation(struct nfs4_delegation *dp)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
static void destroy_revoked_delegation(struct nfs4_delegation *dp)
|
|
static void destroy_revoked_delegation(struct nfs4_delegation *dp)
|
|
{
|
|
{
|
|
list_del_init(&dp->dl_recall_lru);
|
|
list_del_init(&dp->dl_recall_lru);
|
|
- remove_stid(&dp->dl_stid);
|
|
|
|
nfs4_put_delegation(dp);
|
|
nfs4_put_delegation(dp);
|
|
}
|
|
}
|
|
|
|
|
|
static void destroy_delegation(struct nfs4_delegation *dp)
|
|
static void destroy_delegation(struct nfs4_delegation *dp)
|
|
{
|
|
{
|
|
unhash_delegation(dp);
|
|
unhash_delegation(dp);
|
|
- remove_stid(&dp->dl_stid);
|
|
|
|
nfs4_put_delegation(dp);
|
|
nfs4_put_delegation(dp);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -4036,7 +4034,9 @@ static __be32 nfsd4_validate_stateid(struct nfs4_client *cl, stateid_t *stateid)
|
|
return nfs_ok;
|
|
return nfs_ok;
|
|
default:
|
|
default:
|
|
printk("unknown stateid type %x\n", s->sc_type);
|
|
printk("unknown stateid type %x\n", s->sc_type);
|
|
|
|
+ /* Fallthrough */
|
|
case NFS4_CLOSED_STID:
|
|
case NFS4_CLOSED_STID:
|
|
|
|
+ case NFS4_CLOSED_DELEG_STID:
|
|
return nfserr_bad_stateid;
|
|
return nfserr_bad_stateid;
|
|
}
|
|
}
|
|
}
|
|
}
|