ocfs2: do not include dio entry in case of orphan scan
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>
This commit is contained in:
parent
1d1aff8cf3
commit
30edc43c7f
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue