ocfs2: add extent block stealing for ocfs2 v4
PATCH 1/1 ocfs2: add extent block stealing for ocfs2 v4
This patch add extent block (metadata) stealing mechanism for extent allocation. This mechanism is same as the inode stealing. if no room in slot specific extent_alloc, we will try to allocate extent block from the next slot.
--- fs/ocfs2/alloc.c | 5 +- fs/ocfs2/dir.c | 2 +- fs/ocfs2/localalloc.c | 2 +- fs/ocfs2/ocfs2.h | 29 +-------- fs/ocfs2/refcounttree.c | 6 +- fs/ocfs2/suballoc.c | 171 ++++++++++++++++++++++++++++++++++++----------- fs/ocfs2/suballoc.h | 1 + fs/ocfs2/super.c | 10 ++- fs/ocfs2/xattr.c | 2 +- 9 files changed, 150 insertions(+), 78 deletions(-)
fs/ocfs2/alloc.c +3 -2
@@ -1050,7 +1050,8 @@ static int ocfs2_create_new_meta_bhs(handle_t *handle,strcpy (eb->h_signature,OCFS2_EXTENT_BLOCK_SIGNATURE ); eb->h_blkno =cpu_to_le64 (first_blkno); eb->h_fs_generation =cpu_to_le32 (osb->fs_generation); - eb->h_suballoc_slot =cpu_to_le16 (osb->slot_num); + eb->h_suballoc_slot = +cpu_to_le16 (meta_ac->ac_alloc_slot); eb->h_suballoc_bit =cpu_to_le16 (suballoc_bit_start); eb->h_list.l_count =cpu_to_le16 (ocfs2_extent_recs_per_eb (osb->sb));
@@ -6037,7 +6038,7 @@ static void ocfs2_truncate_log_worker(struct work_struct *work)if (status <0 )mlog_errno (status);else -ocfs2_init_inode_steal_slot (osb); +ocfs2_init_steal_slot (osb);mlog_exit (status); }
fs/ocfs2/dir.c +1 -1
@@ -2439,7 +2439,7 @@ static int ocfs2_dx_dir_attach_index(struct ocfs2_super *osb, dx_root = (struct ocfs2_dx_root_block *)dx_root_bh->b_data;memset (dx_root,0 , osb->sb->s_blocksize);strcpy (dx_root->dr_signature,OCFS2_DX_ROOT_SIGNATURE ); - dx_root->dr_suballoc_slot =cpu_to_le16 (osb->slot_num); + dx_root->dr_suballoc_slot =cpu_to_le16 (meta_ac->ac_alloc_slot); dx_root->dr_suballoc_bit =cpu_to_le16 (dr_suballoc_bit); dx_root->dr_fs_generation =cpu_to_le32 (osb->fs_generation); dx_root->dr_blkno =cpu_to_le64 (dr_blkno);
fs/ocfs2/localalloc.c +1 -1
@@ -476,7 +476,7 @@ out_mutex: out:if (!status) -ocfs2_init_inode_steal_slot (osb); +ocfs2_init_steal_slot (osb);mlog_exit (status);return status; }
fs/ocfs2/ocfs2.h +2 -27
@@ -301,7 +301,9 @@ struct ocfs2_superu32 s_next_generation;unsigned long osb_flags;s16 s_inode_steal_slot; +s16 s_meta_steal_slot;atomic_t s_num_inodes_stolen; +atomic_t s_num_meta_stolen;unsigned long s_mount_opt;unsigned int s_atime_quantum;
@@ -756,33 +758,6 @@ static inline unsigned int ocfs2_megabytes_to_clusters(struct super_block *sb,return megs << (20 -OCFS2_SB (sb)->s_clustersize_bits); } -static inline void ocfs2_init_inode_steal_slot (struct ocfs2_super *osb) -{ -spin_lock (&osb->osb_lock); - osb->s_inode_steal_slot =OCFS2_INVALID_SLOT ; -spin_unlock (&osb->osb_lock); -atomic_set (&osb->s_num_inodes_stolen,0 ); -} - -static inline void ocfs2_set_inode_steal_slot (struct ocfs2_super *osb, -s16 slot) -{ -spin_lock (&osb->osb_lock); - osb->s_inode_steal_slot = slot; -spin_unlock (&osb->osb_lock); -} - -static inline s16 ocfs2_get_inode_steal_slot (struct ocfs2_super *osb) -{ -s16 slot; - -spin_lock (&osb->osb_lock); - slot = osb->s_inode_steal_slot; -spin_unlock (&osb->osb_lock); - -return slot; -} -#define ocfs2_set_bit ext2_set_bit#define ocfs2_clear_bit ext2_clear_bit#define ocfs2_test_bit ext2_test_bit
fs/ocfs2/refcounttree.c +3 -3
@@ -626,7 +626,7 @@ static int ocfs2_create_refcount_tree(struct inode *inode, rb = (struct ocfs2_refcount_block *)new_bh->b_data;memset (rb,0 , inode->i_sb->s_blocksize);strcpy ((void *)rb,OCFS2_REFCOUNT_BLOCK_SIGNATURE ); - rb->rf_suballoc_slot =cpu_to_le16 (osb->slot_num); + rb->rf_suballoc_slot =cpu_to_le16 (meta_ac->ac_alloc_slot); rb->rf_suballoc_bit =cpu_to_le16 (suballoc_bit_start); rb->rf_fs_generation =cpu_to_le32 (osb->fs_generation); rb->rf_blkno =cpu_to_le64 (first_blkno);
@@ -1330,7 +1330,7 @@ static int ocfs2_expand_inline_ref_root(handle_t *handle,memcpy (new_bh->b_data, ref_root_bh->b_data, sb->s_blocksize); new_rb = (struct ocfs2_refcount_block *)new_bh->b_data; - new_rb->rf_suballoc_slot =cpu_to_le16 (OCFS2_SB (sb)->slot_num); + new_rb->rf_suballoc_slot =cpu_to_le16 (meta_ac->ac_alloc_slot); new_rb->rf_suballoc_bit =cpu_to_le16 (suballoc_bit_start); new_rb->rf_blkno =cpu_to_le64 (blkno); new_rb->rf_cpos =cpu_to_le32 (0 );
@@ -1576,7 +1576,7 @@ static int ocfs2_new_leaf_refcount_block(handle_t *handle, new_rb = (struct ocfs2_refcount_block *)new_bh->b_data;memset (new_rb,0 , sb->s_blocksize);strcpy ((void *)new_rb,OCFS2_REFCOUNT_BLOCK_SIGNATURE ); - new_rb->rf_suballoc_slot =cpu_to_le16 (OCFS2_SB (sb)->slot_num); + new_rb->rf_suballoc_slot =cpu_to_le16 (meta_ac->ac_alloc_slot); new_rb->rf_suballoc_bit =cpu_to_le16 (suballoc_bit_start); new_rb->rf_fs_generation =cpu_to_le32 (OCFS2_SB (sb)->fs_generation); new_rb->rf_blkno =cpu_to_le64 (blkno);
fs/ocfs2/suballoc.c +131 -40
226 lines not on this page · raw message
fs/ocfs2/suballoc.h +1 -0
@@ -56,6 +56,7 @@ struct ocfs2_alloc_context {is the same as ~0 - unlimited */ }; +void ocfs2_init_steal_slot (struct ocfs2_super *osb);void ocfs2_free_alloc_context (struct ocfs2_alloc_context *ac);static inline int ocfs2_alloc_context_bits_left (struct ocfs2_alloc_context *ac) {
fs/ocfs2/super.c +7 -3
@@ -69,6 +69,7 @@#include "xattr.h" #include "quota.h" #include "refcounttree.h" +#include "suballoc.h" #include "buffer_head_io.h"
@@ -301,9 +302,12 @@ static int ocfs2_osb_dump(struct ocfs2_super *osb, char *buf, int len)spin_lock (&osb->osb_lock); out +=snprintf (buf + out, len - out, -"%10s => Slot: %d NumStolen: %d\n" ,"Steal" , +"%10s => InodeSlot: %d StolenInodes: %d, " +"MetaSlot: %d StolenMeta: %d\n" ,"Steal" , osb->s_inode_steal_slot, -atomic_read (&osb->s_num_inodes_stolen)); +atomic_read (&osb->s_num_inodes_stolen), + osb->s_meta_steal_slot, +atomic_read (&osb->s_num_meta_stolen));spin_unlock (&osb->osb_lock); out +=snprintf (buf + out, len - out,"OrphanScan => " );
@@ -1997,7 +2001,7 @@ static int ocfs2_initialize_super(struct super_block *sb, osb->blocked_lock_count =0 ;spin_lock_init (&osb->osb_lock);spin_lock_init (&osb->osb_xattr_lock); -ocfs2_init_inode_steal_slot (osb); +ocfs2_init_steal_slot (osb);atomic_set (&osb->alloc_stats.moves,0 );atomic_set (&osb->alloc_stats.local_data,0 );
fs/ocfs2/xattr.c +1 -1
@@ -2282,7 +2282,7 @@ static int ocfs2_create_xattr_block(handle_t *handle, xblk = (struct ocfs2_xattr_block *)new_bh->b_data;memset (xblk,0 , inode->i_sb->s_blocksize);strcpy ((void *)xblk,OCFS2_XATTR_BLOCK_SIGNATURE ); - xblk->xb_suballoc_slot =cpu_to_le16 (osb->slot_num); + xblk->xb_suballoc_slot =cpu_to_le16 (meta_ac->ac_alloc_slot); xblk->xb_suballoc_bit =cpu_to_le16 (suballoc_bit_start); xblk->xb_fs_generation =cpu_to_le32 (osb->fs_generation); xblk->xb_blkno =cpu_to_le64 (first_blkno);
Signature · 1 line
1.5.4.3
PATCH 1/1 ocfs2: add extent block stealing for ocfs2 v4
fs/ocfs2/suballoc.c bail: · line 660
Quoted 5 lines · Tiger Yang
fs/ocfs2/suballoc.c +5
-0+void ocfs2_init_steal_slot (struct ocfs2_super *osb) +{ +ocfs2_init_inode_steal_slot (osb); +ocfs2_init_meta_steal_slot (osb); +}
This should be ocfs2_init_steal_slots(). 'slots', not 'slot',
because it is plural.
Quoted 16 lines
int ocfs2_reserve_new_metadata_blocks(struct
ocfs2_super*osb,fs/ocfs2/suballoc.c +1
-2int blocks, struct ocfs2_alloc_context **ac) { int status; -u32 slot; +int slot =ocfs2_get_meta_steal_slot (osb); *ac =kzalloc (sizeof (struct ocfs2_alloc_context ),GFP_KERNEL );if (!(*ac)) {@@ -653,12 +754,34 @@ int ocfs2_reserve_new_metadata_blocks(struct ocfs2_super *osb, (*ac)->ac_bits_wanted = blocks; (*ac)->ac_which =OCFS2_AC_USE_META ; - slot = osb->slot_num; (*ac)->ac_group_search = ocfs2_block_group_search;
fs/ocfs2/suballoc.c int ocfs2_reserve_new_metadata_blocks(struct ocfs2_super *osb, · line 766
Quoted 10 lines
fs/ocfs2/suballoc.c +6
-1+if (slot !=OCFS2_INVALID_SLOT && +atomic_read (&osb->s_num_meta_stolen) <OCFS2_MAX_TO_STEAL ) + goto extent_steal; + +atomic_set (&osb->s_num_meta_stolen,0 ); status = ocfs2_reserve_suballoc_bits(osb, (*ac), EXTENT_ALLOC_SYSTEM_INODE, - slot,NULL ,ALLOC_NEW_GROUP ); + (u32)osb->slot_num, NULL,
The int-vs-u32 casting is weird. Note sure what to make of it.
Why does ocfs2_reserve_suballoc_bits() take a u32 instead of an int?
Joel
Signature · 8 lines
"Against stupidity the Gods themselves contend in vain." - Friedrich von Schiller Joel Becker Principal Software Developer Oracle E-mail: joel.becker at oracle.com Phone: (650) 506-8127
PATCH 1/1 ocfs2: add extent block stealing for ocfs2 v4
Quoted 8 lines · Joel Becker
fs/ocfs2/suballoc.c int ocfs2_reserve_new_metadata_blocks(struct ocfs2_super *osb, · line 766
Quoted 5 lines
fs/ocfs2/suballoc.c +2
-1+atomic_set (&osb->s_num_meta_stolen,0 ); status = ocfs2_reserve_suballoc_bits(osb, (*ac), EXTENT_ALLOC_SYSTEM_INODE, - slot,NULL ,ALLOC_NEW_GROUP ); + (u32)osb->slot_num, NULL,The int-vs-u32 casting is weird. Note sure what to make of it.
Why doesocfs2_reserve_suballoc_bits()take a u32 instead of an int?
Oh, because the alloc context has a u32. I blame someone. But
let's leave it as you have it for now.
Joel
Signature · 9 lines
"Depend on the rabbit's foot if you will, but remember, it didn't help the rabbit." - R. E. Shay Joel Becker Principal Software Developer Oracle E-mail: joel.becker at oracle.com Phone: (650) 506-8127