linux/include/linux/cleancache.h
<<
>>
Prefs
   1#ifndef _LINUX_CLEANCACHE_H
   2#define _LINUX_CLEANCACHE_H
   3
   4#include <linux/fs.h>
   5#include <linux/exportfs.h>
   6#include <linux/mm.h>
   7
   8#define CLEANCACHE_NO_POOL              -1
   9#define CLEANCACHE_NO_BACKEND           -2
  10#define CLEANCACHE_NO_BACKEND_SHARED    -3
  11
  12#define CLEANCACHE_KEY_MAX 6
  13
  14/*
  15 * cleancache requires every file with a page in cleancache to have a
  16 * unique key unless/until the file is removed/truncated.  For some
  17 * filesystems, the inode number is unique, but for "modern" filesystems
  18 * an exportable filehandle is required (see exportfs.h)
  19 */
  20struct cleancache_filekey {
  21        union {
  22                ino_t ino;
  23                __u32 fh[CLEANCACHE_KEY_MAX];
  24                u32 key[CLEANCACHE_KEY_MAX];
  25        } u;
  26};
  27
  28struct cleancache_ops {
  29        int (*init_fs)(size_t);
  30        int (*init_shared_fs)(char *uuid, size_t);
  31        int (*get_page)(int, struct cleancache_filekey,
  32                        pgoff_t, struct page *);
  33        void (*put_page)(int, struct cleancache_filekey,
  34                        pgoff_t, struct page *);
  35        void (*invalidate_page)(int, struct cleancache_filekey, pgoff_t);
  36        void (*invalidate_inode)(int, struct cleancache_filekey);
  37        void (*invalidate_fs)(int);
  38};
  39
  40extern int cleancache_register_ops(const struct cleancache_ops *ops);
  41extern void __cleancache_init_fs(struct super_block *);
  42extern void __cleancache_init_shared_fs(struct super_block *);
  43extern int  __cleancache_get_page(struct page *);
  44extern void __cleancache_put_page(struct page *);
  45extern void __cleancache_invalidate_page(struct address_space *, struct page *);
  46extern void __cleancache_invalidate_inode(struct address_space *);
  47extern void __cleancache_invalidate_fs(struct super_block *);
  48
  49#ifdef CONFIG_CLEANCACHE
  50#define cleancache_enabled (1)
  51static inline bool cleancache_fs_enabled_mapping(struct address_space *mapping)
  52{
  53        return mapping->host->i_sb->cleancache_poolid >= 0;
  54}
  55static inline bool cleancache_fs_enabled(struct page *page)
  56{
  57        return cleancache_fs_enabled_mapping(page->mapping);
  58}
  59#else
  60#define cleancache_enabled (0)
  61#define cleancache_fs_enabled(_page) (0)
  62#define cleancache_fs_enabled_mapping(_page) (0)
  63#endif
  64
  65/*
  66 * The shim layer provided by these inline functions allows the compiler
  67 * to reduce all cleancache hooks to nothingness if CONFIG_CLEANCACHE
  68 * is disabled, to a single global variable check if CONFIG_CLEANCACHE
  69 * is enabled but no cleancache "backend" has dynamically enabled it,
  70 * and, for the most frequent cleancache ops, to a single global variable
  71 * check plus a superblock element comparison if CONFIG_CLEANCACHE is enabled
  72 * and a cleancache backend has dynamically enabled cleancache, but the
  73 * filesystem referenced by that cleancache op has not enabled cleancache.
  74 * As a result, CONFIG_CLEANCACHE can be enabled by default with essentially
  75 * no measurable performance impact.
  76 */
  77
  78static inline void cleancache_init_fs(struct super_block *sb)
  79{
  80        if (cleancache_enabled)
  81                __cleancache_init_fs(sb);
  82}
  83
  84static inline void cleancache_init_shared_fs(struct super_block *sb)
  85{
  86        if (cleancache_enabled)
  87                __cleancache_init_shared_fs(sb);
  88}
  89
  90static inline int cleancache_get_page(struct page *page)
  91{
  92        if (cleancache_enabled && cleancache_fs_enabled(page))
  93                return __cleancache_get_page(page);
  94        return -1;
  95}
  96
  97static inline void cleancache_put_page(struct page *page)
  98{
  99        if (cleancache_enabled && cleancache_fs_enabled(page))
 100                __cleancache_put_page(page);
 101}
 102
 103static inline void cleancache_invalidate_page(struct address_space *mapping,
 104                                        struct page *page)
 105{
 106        /* careful... page->mapping is NULL sometimes when this is called */
 107        if (cleancache_enabled && cleancache_fs_enabled_mapping(mapping))
 108                __cleancache_invalidate_page(mapping, page);
 109}
 110
 111static inline void cleancache_invalidate_inode(struct address_space *mapping)
 112{
 113        if (cleancache_enabled && cleancache_fs_enabled_mapping(mapping))
 114                __cleancache_invalidate_inode(mapping);
 115}
 116
 117static inline void cleancache_invalidate_fs(struct super_block *sb)
 118{
 119        if (cleancache_enabled)
 120                __cleancache_invalidate_fs(sb);
 121}
 122
 123#endif /* _LINUX_CLEANCACHE_H */
 124