nfsd4: simplify free_stateid
We no longer need is_deleg_stateid, for example. Signed-off-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
Родитель
38c387b52d
Коммит
2da1cec713
|
@ -1098,16 +1098,6 @@ static struct nfs4_stid *find_stateid(stateid_t *t)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct nfs4_ol_stateid *find_ol_stateid(stateid_t *t)
|
|
||||||
{
|
|
||||||
struct nfs4_stid *s;
|
|
||||||
|
|
||||||
s = find_stateid(t);
|
|
||||||
if (!s)
|
|
||||||
return NULL;
|
|
||||||
return openlockstateid(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct nfs4_stid *find_stateid_by_type(stateid_t *t, char typemask)
|
static struct nfs4_stid *find_stateid_by_type(stateid_t *t, char typemask)
|
||||||
{
|
{
|
||||||
struct nfs4_stid *s;
|
struct nfs4_stid *s;
|
||||||
|
@ -3251,11 +3241,6 @@ static int check_stateid_generation(stateid_t *in, stateid_t *ref, bool has_sess
|
||||||
return nfserr_old_stateid;
|
return nfserr_old_stateid;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int is_delegation_stateid(stateid_t *stateid)
|
|
||||||
{
|
|
||||||
return stateid->si_fileid == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
__be32 nfs4_validate_stateid(stateid_t *stateid, bool has_session)
|
__be32 nfs4_validate_stateid(stateid_t *stateid, bool has_session)
|
||||||
{
|
{
|
||||||
struct nfs4_stid *s;
|
struct nfs4_stid *s;
|
||||||
|
@ -3352,16 +3337,6 @@ out:
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
static __be32
|
|
||||||
nfsd4_free_delegation_stateid(stateid_t *stateid)
|
|
||||||
{
|
|
||||||
struct nfs4_delegation *dp = find_deleg_stateid(stateid);
|
|
||||||
if (dp)
|
|
||||||
return nfserr_locks_held;
|
|
||||||
|
|
||||||
return nfserr_bad_stateid;
|
|
||||||
}
|
|
||||||
|
|
||||||
static __be32
|
static __be32
|
||||||
nfsd4_free_lock_stateid(struct nfs4_ol_stateid *stp)
|
nfsd4_free_lock_stateid(struct nfs4_ol_stateid *stp)
|
||||||
{
|
{
|
||||||
|
@ -3382,40 +3357,32 @@ nfsd4_test_stateid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
|
||||||
return nfs_ok;
|
return nfs_ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Free a state id
|
|
||||||
*/
|
|
||||||
__be32
|
__be32
|
||||||
nfsd4_free_stateid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
|
nfsd4_free_stateid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
|
||||||
struct nfsd4_free_stateid *free_stateid)
|
struct nfsd4_free_stateid *free_stateid)
|
||||||
{
|
{
|
||||||
stateid_t *stateid = &free_stateid->fr_stateid;
|
stateid_t *stateid = &free_stateid->fr_stateid;
|
||||||
struct nfs4_ol_stateid *stp;
|
struct nfs4_stid *s;
|
||||||
__be32 ret;
|
__be32 ret = nfserr_bad_stateid;
|
||||||
|
|
||||||
nfs4_lock_state();
|
nfs4_lock_state();
|
||||||
if (is_delegation_stateid(stateid)) {
|
s = find_stateid(stateid);
|
||||||
ret = nfsd4_free_delegation_stateid(stateid);
|
if (!s)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
switch (s->sc_type) {
|
||||||
|
case NFS4_DELEG_STID:
|
||||||
stp = find_ol_stateid(stateid);
|
|
||||||
if (!stp) {
|
|
||||||
ret = nfserr_bad_stateid;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
ret = check_stateid_generation(stateid, &stp->st_stid.sc_stateid, 1);
|
|
||||||
if (ret)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
if (stp->st_stid.sc_type == NFS4_OPEN_STID) {
|
|
||||||
ret = nfserr_locks_held;
|
ret = nfserr_locks_held;
|
||||||
goto out;
|
goto out;
|
||||||
} else {
|
case NFS4_OPEN_STID:
|
||||||
ret = nfsd4_free_lock_stateid(stp);
|
case NFS4_LOCK_STID:
|
||||||
goto out;
|
ret = check_stateid_generation(stateid, &s->sc_stateid, 1);
|
||||||
|
if (ret)
|
||||||
|
goto out;
|
||||||
|
if (s->sc_type == NFS4_LOCK_STID)
|
||||||
|
ret = nfsd4_free_lock_stateid(openlockstateid(s));
|
||||||
|
else
|
||||||
|
ret = nfserr_locks_held;
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
nfs4_unlock_state();
|
nfs4_unlock_state();
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -3698,9 +3665,6 @@ nfsd4_delegreturn(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
|
||||||
status = nfserr_stale_stateid;
|
status = nfserr_stale_stateid;
|
||||||
if (STALE_STATEID(stateid))
|
if (STALE_STATEID(stateid))
|
||||||
goto out;
|
goto out;
|
||||||
status = nfserr_bad_stateid;
|
|
||||||
if (!is_delegation_stateid(stateid))
|
|
||||||
goto out;
|
|
||||||
status = nfserr_expired;
|
status = nfserr_expired;
|
||||||
dp = find_deleg_stateid(stateid);
|
dp = find_deleg_stateid(stateid);
|
||||||
if (!dp)
|
if (!dp)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче