Commit 3929eca7 authored by David Howells's avatar David Howells
Browse files
parent ecd1a5f6
Loading
Loading
Loading
Loading
+15 −3
Original line number Diff line number Diff line
@@ -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 @@ int cachefiles_add_cache(struct cachefiles_cache *cache)
 * 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 ###");
+1 −1
Original line number Diff line number Diff line
@@ -170,7 +170,7 @@ static ssize_t cachefiles_daemon_read(struct file *file, char __user *_buffer,
		return 0;

	/* check how much space the cache has */
	cachefiles_has_space(cache, 0, 0);
	cachefiles_has_space(cache, 0, 0, cachefiles_has_space_check);

	/* summarise */
	f_released = atomic_xchg(&cache->f_released, 0);
+9 −2
Original line number Diff line number Diff line
@@ -130,10 +130,17 @@ static inline void cachefiles_state_changed(struct cachefiles_cache *cache)
 * cache.c
 */
extern int cachefiles_add_cache(struct cachefiles_cache *cache);
extern int cachefiles_has_space(struct cachefiles_cache *cache,
				unsigned fnr, unsigned bnr);
extern void cachefiles_withdraw_cache(struct cachefiles_cache *cache);

enum cachefiles_has_space_for {
	cachefiles_has_space_check,
	cachefiles_has_space_for_write,
	cachefiles_has_space_for_create,
};
extern int cachefiles_has_space(struct cachefiles_cache *cache,
				unsigned fnr, unsigned bnr,
				enum cachefiles_has_space_for reason);

/*
 * daemon.c
 */
+5 −2
Original line number Diff line number Diff line
@@ -468,7 +468,8 @@ static int __cachefiles_prepare_write(struct netfs_cache_resources *cres,
	 * space, we need to see if it's fully allocated.  If it's not, we may
	 * want to cull it.
	 */
	if (cachefiles_has_space(cache, 0, *_len / PAGE_SIZE) == 0)
	if (cachefiles_has_space(cache, 0, *_len / PAGE_SIZE,
				 cachefiles_has_space_check) == 0)
		return 0; /* Enough space to simply overwrite the whole block */

	pos = cachefiles_inject_read_error();
@@ -483,6 +484,7 @@ static int __cachefiles_prepare_write(struct netfs_cache_resources *cres,
		return 0; /* Fully allocated */

	/* Partially allocated, but insufficient space: cull. */
	fscache_count_no_write_space();
	ret = cachefiles_inject_remove_error();
	if (ret == 0)
		ret = vfs_fallocate(file, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE,
@@ -498,7 +500,8 @@ static int __cachefiles_prepare_write(struct netfs_cache_resources *cres,
	return ret;

check_space:
	return cachefiles_has_space(cache, 0, *_len / PAGE_SIZE);
	return cachefiles_has_space(cache, 0, *_len / PAGE_SIZE,
				    cachefiles_has_space_for_write);
}

static int cachefiles_prepare_write(struct netfs_cache_resources *cres,
+4 −2
Original line number Diff line number Diff line
@@ -115,7 +115,8 @@ struct dentry *cachefiles_get_directory(struct cachefiles_cache *cache,

	/* we need to create the subdir if it doesn't exist yet */
	if (d_is_negative(subdir)) {
		ret = cachefiles_has_space(cache, 1, 0);
		ret = cachefiles_has_space(cache, 1, 0,
					   cachefiles_has_space_for_create);
		if (ret < 0)
			goto mkdir_error;

@@ -513,7 +514,8 @@ static bool cachefiles_create_file(struct cachefiles_object *object)
	struct file *file;
	int ret;

	ret = cachefiles_has_space(object->volume->cache, 1, 0);
	ret = cachefiles_has_space(object->volume->cache, 1, 0,
				   cachefiles_has_space_for_create);
	if (ret < 0)
		return false;

Loading