From: girish Date: Sat, 15 Sep 2007 09:30:49 +0000 (+0000) Subject: Atomic bit operations in mballoc. X-Git-Tag: v1_7_0_51~730 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=aaddc99c03bc7137c70bd5c7965f23c19781bd62 Atomic bit operations in mballoc. Merged with mballoc patch. Original patch by: johann b=10995 i=adilger, alex --- diff --git a/ldiskfs/kernel_patches/patches/ext3-mballoc3-core.patch b/ldiskfs/kernel_patches/patches/ext3-mballoc3-core.patch index 9f8f7e3..0dc6bbc 100644 --- a/ldiskfs/kernel_patches/patches/ext3-mballoc3-core.patch +++ b/ldiskfs/kernel_patches/patches/ext3-mballoc3-core.patch @@ -1,8 +1,8 @@ Index: linux-2.6.9-full/include/linux/ext3_fs.h =================================================================== ---- linux-2.6.9-full.orig/include/linux/ext3_fs.h 2007-06-08 23:44:08.000000000 +0400 -+++ linux-2.6.9-full/include/linux/ext3_fs.h 2007-07-19 09:39:07.000000000 +0400 -@@ -57,6 +57,30 @@ struct statfs; +--- linux-2.6.9-full.orig/include/linux/ext3_fs.h ++++ linux-2.6.9-full/include/linux/ext3_fs.h +@@ -53,6 +53,30 @@ #define ext3_debug(f, a...) do {} while (0) #endif @@ -33,7 +33,7 @@ Index: linux-2.6.9-full/include/linux/ext3_fs.h /* * Special inodes numbers */ -@@ -387,6 +411,14 @@ struct ext3_inode { +@@ -398,6 +422,14 @@ struct ext3_inode { #define ext3_find_first_zero_bit ext2_find_first_zero_bit #define ext3_find_next_zero_bit ext2_find_next_zero_bit @@ -48,7 +48,7 @@ Index: linux-2.6.9-full/include/linux/ext3_fs.h /* * Maximal mount counts between two filesystem checks */ -@@ -763,6 +795,20 @@ extern unsigned long ext3_count_dirs (st +@@ -799,6 +831,20 @@ extern unsigned long ext3_count_dirs (st extern void ext3_check_inodes_bitmap (struct super_block *); extern unsigned long ext3_count_free (struct buffer_head *, unsigned); @@ -68,14 +68,14 @@ Index: linux-2.6.9-full/include/linux/ext3_fs.h + /* inode.c */ - extern int ext3_block_truncate_page(handle_t *, struct page *, + int ext3_forget(handle_t *handle, int is_metadata, struct inode *inode, Index: linux-2.6.9-full/include/linux/ext3_fs_sb.h =================================================================== ---- linux-2.6.9-full.orig/include/linux/ext3_fs_sb.h 2007-06-08 23:44:07.000000000 +0400 -+++ linux-2.6.9-full/include/linux/ext3_fs_sb.h 2007-07-19 09:39:07.000000000 +0400 -@@ -81,6 +81,61 @@ struct ext3_sb_info { - char *s_qf_names[MAXQUOTAS]; /* Names of quota files with journalled quota */ - int s_jquota_fmt; /* Format of quota to use */ +--- linux-2.6.9-full.orig/include/linux/ext3_fs_sb.h ++++ linux-2.6.9-full/include/linux/ext3_fs_sb.h +@@ -88,6 +88,61 @@ struct ext3_sb_info { + unsigned long s_ext_blocks; + unsigned long s_ext_extents; #endif + + /* for buddy allocator */ @@ -137,9 +137,9 @@ Index: linux-2.6.9-full/include/linux/ext3_fs_sb.h #endif /* _LINUX_EXT3_FS_SB */ Index: linux-2.6.9-full/fs/ext3/super.c =================================================================== ---- linux-2.6.9-full.orig/fs/ext3/super.c 2007-06-08 23:44:08.000000000 +0400 -+++ linux-2.6.9-full/fs/ext3/super.c 2007-07-19 09:39:07.000000000 +0400 -@@ -394,6 +394,7 @@ void ext3_put_super (struct super_block +--- linux-2.6.9-full.orig/fs/ext3/super.c ++++ linux-2.6.9-full/fs/ext3/super.c +@@ -391,6 +391,7 @@ static void ext3_put_super (struct super struct ext3_super_block *es = sbi->s_es; int i; @@ -147,16 +147,16 @@ Index: linux-2.6.9-full/fs/ext3/super.c ext3_ext_release(sb); ext3_xattr_put_super(sb); journal_destroy(sbi->s_journal); -@@ -463,6 +464,8 @@ static struct inode *ext3_alloc_inode(st +@@ -458,6 +459,8 @@ static struct inode *ext3_alloc_inode(st ei->vfs_inode.i_version = 1; - + memset(&ei->i_cached_extent, 0, sizeof(ei->i_cached_extent)); + INIT_LIST_HEAD(&ei->i_prealloc_list); + spin_lock_init(&ei->i_prealloc_lock); return &ei->vfs_inode; } -@@ -2576,7 +2579,13 @@ static struct file_system_type ext3_fs_t +@@ -2763,7 +2766,13 @@ static struct file_system_type ext3_fs_t static int __init init_ext3_fs(void) { @@ -171,19 +171,19 @@ Index: linux-2.6.9-full/fs/ext3/super.c if (err) return err; err = init_inodecache(); -@@ -2598,6 +2607,7 @@ static void __exit exit_ext3_fs(void) +@@ -2785,6 +2794,7 @@ static void __exit exit_ext3_fs(void) unregister_filesystem(&ext3_fs_type); destroy_inodecache(); exit_ext3_xattr(); + exit_ext3_proc(); } - int ext3_prep_san_write(struct inode *inode, long *blocks, + int ext3_map_inode_page(struct inode *inode, struct page *page, Index: linux-2.6.9-full/fs/ext3/mballoc.c =================================================================== ---- linux-2.6.9-full.orig/fs/ext3/mballoc.c 2007-07-14 04:24:39.138985848 +0400 -+++ linux-2.6.9-full/fs/ext3/mballoc.c 2007-07-20 11:31:03.000000000 +0400 -@@ -0,0 +1,4392 @@ +--- /dev/null ++++ linux-2.6.9-full/fs/ext3/mballoc.c +@@ -0,0 +1,4395 @@ +/* + * Copyright (c) 2003-2006, Cluster File Systems, Inc, info@clusterfs.com + * Written by Alex Tomas @@ -742,10 +742,10 @@ Index: linux-2.6.9-full/fs/ext3/mballoc.c + ext2_set_bit(bit, addr); +} + -+static inline void mb_set_bit_atomic(int bit, void *addr) ++static inline void mb_set_bit_atomic(spinlock_t *lock, int bit, void *addr) +{ + mb_correct_addr_and_bit(bit,addr); -+ ext2_set_bit_atomic(NULL, bit, addr); ++ ext2_set_bit_atomic(lock, bit, addr); +} + +static inline void mb_clear_bit(int bit, void *addr) @@ -754,10 +754,10 @@ Index: linux-2.6.9-full/fs/ext3/mballoc.c + ext2_clear_bit(bit, addr); +} + -+static inline void mb_clear_bit_atomic(int bit, void *addr) ++static inline void mb_clear_bit_atomic(spinlock_t *lock, int bit, void *addr) +{ + mb_correct_addr_and_bit(bit,addr); -+ ext2_clear_bit_atomic(NULL, bit, addr); ++ ext2_clear_bit_atomic(lock, bit, addr); +} + +static inline int mb_find_next_zero_bit(void *addr, int max, int start) @@ -1328,7 +1328,7 @@ Index: linux-2.6.9-full/fs/ext3/mballoc.c + return 0; +} + -+static inline void mb_clear_bits(void *bm, int cur, int len) ++static inline void mb_clear_bits(spinlock_t *lock, void *bm, int cur, int len) +{ + __u32 *addr; + @@ -1341,12 +1341,12 @@ Index: linux-2.6.9-full/fs/ext3/mballoc.c + cur += 32; + continue; + } -+ mb_clear_bit_atomic(cur, bm); ++ mb_clear_bit_atomic(lock, cur, bm); + cur++; + } +} + -+static inline void mb_set_bits(void *bm, int cur, int len) ++static inline void mb_set_bits(spinlock_t *lock, void *bm, int cur, int len) +{ + __u32 *addr; + @@ -1359,7 +1359,7 @@ Index: linux-2.6.9-full/fs/ext3/mballoc.c + cur += 32; + continue; + } -+ mb_set_bit_atomic(cur, bm); ++ mb_set_bit_atomic(lock, cur, bm); + cur++; + } +} @@ -1566,7 +1566,8 @@ Index: linux-2.6.9-full/fs/ext3/mballoc.c + e3b->bd_info->bb_counters[ord]++; + } + -+ mb_set_bits(EXT3_MB_BITMAP(e3b), ex->fe_start, len0); ++ mb_set_bits(sb_bgl_lock(EXT3_SB(e3b->bd_sb), ex->fe_group), ++ EXT3_MB_BITMAP(e3b), ex->fe_start, len0); + mb_check_buddy(e3b); + + return ret; @@ -3142,7 +3143,8 @@ Index: linux-2.6.9-full/fs/ext3/mballoc.c + } + } +#endif -+ mb_set_bits(bitmap_bh->b_data, ac->ac_b_ex.fe_start, ac->ac_b_ex.fe_len); ++ mb_set_bits(sb_bgl_lock(sbi, ac->ac_b_ex.fe_group), bitmap_bh->b_data, ++ ac->ac_b_ex.fe_start, ac->ac_b_ex.fe_len); + + spin_lock(sb_bgl_lock(sbi, ac->ac_b_ex.fe_group)); + gdp->bg_free_blocks_count = @@ -3516,7 +3518,7 @@ Index: linux-2.6.9-full/fs/ext3/mballoc.c + len = pa->pa_len; + spin_unlock(&pa->pa_lock); + BUG_ON(groupnr != group); -+ mb_set_bits(bitmap, start, len); ++ mb_set_bits(sb_bgl_lock(EXT3_SB(sb), group), bitmap, start,len); + preallocated += len; + count++; + } @@ -4527,7 +4529,8 @@ Index: linux-2.6.9-full/fs/ext3/mballoc.c + BUG_ON(!mb_test_bit(bit + i, bitmap_bh->b_data)); + } +#endif -+ mb_clear_bits(bitmap_bh->b_data, bit, count); ++ mb_clear_bits(sb_bgl_lock(sbi, block_group), bitmap_bh->b_data, bit, ++ count); + + /* We dirtied the bitmap block */ + BUFFER_TRACE(bitmap_bh, "dirtied bitmap block");