[Ocfs2-devel] [PATCH 4/4] ocfs2: limit the number of inodes in orphanscan

Wengang Wang wen.gang.wang at oracle.com
Fri Jul 29 03:06:23 PDT 2011


During orphanscan, limit the scan number in a single loop to avoid OOM.

Signed-off-by: Wengang Wang <wen.gang.wang at oracle.com>
---
 fs/ocfs2/journal.c |    9 +++++++++
 1 files changed, 9 insertions(+), 0 deletions(-)

diff --git a/fs/ocfs2/journal.c b/fs/ocfs2/journal.c
index 7d4e1ca..1c0487b 100644
--- a/fs/ocfs2/journal.c
+++ b/fs/ocfs2/journal.c
@@ -56,6 +56,7 @@
 DEFINE_SPINLOCK(trans_inc_lock);
 
 #define ORPHAN_SCAN_SCHEDULE_TIMEOUT 300000
+#define ORPHAN_SCAN_ITEMS_PER_LOOP 1000
 
 static int ocfs2_force_read_journal(struct inode *inode);
 static int ocfs2_recover_node(struct ocfs2_super *osb,
@@ -1926,6 +1927,7 @@ struct ocfs2_orphan_filldir_priv {
 	struct inode		*head;
 	struct ocfs2_super	*osb;
 	struct 			inode *orphan_dir;
+	int			count;
 };
 
 static int ocfs2_orphan_filldir(void *priv, const char *name, int name_len,
@@ -1964,6 +1966,12 @@ static int ocfs2_orphan_filldir(void *priv, const char *name, int name_len,
 	}
 	spin_unlock(&o_orphandir->ip_lock);
 
+	/*
+	 * reading limited number of inodes in a single loop to avoid OOM
+	 */
+	if ( ++p->count == ORPHAN_SCAN_ITEMS_PER_LOOP )
+		return -EAGAIN;
+
 	return 0;
 }
 
@@ -1978,6 +1986,7 @@ static int ocfs2_queue_orphans(struct ocfs2_super *osb,
 
 	priv.osb = osb;
 	priv.head = *head;
+	priv.count = 0;
 
 	orphan_dir_inode = ocfs2_get_system_file_inode(osb,
 						       ORPHAN_DIR_SYSTEM_INODE,
-- 
1.7.5.2




More information about the Ocfs2-devel mailing list