diff options
Diffstat (limited to 'fs/nfsd/nfs4state.c')
-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 260c1cbe25c4..c5fce309d87e 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c | |||
@@ -90,6 +90,7 @@ static DECLARE_MUTEX(client_sema); | |||
90 | 90 | ||
91 | kmem_cache_t *stateowner_slab = NULL; | 91 | kmem_cache_t *stateowner_slab = NULL; |
92 | kmem_cache_t *file_slab = NULL; | 92 | kmem_cache_t *file_slab = NULL; |
93 | kmem_cache_t *stateid_slab = NULL; | ||
93 | 94 | ||
94 | void | 95 | void |
95 | nfs4_lock_state(void) | 96 | nfs4_lock_state(void) |
@@ -1010,6 +1011,7 @@ nfsd4_free_slabs(void) | |||
1010 | { | 1011 | { |
1011 | nfsd4_free_slab(&stateowner_slab); | 1012 | nfsd4_free_slab(&stateowner_slab); |
1012 | nfsd4_free_slab(&file_slab); | 1013 | nfsd4_free_slab(&file_slab); |
1014 | nfsd4_free_slab(&stateid_slab); | ||
1013 | } | 1015 | } |
1014 | 1016 | ||
1015 | static int | 1017 | static int |
@@ -1023,6 +1025,10 @@ nfsd4_init_slabs(void) | |||
1023 | sizeof(struct nfs4_file), 0, 0, NULL, NULL); | 1025 | sizeof(struct nfs4_file), 0, 0, NULL, NULL); |
1024 | if (file_slab == NULL) | 1026 | if (file_slab == NULL) |
1025 | goto out_nomem; | 1027 | goto out_nomem; |
1028 | stateid_slab = kmem_cache_create("nfsd4_stateids", | ||
1029 | sizeof(struct nfs4_stateid), 0, 0, NULL, NULL); | ||
1030 | if (stateid_slab == NULL) | ||
1031 | goto out_nomem; | ||
1026 | return 0; | 1032 | return 0; |
1027 | out_nomem: | 1033 | out_nomem: |
1028 | nfsd4_free_slabs(); | 1034 | nfsd4_free_slabs(); |
@@ -1173,7 +1179,7 @@ release_stateid(struct nfs4_stateid *stp, int flags) | |||
1173 | vfsclose++; | 1179 | vfsclose++; |
1174 | } else if (flags & LOCK_STATE) | 1180 | } else if (flags & LOCK_STATE) |
1175 | locks_remove_posix(filp, (fl_owner_t) stp->st_stateowner); | 1181 | locks_remove_posix(filp, (fl_owner_t) stp->st_stateowner); |
1176 | kfree(stp); | 1182 | kmem_cache_free(stateid_slab, stp); |
1177 | stp = NULL; | 1183 | stp = NULL; |
1178 | } | 1184 | } |
1179 | 1185 | ||
@@ -1606,6 +1612,12 @@ out: | |||
1606 | return status; | 1612 | return status; |
1607 | } | 1613 | } |
1608 | 1614 | ||
1615 | static inline struct nfs4_stateid * | ||
1616 | nfs4_alloc_stateid(void) | ||
1617 | { | ||
1618 | return kmem_cache_alloc(stateid_slab, GFP_KERNEL); | ||
1619 | } | ||
1620 | |||
1609 | static int | 1621 | static int |
1610 | nfs4_new_open(struct svc_rqst *rqstp, struct nfs4_stateid **stpp, | 1622 | nfs4_new_open(struct svc_rqst *rqstp, struct nfs4_stateid **stpp, |
1611 | struct nfs4_delegation *dp, | 1623 | struct nfs4_delegation *dp, |
@@ -1613,7 +1625,7 @@ nfs4_new_open(struct svc_rqst *rqstp, struct nfs4_stateid **stpp, | |||
1613 | { | 1625 | { |
1614 | struct nfs4_stateid *stp; | 1626 | struct nfs4_stateid *stp; |
1615 | 1627 | ||
1616 | stp = kmalloc(sizeof(struct nfs4_stateid), GFP_KERNEL); | 1628 | stp = nfs4_alloc_stateid(); |
1617 | if (stp == NULL) | 1629 | if (stp == NULL) |
1618 | return nfserr_resource; | 1630 | return nfserr_resource; |
1619 | 1631 | ||
@@ -1627,7 +1639,7 @@ nfs4_new_open(struct svc_rqst *rqstp, struct nfs4_stateid **stpp, | |||
1627 | if (status) { | 1639 | if (status) { |
1628 | if (status == nfserr_dropit) | 1640 | if (status == nfserr_dropit) |
1629 | status = nfserr_jukebox; | 1641 | status = nfserr_jukebox; |
1630 | kfree(stp); | 1642 | kmem_cache_free(stateid_slab, stp); |
1631 | return status; | 1643 | return status; |
1632 | } | 1644 | } |
1633 | } | 1645 | } |
@@ -2627,8 +2639,8 @@ alloc_init_lock_stateid(struct nfs4_stateowner *sop, struct nfs4_file *fp, struc | |||
2627 | struct nfs4_stateid *stp; | 2639 | struct nfs4_stateid *stp; |
2628 | unsigned int hashval = stateid_hashval(sop->so_id, fp->fi_id); | 2640 | unsigned int hashval = stateid_hashval(sop->so_id, fp->fi_id); |
2629 | 2641 | ||
2630 | if ((stp = kmalloc(sizeof(struct nfs4_stateid), | 2642 | stp = nfs4_alloc_stateid(); |
2631 | GFP_KERNEL)) == NULL) | 2643 | if (stp == NULL) |
2632 | goto out; | 2644 | goto out; |
2633 | INIT_LIST_HEAD(&stp->st_hash); | 2645 | INIT_LIST_HEAD(&stp->st_hash); |
2634 | INIT_LIST_HEAD(&stp->st_perfile); | 2646 | INIT_LIST_HEAD(&stp->st_perfile); |