summaryrefslogtreecommitdiff
path: root/fs/cachefiles/cache.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/cachefiles/cache.c')
-rw-r--r--fs/cachefiles/cache.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/fs/cachefiles/cache.c b/fs/cachefiles/cache.c
index e2cbbc08bad9..809519286335 100644
--- a/fs/cachefiles/cache.c
+++ b/fs/cachefiles/cache.c
@@ -147,7 +147,7 @@ int cachefiles_add_cache(struct cachefiles_cache *cache)
pr_info("File cache on %s registered\n", cache_cookie->name);
/* check how much space the cache has */
- cachefiles_has_space(cache, 0, 0);
+ cachefiles_has_space(cache, 0, 0, cachefiles_has_space_check);
cachefiles_end_secure(cache, saved_cred);
_leave(" = 0 [%px]", cache->cache);
return 0;
@@ -175,7 +175,8 @@ error_getsec:
* cache
*/
int cachefiles_has_space(struct cachefiles_cache *cache,
- unsigned fnr, unsigned bnr)
+ unsigned fnr, unsigned bnr,
+ enum cachefiles_has_space_for reason)
{
struct kstatfs stats;
u64 b_avail, b_writing;
@@ -233,7 +234,7 @@ int cachefiles_has_space(struct cachefiles_cache *cache,
ret = -ENOBUFS;
if (stats.f_ffree < cache->fstop ||
b_avail < cache->bstop)
- goto begin_cull;
+ goto stop_and_begin_cull;
ret = 0;
if (stats.f_ffree < cache->fcull ||
@@ -252,6 +253,17 @@ int cachefiles_has_space(struct cachefiles_cache *cache,
//_leave(" = 0");
return 0;
+stop_and_begin_cull:
+ switch (reason) {
+ case cachefiles_has_space_for_write:
+ fscache_count_no_write_space();
+ break;
+ case cachefiles_has_space_for_create:
+ fscache_count_no_create_space();
+ break;
+ default:
+ break;
+ }
begin_cull:
if (!test_and_set_bit(CACHEFILES_CULLING, &cache->flags)) {
_debug("### CULL CACHE ###");