@ -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 ) ;
}