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 dir_context ctx;
|
||||||
struct inode *head;
|
struct inode *head;
|
||||||
struct ocfs2_super *osb;
|
struct ocfs2_super *osb;
|
||||||
|
enum ocfs2_orphan_reco_type orphan_reco_type;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int ocfs2_orphan_filldir(struct dir_context *ctx, const char *name,
|
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))
|
if (name_len == 2 && !strncmp("..", name, 2))
|
||||||
return 0;
|
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 */
|
/* Skip bad inodes so that recovery can continue */
|
||||||
iter = ocfs2_iget(p->osb, ino,
|
iter = ocfs2_iget(p->osb, ino,
|
||||||
OCFS2_FI_FLAG_ORPHAN_RECOVERY, 0);
|
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,
|
static int ocfs2_queue_orphans(struct ocfs2_super *osb,
|
||||||
int slot,
|
int slot,
|
||||||
struct inode **head)
|
struct inode **head,
|
||||||
|
enum ocfs2_orphan_reco_type orphan_reco_type)
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
struct inode *orphan_dir_inode = NULL;
|
struct inode *orphan_dir_inode = NULL;
|
||||||
struct ocfs2_orphan_filldir_priv priv = {
|
struct ocfs2_orphan_filldir_priv priv = {
|
||||||
.ctx.actor = ocfs2_orphan_filldir,
|
.ctx.actor = ocfs2_orphan_filldir,
|
||||||
.osb = osb,
|
.osb = osb,
|
||||||
.head = *head
|
.head = *head,
|
||||||
|
.orphan_reco_type = orphan_reco_type
|
||||||
};
|
};
|
||||||
|
|
||||||
orphan_dir_inode = ocfs2_get_system_file_inode(osb,
|
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);
|
trace_ocfs2_recover_orphans(slot);
|
||||||
|
|
||||||
ocfs2_mark_recovering_orphan_dir(osb, 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);
|
ocfs2_clear_recovering_orphan_dir(osb, slot);
|
||||||
|
|
||||||
/* Error here should be noted, but we want to continue with as
|
/* 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);
|
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 */
|
/* An orphan dir name is an 8 byte value, printed as a hex string */
|
||||||
#define OCFS2_ORPHAN_NAMELEN ((int)(2 * sizeof(u64)))
|
#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,
|
static struct dentry *ocfs2_lookup(struct inode *dir, struct dentry *dentry,
|
||||||
unsigned int flags)
|
unsigned int flags)
|
||||||
|
@ -26,6 +26,9 @@
|
|||||||
#ifndef OCFS2_NAMEI_H
|
#ifndef OCFS2_NAMEI_H
|
||||||
#define 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;
|
extern const struct inode_operations ocfs2_dir_iops;
|
||||||
|
|
||||||
struct dentry *ocfs2_get_parent(struct dentry *child);
|
struct dentry *ocfs2_get_parent(struct dentry *child);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user