Define structures to represent the state inside cachefiles.  There are
three structures:

 (1) struct cachefiles_cache.

     This represents the cache as a whole and is used to keep track of the
     cache parameters and security, the communication channel to the
     controlling daemon and various directories in the cache filesystem.

 (2) struct cachefiles_volume.

     This represents a volume in the cache.  It keeps track of the
     directory for the volume and the fanout subdirs that form a hash
     table.

 (3) struct cachefiles_object.

     This represents a data file in the cache.  It keeps track of the
     filename and the open file handle for the relevant file.

Signed-off-by: David Howells <dhowe...@redhat.com>
cc: linux-cachefs@redhat.com
---

 fs/cachefiles/internal.h |   86 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 86 insertions(+)

diff --git a/fs/cachefiles/internal.h b/fs/cachefiles/internal.h
index 2f8e2835a785..11dcf9dbcf05 100644
--- a/fs/cachefiles/internal.h
+++ b/fs/cachefiles/internal.h
@@ -19,11 +19,97 @@
 #include <linux/workqueue.h>
 #include <linux/security.h>
 
+struct cachefiles_cache;
+struct cachefiles_object;
+
 extern unsigned cachefiles_debug;
 #define CACHEFILES_DEBUG_KENTER        1
 #define CACHEFILES_DEBUG_KLEAVE        2
 #define CACHEFILES_DEBUG_KDEBUG        4
 
+enum cachefiles_content {
+       /* These values are saved on disk */
+       CACHEFILES_CONTENT_NO_DATA      = 0, /* No content stored */
+       CACHEFILES_CONTENT_SINGLE       = 1, /* Content is monolithic, all is 
present */
+       CACHEFILES_CONTENT_ALL          = 2, /* Content is all present, no map 
*/
+       CACHEFILES_CONTENT_BACKFS_MAP   = 3, /* Content is piecemeal, mapped 
through backing fs */
+       CACHEFILES_CONTENT_DIRTY        = 4, /* Content is dirty (only seen on 
disk) */
+       nr__cachefiles_content
+};
+
+/*
+ * Cached volume representation.
+ */
+struct cachefiles_volume {
+       struct cachefiles_cache         *cache;
+       struct list_head                cache_link;     /* Link in 
cache->volumes */
+       struct fscache_volume           *vcookie;       /* The netfs's 
representation */
+       struct dentry                   *dentry;        /* The volume dentry */
+       struct dentry                   *fanout[256];   /* Fanout subdirs */
+};
+
+/*
+ * node records
+ */
+struct cachefiles_object {
+       int                             debug_id;       /* debugging ID */
+       spinlock_t                      lock;           /* state and operations 
lock */
+
+       struct list_head                cache_link;     /* Link in 
cache->*_list */
+       struct cachefiles_volume        *volume;        /* Cache volume that 
holds this object */
+       struct fscache_cookie           *cookie;        /* netfs's file/index 
object */
+       struct file                     *file;          /* The file 
representing this object */
+       char                            *d_name;        /* Filename */
+       atomic_t                        usage;          /* object usage count */
+       u8                              d_name_len;     /* Length of filename */
+       u8                              key_hash;       /* Hash of object key */
+       unsigned long                   flags;
+#define CACHEFILES_OBJECT_USING_TMPFILE        0               /* Have an 
unlinked tmpfile */
+       enum cachefiles_content         content_info:8; /* Info about content 
presence */
+};
+
+/*
+ * Cache files cache definition
+ */
+struct cachefiles_cache {
+       struct fscache_cache            *cache;         /* Cache cookie */
+       struct vfsmount                 *mnt;           /* mountpoint holding 
the cache */
+       struct dentry                   *store;         /* Directory into which 
live objects go */
+       struct dentry                   *graveyard;     /* directory into which 
dead objects go */
+       struct file                     *cachefilesd;   /* manager daemon 
handle */
+       struct list_head                volumes;        /* List of volume 
objects */
+       struct list_head                object_list;    /* List of active 
objects */
+       spinlock_t                      object_list_lock;
+       const struct cred               *cache_cred;    /* security override 
for accessing cache */
+       struct mutex                    daemon_mutex;   /* command 
serialisation mutex */
+       wait_queue_head_t               daemon_pollwq;  /* poll waitqueue for 
daemon */
+       atomic_t                        gravecounter;   /* graveyard uniquifier 
*/
+       atomic_t                        f_released;     /* number of objects 
released lately */
+       atomic_long_t                   b_released;     /* number of blocks 
released lately */
+       unsigned                        frun_percent;   /* when to stop culling 
(% files) */
+       unsigned                        fcull_percent;  /* when to start 
culling (% files) */
+       unsigned                        fstop_percent;  /* when to stop 
allocating (% files) */
+       unsigned                        brun_percent;   /* when to stop culling 
(% blocks) */
+       unsigned                        bcull_percent;  /* when to start 
culling (% blocks) */
+       unsigned                        bstop_percent;  /* when to stop 
allocating (% blocks) */
+       unsigned                        bsize;          /* cache's block size */
+       unsigned                        bshift;         /* min(ilog2(PAGE_SIZE 
/ bsize), 0) */
+       uint64_t                        frun;           /* when to stop culling 
*/
+       uint64_t                        fcull;          /* when to start 
culling */
+       uint64_t                        fstop;          /* when to stop 
allocating */
+       sector_t                        brun;           /* when to stop culling 
*/
+       sector_t                        bcull;          /* when to start 
culling */
+       sector_t                        bstop;          /* when to stop 
allocating */
+       unsigned long                   flags;
+#define CACHEFILES_READY               0       /* T if cache prepared */
+#define CACHEFILES_DEAD                        1       /* T if cache dead */
+#define CACHEFILES_CULLING             2       /* T if cull engaged */
+#define CACHEFILES_STATE_CHANGED       3       /* T if state changed (poll 
trigger) */
+       char                            *rootdirname;   /* name of cache root 
directory */
+       char                            *secctx;        /* LSM security context 
*/
+       char                            *tag;           /* cache binding tag */
+};
+
 /*
  * error_inject.c
  */


--
Linux-cachefs mailing list
Linux-cachefs@redhat.com
https://listman.redhat.com/mailman/listinfo/linux-cachefs

Reply via email to