Commit 5ac049ac authored by NeilBrown's avatar NeilBrown Committed by Linus Torvalds
Browse files

[PATCH] nfsd4: slabify stateids



Allocate stateid's from a slab cache.

Signed-off-by: default avatarJ. Bruce Fields <bfields@citi.umich.edu>
Signed-off-by: default avatarNeil Brown <neilb@cse.unsw.edu.au>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent e60d4398
Loading
Loading
Loading
Loading
+17 −5
Original line number Diff line number Diff line
@@ -90,6 +90,7 @@ static DECLARE_MUTEX(client_sema);

kmem_cache_t *stateowner_slab = NULL;
kmem_cache_t *file_slab = NULL;
kmem_cache_t *stateid_slab = NULL;

void
nfs4_lock_state(void)
@@ -1010,6 +1011,7 @@ nfsd4_free_slabs(void)
{
	nfsd4_free_slab(&stateowner_slab);
	nfsd4_free_slab(&file_slab);
	nfsd4_free_slab(&stateid_slab);
}

static int
@@ -1023,6 +1025,10 @@ nfsd4_init_slabs(void)
			sizeof(struct nfs4_file), 0, 0, NULL, NULL);
	if (file_slab == NULL)
		goto out_nomem;
	stateid_slab = kmem_cache_create("nfsd4_stateids",
			sizeof(struct nfs4_stateid), 0, 0, NULL, NULL);
	if (stateid_slab == NULL)
		goto out_nomem;
	return 0;
out_nomem:
	nfsd4_free_slabs();
@@ -1173,7 +1179,7 @@ release_stateid(struct nfs4_stateid *stp, int flags)
		vfsclose++;
	} else if (flags & LOCK_STATE)
		locks_remove_posix(filp, (fl_owner_t) stp->st_stateowner);
	kfree(stp);
	kmem_cache_free(stateid_slab, stp);
	stp = NULL;
}

@@ -1606,6 +1612,12 @@ nfs4_check_open(struct nfs4_file *fp, struct nfsd4_open *open, struct nfs4_state
	return status;
}

static inline struct nfs4_stateid *
nfs4_alloc_stateid(void)
{
	return kmem_cache_alloc(stateid_slab, GFP_KERNEL);
}

static int
nfs4_new_open(struct svc_rqst *rqstp, struct nfs4_stateid **stpp,
		struct nfs4_delegation *dp,
@@ -1613,7 +1625,7 @@ nfs4_new_open(struct svc_rqst *rqstp, struct nfs4_stateid **stpp,
{
	struct nfs4_stateid *stp;

	stp = kmalloc(sizeof(struct nfs4_stateid), GFP_KERNEL);
	stp = nfs4_alloc_stateid();
	if (stp == NULL)
		return nfserr_resource;

@@ -1627,7 +1639,7 @@ nfs4_new_open(struct svc_rqst *rqstp, struct nfs4_stateid **stpp,
		if (status) {
			if (status == nfserr_dropit)
				status = nfserr_jukebox;
			kfree(stp);
			kmem_cache_free(stateid_slab, stp);
			return status;
		}
	}
@@ -2627,8 +2639,8 @@ alloc_init_lock_stateid(struct nfs4_stateowner *sop, struct nfs4_file *fp, struc
	struct nfs4_stateid *stp;
	unsigned int hashval = stateid_hashval(sop->so_id, fp->fi_id);

	if ((stp = kmalloc(sizeof(struct nfs4_stateid), 
					GFP_KERNEL)) == NULL)
	stp = nfs4_alloc_stateid();
	if (stp == NULL)
		goto out;
	INIT_LIST_HEAD(&stp->st_hash);
	INIT_LIST_HEAD(&stp->st_perfile);