Implement a register of caches and provide functions to manage it.
Two functions are provided for the cache backend to use:
(1) Acquire a cache cookie:
struct fscache_cache *fscache_acquire_cache(const char *name)
This gets the cache cookie for a cache of the specified name and moves
it to the preparation state. If a nameless cache cookie exists, that
will be given this name and used.
(2) Relinquish a cache cookie:
void fscache_relinquish_cache(struct fscache_cache *cache);
This relinquishes a cache cookie, cleans it and makes it available if
it's still referenced by a network filesystem.
Note that network filesystems don't deal with cache cookies directly, but
rather go straight to the volume registration.
Signed-off-by: David Howells <dhowells@redhat.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
cc: linux-cachefs@redhat.com
Link: https://lore.kernel.org/r/163819587157.215744.13523139317322503286.stgit@warthog.procyon.org.uk/ # v1
Link: https://lore.kernel.org/r/163906889665.143852.10378009165231294456.stgit@warthog.procyon.org.uk/ # v2
Link: https://lore.kernel.org/r/163967085081.1823006.2218944206363626210.stgit@warthog.procyon.org.uk/ # v3
Link: https://lore.kernel.org/r/164021494847.640689.10109692261640524343.stgit@warthog.procyon.org.uk/ # v4
55 lines
1.7 KiB
C
55 lines
1.7 KiB
C
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
/* General filesystem caching backing cache interface
|
|
*
|
|
* Copyright (C) 2021 Red Hat, Inc. All Rights Reserved.
|
|
* Written by David Howells (dhowells@redhat.com)
|
|
*
|
|
* NOTE!!! See:
|
|
*
|
|
* Documentation/filesystems/caching/backend-api.rst
|
|
*
|
|
* for a description of the cache backend interface declared here.
|
|
*/
|
|
|
|
#ifndef _LINUX_FSCACHE_CACHE_H
|
|
#define _LINUX_FSCACHE_CACHE_H
|
|
|
|
#include <linux/fscache.h>
|
|
|
|
enum fscache_cache_trace;
|
|
enum fscache_access_trace;
|
|
|
|
enum fscache_cache_state {
|
|
FSCACHE_CACHE_IS_NOT_PRESENT, /* No cache is present for this name */
|
|
FSCACHE_CACHE_IS_PREPARING, /* A cache is preparing to come live */
|
|
FSCACHE_CACHE_IS_ACTIVE, /* Attached cache is active and can be used */
|
|
FSCACHE_CACHE_GOT_IOERROR, /* Attached cache stopped on I/O error */
|
|
FSCACHE_CACHE_IS_WITHDRAWN, /* Attached cache is being withdrawn */
|
|
#define NR__FSCACHE_CACHE_STATE (FSCACHE_CACHE_IS_WITHDRAWN + 1)
|
|
};
|
|
|
|
/*
|
|
* Cache cookie.
|
|
*/
|
|
struct fscache_cache {
|
|
struct list_head cache_link; /* Link in cache list */
|
|
void *cache_priv; /* Private cache data (or NULL) */
|
|
refcount_t ref;
|
|
atomic_t n_volumes; /* Number of active volumes; */
|
|
atomic_t n_accesses; /* Number of in-progress accesses on the cache */
|
|
atomic_t object_count; /* no. of live objects in this cache */
|
|
unsigned int debug_id;
|
|
enum fscache_cache_state state;
|
|
char *name;
|
|
};
|
|
|
|
extern struct workqueue_struct *fscache_wq;
|
|
|
|
/*
|
|
* out-of-line cache backend functions
|
|
*/
|
|
extern struct rw_semaphore fscache_addremove_sem;
|
|
extern struct fscache_cache *fscache_acquire_cache(const char *name);
|
|
extern void fscache_relinquish_cache(struct fscache_cache *cache);
|
|
|
|
#endif /* _LINUX_FSCACHE_CACHE_H */
|