diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/nfsd/nfs4state.c | 10 | ||||
-rw-r--r-- | fs/nfsd/nfssvc.c | 19 |
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; | |||
67 | DEFINE_MUTEX(nfsd_mutex); | 67 | DEFINE_MUTEX(nfsd_mutex); |
68 | struct svc_serv *nfsd_serv; | 68 | struct 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 | */ | ||
76 | spinlock_t nfsd_drc_lock; | ||
77 | unsigned int nfsd_drc_max_pages; | ||
78 | unsigned 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) |
71 | static struct svc_stat nfsd_acl_svcstats; | 81 | static struct svc_stat nfsd_acl_svcstats; |
72 | static struct svc_version * nfsd_acl_version[] = { | 82 | static 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 | ||
248 | int nfsd_create_serv(void) | 259 | int nfsd_create_serv(void) |