1) New debug sub-system - 'D_LFSCK'
For Lustre fsck/scrub running trace.
2) New MDT mount option - 'noscrub'
To disable auto triggering OI scrub when MDT mounts up
or by RPC which accesses inconsistent OI mapping entry.
3) Any object which will be used when Lustre server mounts
should not be added into OI files to guarantee that the
Lustre server can start up even though OI files corrupt.
Signed-off-by: Fan Yong <yong.fan@whamcloud.com>
Change-Id: I482fb0e076c296bb8690ed200c569001a9cb78f5
Reviewed-on: http://review.whamcloud.com/2550
Tested-by: Hudson
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Alex Zhuravlev <bzzz@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
/*
* Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
/*
* Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright (c) 2012 Whamcloud, Inc.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
*/
/*
* This file is part of Lustre, http://www.lustre.org/
#define D_CONSOLE 0x02000000
#define D_QUOTA 0x04000000
#define D_SEC 0x08000000
#define D_CONSOLE 0x02000000
#define D_QUOTA 0x04000000
#define D_SEC 0x08000000
+#define D_LFSCK 0x10000000 /* For both OI scrub and LFSCK */
/* keep these in sync with lnet/{utils,libcfs}/debug.c */
#define D_HSM D_TRACE
/* keep these in sync with lnet/{utils,libcfs}/debug.c */
#define D_HSM D_TRACE
* Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
* Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
- * Copyright (c) 2011, Whamcloud, Inc.
+ * Copyright (c) 2011, 2012, Whamcloud, Inc.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
*/
/*
* This file is part of Lustre, http://www.lustre.org/
return "quota";
case D_SEC:
return "sec";
return "quota";
case D_SEC:
return "sec";
+ case D_LFSCK:
+ return "lfsck";
existing MGS services */
#define LMD_FLG_WRITECONF 0x0040 /* Rewrite config log */
#define LMD_FLG_NOIR 0x0080 /* NO imperative recovery */
existing MGS services */
#define LMD_FLG_WRITECONF 0x0040 /* Rewrite config log */
#define LMD_FLG_NOIR 0x0080 /* NO imperative recovery */
+#define LMD_FLG_NOSCRUB 0x0100 /* Do not trigger scrub automatically */
#define lmd_is_client(x) ((x)->lmd_flags & LMD_FLG_CLIENT)
#define lmd_is_client(x) ((x)->lmd_flags & LMD_FLG_CLIENT)
#define s2lsi_nocast(sb) ((sb)->s_fs_info)
#define get_profile_name(sb) (s2lsi(sb)->lsi_lmd->lmd_profile)
#define s2lsi_nocast(sb) ((sb)->s_fs_info)
#define get_profile_name(sb) (s2lsi(sb)->lsi_lmd->lmd_profile)
+#define get_mount_flags(sb) (s2lsi(sb)->lsi_lmd->lmd_flags)
+static inline int thread_is_init(struct ptlrpc_thread *thread)
+{
+ return thread->t_flags == 0;
+}
+
static inline int thread_is_stopped(struct ptlrpc_thread *thread)
{
return !!(thread->t_flags & SVC_STOPPED);
static inline int thread_is_stopped(struct ptlrpc_thread *thread)
{
return !!(thread->t_flags & SVC_STOPPED);
} else if (strncmp(s1, "nomgs", 5) == 0) {
lmd->lmd_flags |= LMD_FLG_NOMGS;
clear++;
} else if (strncmp(s1, "nomgs", 5) == 0) {
lmd->lmd_flags |= LMD_FLG_NOMGS;
clear++;
+ } else if (strncmp(s1, "noscrub", 7) == 0) {
+ lmd->lmd_flags |= LMD_FLG_NOSCRUB;
+ clear++;
} else if (strncmp(s1, "writeconf", 9) == 0) {
lmd->lmd_flags |= LMD_FLG_WRITECONF;
clear++;
} else if (strncmp(s1, "writeconf", 9) == 0) {
lmd->lmd_flags |= LMD_FLG_WRITECONF;
clear++;
name = oid2name(fid_oid(fid));
if (name == NULL || strlen(name) == 0)
name = oid2name(fid_oid(fid));
if (name == NULL || strlen(name) == 0)
dentry = ll_lookup_one_len(name, osd_sb(osd)->s_root, strlen(name));
if (!IS_ERR(dentry)) {
dentry = ll_lookup_one_len(name, osd_sb(osd)->s_root, strlen(name));
if (!IS_ERR(dentry)) {
id->oii_ino = inode->i_ino;
id->oii_gen = inode->i_generation;
} else {
id->oii_ino = inode->i_ino;
id->oii_gen = inode->i_generation;
} else {
- if (unlikely(fid_seq(fid) == FID_SEQ_LOCAL_FILE)) {
- rc = osd_compat_spec_lookup(info, osd, fid, id);
- if (rc == 0 || rc != -ERESTART)
- goto out;
- }
+ if (unlikely(fid_seq(fid) == FID_SEQ_LOCAL_FILE))
+ return osd_compat_spec_lookup(info, osd, fid, id);
fid_cpu_to_be(oi_fid, fid);
key = (struct dt_key *)oi_fid;
fid_cpu_to_be(oi_fid, fid);
key = (struct dt_key *)oi_fid;
struct osd_inode_id *id;
const struct dt_key *key;
struct osd_inode_id *id;
const struct dt_key *key;
- if (fid_is_igif(fid))
- return 0;
+ if (fid_is_igif(fid) || unlikely(fid_seq(fid) == FID_SEQ_DOT_LUSTRE))
+ return 0;
- if (fid_is_idif(fid) || fid_seq(fid) == FID_SEQ_LLOG)
- return osd_compat_objid_insert(info, osd, fid, id0, th);
+ if (fid_is_idif(fid) || fid_seq(fid) == FID_SEQ_LLOG)
+ return osd_compat_objid_insert(info, osd, fid, id0, th);
- /* notice we don't return immediately, but continue to get into OI */
- if (unlikely(fid_seq(fid) == FID_SEQ_LOCAL_FILE))
- osd_compat_spec_insert(info, osd, fid, id0, th);
+ /* Server mount should not depends on OI files */
+ if (unlikely(fid_seq(fid) == FID_SEQ_LOCAL_FILE))
+ return osd_compat_spec_insert(info, osd, fid, id0, th);
fid_cpu_to_be(oi_fid, fid);
key = (struct dt_key *)oi_fid;
fid_cpu_to_be(oi_fid, fid);
key = (struct dt_key *)oi_fid;
struct lu_fid *oi_fid = &info->oti_fid;
const struct dt_key *key;
struct lu_fid *oi_fid = &info->oti_fid;
const struct dt_key *key;
- if (!fid_is_norm(fid))
- return 0;
-
LASSERT(fid_seq(fid) != FID_SEQ_LOCAL_FILE);
if (fid_is_idif(fid) || fid_seq(fid) == FID_SEQ_LLOG)
LASSERT(fid_seq(fid) != FID_SEQ_LOCAL_FILE);
if (fid_is_idif(fid) || fid_seq(fid) == FID_SEQ_LLOG)