[Ocfs2-devel] [PATCH 3/3] Add inode stealing for
ocfs2_reserve_new_inode.V4
Mark Fasheh
mark.fasheh at oracle.com
Tue Mar 4 16:44:12 PST 2008
On Tue, Mar 04, 2008 at 04:55:25PM +0800, tao.ma wrote:
> Modified as Sunil suggested.
>
> 2 new variables are added. They are:
> 1) ocfs2_super->s_inode_steal_slot. It is initalized as invalid and only
> set valid when we steal inode from other slots successfully. When we
> flush the truncate log, complete local alloc recovery or allocate
> from our own slot successfully, it will be reset to invalid.
> 2) ocfs2_super->s_num_inodes_stolen. It is used to record the times we try
> to steal inode from other nodes. And it is increased no matter whether
> our steal succeed or not. It is reset to zero when we try to allocate
> from our own slot or reset the s_inode_steal_slot.
>
> So with this 2 new variables, now the whole inode allocation process is:
> 1. Check whether the s_inode_steal_slot is valid. If it is invalid, goto
> step 2, that is to try to allocate from our own. If it is valid, then
> we must have stealed inode successfully just now, so verify whether we
> have steal "s_num_inodes_stolen". If yes, goto step 2 since now we need
> to try own slot in case there is some space for us. If not, goto step 3
> and steal from other nodes directly.
> 2. Allocate from its own inode_alloc:000X and zero s_num_inodes_stolen.
> 1) If we can reserve, OK.
> 2) If fails, try to allocate a large chunk and reserve once again.
> 3) If OK, clear s_inode_steal_slot and exit directly.
> 3. Try to allocate from other nodes.
> 1) If s_inode_steal_slot is valid, start from that node, otherwise
> start from the node next to us. This time, Just try to reserve in
> inode_alloc, we don't go for global_bitmap if this node also can't
> allocate the inode.
> 3) Try the node next to it until we reach the first steal slot again.
> 4) If we succeed in one node's inode_alloc, set s_inode_steal_slot to it.
> 5) increase s_num_inodes_stolen.
>
> Signed-off-by: Tao Ma <tao.ma at oracle.com>
Ok, this is all in ocfs2.git now. I made the following changes though, so
please verify.
--Mark
--
Mark Fasheh
Principal Software Developer, Oracle
mark.fasheh at oracle.com
diff --git a/fs/ocfs2/ocfs2.h b/fs/ocfs2/ocfs2.h
index e9ad7f9..0273a55 100644
--- a/fs/ocfs2/ocfs2.h
+++ b/fs/ocfs2/ocfs2.h
@@ -178,8 +178,6 @@ enum ocfs2_mount_options
#define OCFS2_OSB_ERROR_FS 0x0004
#define OCFS2_DEFAULT_ATIME_QUANTUM 60
-#define OCFS2_NUM_INODES_STOLEN 10
-
struct ocfs2_journal;
struct ocfs2_super
{
diff --git a/fs/ocfs2/suballoc.c b/fs/ocfs2/suballoc.c
index 2fcefab..2a61875 100644
--- a/fs/ocfs2/suballoc.c
+++ b/fs/ocfs2/suballoc.c
@@ -49,6 +49,8 @@
#define NOT_ALLOC_NEW_GROUP 0
#define ALLOC_NEW_GROUP 1
+#define OCFS2_MAX_INODES_TO_STEAL 1024
+
static inline void ocfs2_debug_bg(struct ocfs2_group_desc *bg);
static inline void ocfs2_debug_suballoc_inode(struct ocfs2_dinode *fe);
static inline u16 ocfs2_find_victim_chain(struct ocfs2_chain_list *cl);
@@ -591,7 +593,7 @@ int ocfs2_reserve_new_inode(struct ocfs2_super *osb,
* need to check our slots to see whether there is some space for us.
*/
if (slot != OCFS2_INVALID_SLOT &&
- atomic_read(&osb->s_num_inodes_stolen) < OCFS2_NUM_INODES_STOLEN)
+ atomic_read(&osb->s_num_inodes_stolen) < OCFS2_MAX_INODES_TO_STEAL)
goto inode_steal;
atomic_set(&osb->s_num_inodes_stolen, 0);
diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c
index c4e82c7..c4e7c97 100644
--- a/fs/ocfs2/super.c
+++ b/fs/ocfs2/super.c
@@ -1405,6 +1405,8 @@ static int ocfs2_initialize_super(struct super_block *sb,
osb->local_alloc_state = OCFS2_LA_UNUSED;
osb->local_alloc_bh = NULL;
+ osb->s_num_inodes_stolen = ATOMIC_INIT(0);
+
ocfs2_setup_hb_callbacks(osb);
init_waitqueue_head(&osb->osb_mount_event);
More information about the Ocfs2-devel
mailing list