commit | fe2140e2f57fef8562e0f9b7cd447d2b08dc2f35 | [log] [tgz] |
---|---|---|
author | David Howells <[email protected]> | Thu Oct 21 09:55:21 2021 +0100 |
committer | David Howells <[email protected]> | Fri Jan 07 13:41:53 2022 +0000 |
tree | 0ab7fb840bfbbc540a71e69848dc99dbce6f63b0 | |
parent | d1065b0a6fd9397edd3094c56b777d0d8ec1290d [diff] [blame] |
cachefiles: Implement volume support Implement support for creating the directory layout for a volume on disk and setting up and withdrawing volume caching. Each volume has a directory named for the volume key under the root of the cache (prefixed with an 'I' to indicate to cachefilesd that it's an index) and then creates a bunch of hash bucket subdirectories under that (named as '@' plus a hex number) in which cookie files will be created. Signed-off-by: David Howells <[email protected]> Reviewed-by: Jeff Layton <[email protected]> cc: [email protected] Link: https://lore.kernel.org/r/163819635314.215744.13081522301564537723.stgit@warthog.procyon.org.uk/ # v1 Link: https://lore.kernel.org/r/163906936397.143852.17788457778396467161.stgit@warthog.procyon.org.uk/ # v2 Link: https://lore.kernel.org/r/163967143860.1823006.7185205806080225038.stgit@warthog.procyon.org.uk/ # v3 Link: https://lore.kernel.org/r/164021545212.640689.5064821392307582927.stgit@warthog.procyon.org.uk/ # v4
diff --git a/fs/cachefiles/cache.c b/fs/cachefiles/cache.c index 0462e7a..c4b9280 100644 --- a/fs/cachefiles/cache.c +++ b/fs/cachefiles/cache.c
@@ -263,6 +263,32 @@ int cachefiles_has_space(struct cachefiles_cache *cache, } /* + * Withdraw volumes. + */ +static void cachefiles_withdraw_volumes(struct cachefiles_cache *cache) +{ + _enter(""); + + for (;;) { + struct cachefiles_volume *volume = NULL; + + spin_lock(&cache->object_list_lock); + if (!list_empty(&cache->volumes)) { + volume = list_first_entry(&cache->volumes, + struct cachefiles_volume, cache_link); + list_del_init(&volume->cache_link); + } + spin_unlock(&cache->object_list_lock); + if (!volume) + break; + + cachefiles_withdraw_volume(volume); + } + + _leave(""); +} + +/* * Sync a cache to backing disk. */ static void cachefiles_sync_cache(struct cachefiles_cache *cache) @@ -303,7 +329,7 @@ void cachefiles_withdraw_cache(struct cachefiles_cache *cache) // PLACEHOLDER: Withdraw objects fscache_wait_for_objects(fscache); - // PLACEHOLDER: Withdraw volume + cachefiles_withdraw_volumes(cache); cachefiles_sync_cache(cache); cache->cache = NULL; fscache_relinquish_cache(fscache);