|
@@ -81,7 +81,7 @@
|
|
|
# define ea_bdebug(bh, fmt, ...) no_printk(fmt, ##__VA_ARGS__)
|
|
|
#endif
|
|
|
|
|
|
-static void ext4_xattr_cache_insert(struct buffer_head *);
|
|
|
+static void ext4_xattr_cache_insert(struct mb_cache *, struct buffer_head *);
|
|
|
static struct buffer_head *ext4_xattr_cache_find(struct inode *,
|
|
|
struct ext4_xattr_header *,
|
|
|
struct mb_cache_entry **);
|
|
@@ -90,8 +90,6 @@ static void ext4_xattr_rehash(struct ext4_xattr_header *,
|
|
|
static int ext4_xattr_list(struct dentry *dentry, char *buffer,
|
|
|
size_t buffer_size);
|
|
|
|
|
|
-static struct mb_cache *ext4_xattr_cache;
|
|
|
-
|
|
|
static const struct xattr_handler *ext4_xattr_handler_map[] = {
|
|
|
[EXT4_XATTR_INDEX_USER] = &ext4_xattr_user_handler,
|
|
|
#ifdef CONFIG_EXT4_FS_POSIX_ACL
|
|
@@ -117,6 +115,9 @@ const struct xattr_handler *ext4_xattr_handlers[] = {
|
|
|
NULL
|
|
|
};
|
|
|
|
|
|
+#define EXT4_GET_MB_CACHE(inode) (((struct ext4_sb_info *) \
|
|
|
+ inode->i_sb->s_fs_info)->s_mb_cache)
|
|
|
+
|
|
|
static __le32 ext4_xattr_block_csum(struct inode *inode,
|
|
|
sector_t block_nr,
|
|
|
struct ext4_xattr_header *hdr)
|
|
@@ -265,6 +266,7 @@ ext4_xattr_block_get(struct inode *inode, int name_index, const char *name,
|
|
|
struct ext4_xattr_entry *entry;
|
|
|
size_t size;
|
|
|
int error;
|
|
|
+ struct mb_cache *ext4_mb_cache = EXT4_GET_MB_CACHE(inode);
|
|
|
|
|
|
ea_idebug(inode, "name=%d.%s, buffer=%p, buffer_size=%ld",
|
|
|
name_index, name, buffer, (long)buffer_size);
|
|
@@ -286,7 +288,7 @@ bad_block:
|
|
|
error = -EIO;
|
|
|
goto cleanup;
|
|
|
}
|
|
|
- ext4_xattr_cache_insert(bh);
|
|
|
+ ext4_xattr_cache_insert(ext4_mb_cache, bh);
|
|
|
entry = BFIRST(bh);
|
|
|
error = ext4_xattr_find_entry(&entry, name_index, name, bh->b_size, 1);
|
|
|
if (error == -EIO)
|
|
@@ -409,6 +411,7 @@ ext4_xattr_block_list(struct dentry *dentry, char *buffer, size_t buffer_size)
|
|
|
struct inode *inode = dentry->d_inode;
|
|
|
struct buffer_head *bh = NULL;
|
|
|
int error;
|
|
|
+ struct mb_cache *ext4_mb_cache = EXT4_GET_MB_CACHE(inode);
|
|
|
|
|
|
ea_idebug(inode, "buffer=%p, buffer_size=%ld",
|
|
|
buffer, (long)buffer_size);
|
|
@@ -430,7 +433,7 @@ ext4_xattr_block_list(struct dentry *dentry, char *buffer, size_t buffer_size)
|
|
|
error = -EIO;
|
|
|
goto cleanup;
|
|
|
}
|
|
|
- ext4_xattr_cache_insert(bh);
|
|
|
+ ext4_xattr_cache_insert(ext4_mb_cache, bh);
|
|
|
error = ext4_xattr_list_entries(dentry, BFIRST(bh), buffer, buffer_size);
|
|
|
|
|
|
cleanup:
|
|
@@ -526,8 +529,9 @@ ext4_xattr_release_block(handle_t *handle, struct inode *inode,
|
|
|
{
|
|
|
struct mb_cache_entry *ce = NULL;
|
|
|
int error = 0;
|
|
|
+ struct mb_cache *ext4_mb_cache = EXT4_GET_MB_CACHE(inode);
|
|
|
|
|
|
- ce = mb_cache_entry_get(ext4_xattr_cache, bh->b_bdev, bh->b_blocknr);
|
|
|
+ ce = mb_cache_entry_get(ext4_mb_cache, bh->b_bdev, bh->b_blocknr);
|
|
|
error = ext4_journal_get_write_access(handle, bh);
|
|
|
if (error)
|
|
|
goto out;
|
|
@@ -746,13 +750,14 @@ ext4_xattr_block_set(handle_t *handle, struct inode *inode,
|
|
|
struct ext4_xattr_search *s = &bs->s;
|
|
|
struct mb_cache_entry *ce = NULL;
|
|
|
int error = 0;
|
|
|
+ struct mb_cache *ext4_mb_cache = EXT4_GET_MB_CACHE(inode);
|
|
|
|
|
|
#define header(x) ((struct ext4_xattr_header *)(x))
|
|
|
|
|
|
if (i->value && i->value_len > sb->s_blocksize)
|
|
|
return -ENOSPC;
|
|
|
if (s->base) {
|
|
|
- ce = mb_cache_entry_get(ext4_xattr_cache, bs->bh->b_bdev,
|
|
|
+ ce = mb_cache_entry_get(ext4_mb_cache, bs->bh->b_bdev,
|
|
|
bs->bh->b_blocknr);
|
|
|
error = ext4_journal_get_write_access(handle, bs->bh);
|
|
|
if (error)
|
|
@@ -770,7 +775,8 @@ ext4_xattr_block_set(handle_t *handle, struct inode *inode,
|
|
|
if (!IS_LAST_ENTRY(s->first))
|
|
|
ext4_xattr_rehash(header(s->base),
|
|
|
s->here);
|
|
|
- ext4_xattr_cache_insert(bs->bh);
|
|
|
+ ext4_xattr_cache_insert(ext4_mb_cache,
|
|
|
+ bs->bh);
|
|
|
}
|
|
|
unlock_buffer(bs->bh);
|
|
|
if (error == -EIO)
|
|
@@ -906,7 +912,7 @@ getblk_failed:
|
|
|
memcpy(new_bh->b_data, s->base, new_bh->b_size);
|
|
|
set_buffer_uptodate(new_bh);
|
|
|
unlock_buffer(new_bh);
|
|
|
- ext4_xattr_cache_insert(new_bh);
|
|
|
+ ext4_xattr_cache_insert(ext4_mb_cache, new_bh);
|
|
|
error = ext4_handle_dirty_xattr_block(handle,
|
|
|
inode, new_bh);
|
|
|
if (error)
|
|
@@ -1495,13 +1501,13 @@ ext4_xattr_put_super(struct super_block *sb)
|
|
|
* Returns 0, or a negative error number on failure.
|
|
|
*/
|
|
|
static void
|
|
|
-ext4_xattr_cache_insert(struct buffer_head *bh)
|
|
|
+ext4_xattr_cache_insert(struct mb_cache *ext4_mb_cache, struct buffer_head *bh)
|
|
|
{
|
|
|
__u32 hash = le32_to_cpu(BHDR(bh)->h_hash);
|
|
|
struct mb_cache_entry *ce;
|
|
|
int error;
|
|
|
|
|
|
- ce = mb_cache_entry_alloc(ext4_xattr_cache, GFP_NOFS);
|
|
|
+ ce = mb_cache_entry_alloc(ext4_mb_cache, GFP_NOFS);
|
|
|
if (!ce) {
|
|
|
ea_bdebug(bh, "out of memory");
|
|
|
return;
|
|
@@ -1573,12 +1579,13 @@ ext4_xattr_cache_find(struct inode *inode, struct ext4_xattr_header *header,
|
|
|
{
|
|
|
__u32 hash = le32_to_cpu(header->h_hash);
|
|
|
struct mb_cache_entry *ce;
|
|
|
+ struct mb_cache *ext4_mb_cache = EXT4_GET_MB_CACHE(inode);
|
|
|
|
|
|
if (!header->h_hash)
|
|
|
return NULL; /* never share */
|
|
|
ea_idebug(inode, "looking for cached blocks [%x]", (int)hash);
|
|
|
again:
|
|
|
- ce = mb_cache_entry_find_first(ext4_xattr_cache, inode->i_sb->s_bdev,
|
|
|
+ ce = mb_cache_entry_find_first(ext4_mb_cache, inode->i_sb->s_bdev,
|
|
|
hash);
|
|
|
while (ce) {
|
|
|
struct buffer_head *bh;
|
|
@@ -1676,19 +1683,17 @@ static void ext4_xattr_rehash(struct ext4_xattr_header *header,
|
|
|
|
|
|
#undef BLOCK_HASH_SHIFT
|
|
|
|
|
|
-int __init
|
|
|
-ext4_init_xattr(void)
|
|
|
+#define HASH_BUCKET_BITS 10
|
|
|
+
|
|
|
+struct mb_cache *
|
|
|
+ext4_xattr_create_cache(char *name)
|
|
|
{
|
|
|
- ext4_xattr_cache = mb_cache_create("ext4_xattr", 6);
|
|
|
- if (!ext4_xattr_cache)
|
|
|
- return -ENOMEM;
|
|
|
- return 0;
|
|
|
+ return mb_cache_create(name, HASH_BUCKET_BITS);
|
|
|
}
|
|
|
|
|
|
-void
|
|
|
-ext4_exit_xattr(void)
|
|
|
+void ext4_xattr_destroy_cache(struct mb_cache *cache)
|
|
|
{
|
|
|
- if (ext4_xattr_cache)
|
|
|
- mb_cache_destroy(ext4_xattr_cache);
|
|
|
- ext4_xattr_cache = NULL;
|
|
|
+ if (cache)
|
|
|
+ mb_cache_destroy(cache);
|
|
|
}
|
|
|
+
|