diff options
author | NeilBrown <neilb@cse.unsw.edu.au> | 2005-06-23 22:03:03 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-06-24 00:06:29 -0700 |
commit | 5ac049ac66416bbe84923f7c2384f23f6ee4aa88 (patch) | |
tree | 060a781f1f246078c9e8c0c0096be7155771c46d | |
parent | e60d4398a7c20fbe9c4a6cc39d7188ef9f65d2f1 (diff) | |
download | op-kernel-dev-5ac049ac66416bbe84923f7c2384f23f6ee4aa88.zip op-kernel-dev-5ac049ac66416bbe84923f7c2384f23f6ee4aa88.tar.gz |
[PATCH] nfsd4: slabify stateids
Allocate stateid's from a slab cache.
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Signed-off-by: Neil Brown <neilb@cse.unsw.edu.au>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r-- | fs/nfsd/nfs4state.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index 260c1cb..c5fce30 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c @@ -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 @@ out: 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); |