aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs')
-rw-r--r--fs/nfsd/nfs4state.c10
-rw-r--r--fs/nfsd/nfssvc.c19
2 files changed, 20 insertions, 9 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 980a216a48c8..2e6a44e3d2fe 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -430,11 +430,11 @@ static int set_forechannel_maxreqs(struct nfsd4_channel_attrs *fchan)
430 else if (fchan->maxreqs > NFSD_MAX_SLOTS_PER_SESSION) 430 else if (fchan->maxreqs > NFSD_MAX_SLOTS_PER_SESSION)
431 fchan->maxreqs = NFSD_MAX_SLOTS_PER_SESSION; 431 fchan->maxreqs = NFSD_MAX_SLOTS_PER_SESSION;
432 432
433 spin_lock(&nfsd_serv->sv_lock); 433 spin_lock(&nfsd_drc_lock);
434 if (np + nfsd_serv->sv_drc_pages_used > nfsd_serv->sv_drc_max_pages) 434 if (np + nfsd_drc_pages_used > nfsd_drc_max_pages)
435 np = nfsd_serv->sv_drc_max_pages - nfsd_serv->sv_drc_pages_used; 435 np = nfsd_drc_max_pages - nfsd_drc_pages_used;
436 nfsd_serv->sv_drc_pages_used += np; 436 nfsd_drc_pages_used += np;
437 spin_unlock(&nfsd_serv->sv_lock); 437 spin_unlock(&nfsd_drc_lock);
438 438
439 if (np <= 0) { 439 if (np <= 0) {
440 status = nfserr_resource; 440 status = nfserr_resource;
diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c
index d4c9884cd54b..78d8fcd883fb 100644
--- a/fs/nfsd/nfssvc.c
+++ b/fs/nfsd/nfssvc.c
@@ -67,6 +67,16 @@ struct timeval nfssvc_boot;
67DEFINE_MUTEX(nfsd_mutex); 67DEFINE_MUTEX(nfsd_mutex);
68struct svc_serv *nfsd_serv; 68struct svc_serv *nfsd_serv;
69 69
70/*
71 * nfsd_drc_lock protects nfsd_drc_max_pages and nfsd_drc_pages_used.
72 * nfsd_drc_max_pages limits the total amount of memory available for
73 * version 4.1 DRC caches.
74 * nfsd_drc_pages_used tracks the current version 4.1 DRC memory usage.
75 */
76spinlock_t nfsd_drc_lock;
77unsigned int nfsd_drc_max_pages;
78unsigned int nfsd_drc_pages_used;
79
70#if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL) 80#if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL)
71static struct svc_stat nfsd_acl_svcstats; 81static struct svc_stat nfsd_acl_svcstats;
72static struct svc_version * nfsd_acl_version[] = { 82static struct svc_version * nfsd_acl_version[] = {
@@ -238,11 +248,12 @@ static void set_max_drc(void)
238{ 248{
239 /* The percent of nr_free_buffer_pages used by the V4.1 server DRC */ 249 /* The percent of nr_free_buffer_pages used by the V4.1 server DRC */
240 #define NFSD_DRC_SIZE_SHIFT 7 250 #define NFSD_DRC_SIZE_SHIFT 7
241 nfsd_serv->sv_drc_max_pages = nr_free_buffer_pages() 251 nfsd_drc_max_pages = nr_free_buffer_pages()
242 >> NFSD_DRC_SIZE_SHIFT; 252 >> NFSD_DRC_SIZE_SHIFT;
243 nfsd_serv->sv_drc_pages_used = 0; 253 nfsd_drc_pages_used = 0;
244 dprintk("%s svc_drc_max_pages %u\n", __func__, 254 spin_lock_init(&nfsd_drc_lock);
245 nfsd_serv->sv_drc_max_pages); 255 dprintk("%s nfsd_drc_max_pages %u\n", __func__,
256 nfsd_drc_max_pages);
246} 257}
247 258
248int nfsd_create_serv(void) 259int nfsd_create_serv(void)