summaryrefslogtreecommitdiff
path: root/include/linux/mbcache.h
diff options
context:
space:
mode:
authorTheodore Y. Ts'o <tytso@snap.thunk.org>2002-10-30 16:23:36 -0500
committerLinus Torvalds <torvalds@penguin.transmeta.com>2002-10-30 16:23:36 -0500
commit7cbc2addb39a8f7b0c4a0b607b2275e5225afc38 (patch)
tree05ce2bee61e4cd7cebefed604f73b9a30dde0eaa /include/linux/mbcache.h
parent216114b9d6c75161ca390f0fb72f35b16a393f4e (diff)
Port of the 0.8.50 xattr-mbcache patch to 2.5. (Shrinker API, hch cleanups)
(now uses struct block_device * to index devices, and uses hash.h for hash function) This patch creates a meta block cache which is utilized by the ext3 and ext2 extended attribute patch (patches 2 and 3, respectively). This cache allows directory blocks to be indexed by multiple keys. In the case of the extended attribute patches, it is used to look up blocks by both the block number and by the hash of the extended attributes. This is extremely important to allow the sharing of acl's when stored as extended attributes. Otherwise every single file would require its own, separate, one block overhead to store then ACL, even though there might be a large number of files that have the same ACL.
Diffstat (limited to 'include/linux/mbcache.h')
-rw-r--r--include/linux/mbcache.h72
1 files changed, 72 insertions, 0 deletions
diff --git a/include/linux/mbcache.h b/include/linux/mbcache.h
new file mode 100644
index 000000000000..d457859791cb
--- /dev/null
+++ b/include/linux/mbcache.h
@@ -0,0 +1,72 @@
+/*
+ File: linux/mbcache.h
+
+ (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org>
+*/
+
+/* Hardwire the number of additional indexes */
+#define MB_CACHE_INDEXES_COUNT 1
+
+struct mb_cache_entry;
+
+struct mb_cache_op {
+ void (*free)(struct mb_cache_entry *);
+};
+
+struct mb_cache {
+ struct list_head c_cache_list;
+ const char *c_name;
+ struct mb_cache_op c_op;
+ atomic_t c_entry_count;
+ int c_bucket_bits;
+#ifndef MB_CACHE_INDEXES_COUNT
+ int c_indexes_count;
+#endif
+ kmem_cache_t *c_entry_cache;
+ struct list_head *c_block_hash;
+ struct list_head *c_indexes_hash[0];
+};
+
+struct mb_cache_entry_index {
+ struct list_head o_list;
+ unsigned int o_key;
+};
+
+struct mb_cache_entry {
+ struct list_head e_lru_list;
+ struct mb_cache *e_cache;
+ atomic_t e_used;
+ struct block_device *e_bdev;
+ sector_t e_block;
+ struct list_head e_block_list;
+ struct mb_cache_entry_index e_indexes[0];
+};
+
+/* Functions on caches */
+
+struct mb_cache * mb_cache_create(const char *, struct mb_cache_op *, size_t,
+ int, int);
+void mb_cache_shrink(struct mb_cache *, struct block_device *);
+void mb_cache_destroy(struct mb_cache *);
+
+/* Functions on cache entries */
+
+struct mb_cache_entry *mb_cache_entry_alloc(struct mb_cache *);
+int mb_cache_entry_insert(struct mb_cache_entry *, struct block_device *,
+ sector_t, unsigned int[]);
+void mb_cache_entry_rehash(struct mb_cache_entry *, unsigned int[]);
+void mb_cache_entry_release(struct mb_cache_entry *);
+void mb_cache_entry_takeout(struct mb_cache_entry *);
+void mb_cache_entry_free(struct mb_cache_entry *);
+struct mb_cache_entry *mb_cache_entry_dup(struct mb_cache_entry *);
+struct mb_cache_entry *mb_cache_entry_get(struct mb_cache *,
+ struct block_device *,
+ sector_t);
+#if !defined(MB_CACHE_INDEXES_COUNT) || (MB_CACHE_INDEXES_COUNT > 0)
+struct mb_cache_entry *mb_cache_entry_find_first(struct mb_cache *cache, int,
+ struct block_device *,
+ unsigned int);
+struct mb_cache_entry *mb_cache_entry_find_next(struct mb_cache_entry *, int,
+ struct block_device *,
+ unsigned int);
+#endif