ocfs2: do not include dio entry in case of orphan scan
authorJoseph Qi <joseph.qi@huawei.com>
Fri, 6 Nov 2015 02:44:01 +0000 (18:44 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 6 Nov 2015 03:34:48 +0000 (19:34 -0800)
dio entry will only do truncate in case of ORPHAN_NEED_TRUNCATE. So do
not include it when doing normal orphan scan to reduce contention.

Signed-off-by: Joseph Qi <joseph.qi@huawei.com>
Cc: Mark Fasheh <mfasheh@suse.de>
Cc: Joel Becker <jlbec@evilplan.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
fs/ocfs2/journal.c
fs/ocfs2/namei.c
fs/ocfs2/namei.h

index ff82b28..4bac600 100644 (file)
@@ -2021,6 +2021,7 @@ struct ocfs2_orphan_filldir_priv {
        struct dir_context      ctx;
        struct inode            *head;
        struct ocfs2_super      *osb;
+       enum ocfs2_orphan_reco_type orphan_reco_type;
 };
 
 static int ocfs2_orphan_filldir(struct dir_context *ctx, const char *name,
@@ -2036,6 +2037,12 @@ static int ocfs2_orphan_filldir(struct dir_context *ctx, const char *name,
        if (name_len == 2 && !strncmp("..", name, 2))
                return 0;
 
+       /* do not include dio entry in case of orphan scan */
+       if ((p->orphan_reco_type == ORPHAN_NO_NEED_TRUNCATE) &&
+                       (!strncmp(name, OCFS2_DIO_ORPHAN_PREFIX,
+                       OCFS2_DIO_ORPHAN_PREFIX_LEN)))
+               return 0;
+
        /* Skip bad inodes so that recovery can continue */
        iter = ocfs2_iget(p->osb, ino,
                          OCFS2_FI_FLAG_ORPHAN_RECOVERY, 0);
@@ -2060,14 +2067,16 @@ static int ocfs2_orphan_filldir(struct dir_context *ctx, const char *name,
 
 static int ocfs2_queue_orphans(struct ocfs2_super *osb,
                               int slot,
-                              struct inode **head)
+                              struct inode **head,
+                              enum ocfs2_orphan_reco_type orphan_reco_type)
 {
        int status;
        struct inode *orphan_dir_inode = NULL;
        struct ocfs2_orphan_filldir_priv priv = {
                .ctx.actor = ocfs2_orphan_filldir,
                .osb = osb,
-               .head = *head
+               .head = *head,
+               .orphan_reco_type = orphan_reco_type
        };
 
        orphan_dir_inode = ocfs2_get_system_file_inode(osb,
@@ -2170,7 +2179,7 @@ static int ocfs2_recover_orphans(struct ocfs2_super *osb,
        trace_ocfs2_recover_orphans(slot);
 
        ocfs2_mark_recovering_orphan_dir(osb, slot);
-       ret = ocfs2_queue_orphans(osb, slot, &inode);
+       ret = ocfs2_queue_orphans(osb, slot, &inode, orphan_reco_type);
        ocfs2_clear_recovering_orphan_dir(osb, slot);
 
        /* Error here should be noted, but we want to continue with as
index b7dfac2..1206392 100644 (file)
@@ -106,8 +106,6 @@ static int ocfs2_double_lock(struct ocfs2_super *osb,
 static void ocfs2_double_unlock(struct inode *inode1, struct inode *inode2);
 /* An orphan dir name is an 8 byte value, printed as a hex string */
 #define OCFS2_ORPHAN_NAMELEN ((int)(2 * sizeof(u64)))
-#define OCFS2_DIO_ORPHAN_PREFIX "dio-"
-#define OCFS2_DIO_ORPHAN_PREFIX_LEN 4
 
 static struct dentry *ocfs2_lookup(struct inode *dir, struct dentry *dentry,
                                   unsigned int flags)
index e173329..1155918 100644 (file)
@@ -26,6 +26,9 @@
 #ifndef OCFS2_NAMEI_H
 #define OCFS2_NAMEI_H
 
+#define OCFS2_DIO_ORPHAN_PREFIX "dio-"
+#define OCFS2_DIO_ORPHAN_PREFIX_LEN 4
+
 extern const struct inode_operations ocfs2_dir_iops;
 
 struct dentry *ocfs2_get_parent(struct dentry *child);