Skip to content

Commit

Permalink
nfsd: simplify stateid allocation and file handling
Browse files Browse the repository at this point in the history
Don't allow stateids to clear the open file pointer until they are
being destroyed. In a later patches we'll want to rely on the fact that
we have a valid file pointer when dealing with the stateid and this
will save us from having to do a lot of NULL pointer checks before
doing so.

Also, move to allocating stateids with kzalloc and get rid of the
explicit zeroing of fields.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Signed-off-by: Jeff Layton <jlayton@primarydata.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
  • Loading branch information
Trond Myklebust authored and J. Bruce Fields committed Jul 29, 2014
1 parent f9c00c3 commit f833883
Showing 1 changed file with 10 additions and 12 deletions.
22 changes: 10 additions & 12 deletions fs/nfsd/nfs4state.c
Original file line number Diff line number Diff line change
Expand Up @@ -470,19 +470,17 @@ kmem_cache *slab)
struct nfs4_stid *stid;
int new_id;

stid = kmem_cache_alloc(slab, GFP_KERNEL);
stid = kmem_cache_zalloc(slab, GFP_KERNEL);
if (!stid)
return NULL;

new_id = idr_alloc_cyclic(stateids, stid, 0, 0, GFP_KERNEL);
if (new_id < 0)
goto out_free;
stid->sc_client = cl;
stid->sc_type = 0;
stid->sc_stateid.si_opaque.so_id = new_id;
stid->sc_stateid.si_opaque.so_clid = cl->cl_clientid;
/* Will be incremented before return to client: */
stid->sc_stateid.si_generation = 0;
atomic_set(&stid->sc_count, 1);

/*
Expand Down Expand Up @@ -603,10 +601,8 @@ alloc_init_deleg(struct nfs4_client *clp, struct nfs4_ol_stateid *stp, struct sv
INIT_LIST_HEAD(&dp->dl_perfile);
INIT_LIST_HEAD(&dp->dl_perclnt);
INIT_LIST_HEAD(&dp->dl_recall_lru);
dp->dl_file = NULL;
dp->dl_type = NFS4_OPEN_DELEGATE_READ;
fh_copy_shallow(&dp->dl_fh, &current_fh->fh_handle);
dp->dl_time = 0;
INIT_WORK(&dp->dl_recall.cb_work, nfsd4_run_cb_recall);
return dp;
}
Expand All @@ -627,6 +623,8 @@ void
nfs4_put_delegation(struct nfs4_delegation *dp)
{
if (atomic_dec_and_test(&dp->dl_stid.sc_count)) {
if (dp->dl_file)
put_nfs4_file(dp->dl_file);
remove_stid(&dp->dl_stid);
nfs4_free_stid(deleg_slab, &dp->dl_stid);
num_delegations--;
Expand Down Expand Up @@ -678,13 +676,9 @@ unhash_delegation(struct nfs4_delegation *dp)
list_del_init(&dp->dl_recall_lru);
list_del_init(&dp->dl_perfile);
spin_unlock(&fp->fi_lock);
if (fp) {
if (fp)
nfs4_put_deleg_lease(fp);
dp->dl_file = NULL;
}
spin_unlock(&state_lock);
if (fp)
put_nfs4_file(fp);
}

static void destroy_revoked_delegation(struct nfs4_delegation *dp)
Expand Down Expand Up @@ -892,12 +886,12 @@ static void unhash_generic_stateid(struct nfs4_ol_stateid *stp)
static void close_generic_stateid(struct nfs4_ol_stateid *stp)
{
release_all_access(stp);
put_nfs4_file(stp->st_file);
stp->st_file = NULL;
}

static void free_generic_stateid(struct nfs4_ol_stateid *stp)
{
if (stp->st_file)
put_nfs4_file(stp->st_file);
remove_stid(&stp->st_stid);
nfs4_free_stid(stateid_slab, &stp->st_stid);
}
Expand Down Expand Up @@ -4469,6 +4463,10 @@ static void nfsd4_close_open_stateid(struct nfs4_ol_stateid *s)
if (list_empty(&oo->oo_owner.so_stateids))
release_openowner(oo);
} else {
if (s->st_file) {
put_nfs4_file(s->st_file);
s->st_file = NULL;
}
oo->oo_last_closed_stid = s;
/*
* In the 4.0 case we need to keep the owners around a
Expand Down

0 comments on commit f833883

Please sign in to comment.