For Lustre-2.6 or older release, the namespace LFSCK statistics info
was stored as XATTR_NAME_LFSCK_NAMESPACE EA, but in Lustre-2.7, the
namespace LFSCK will introduce more statistics information that will
cause the XATTR_NAME_LFSCK_NAMESPACE EA to be extended. If it still
uses the old XATTR_NAME_LFSCK_NAMESPACE EA, then when downgrade, the
old LFSCK will get -ERANGE when load the new trace file from disk,
and then the LFSCK cannot be started after downgrade.
To avoid such trouble, Lustre-2.7 will use new EA to store the
namespace LFSCK statistics info: XATTR_NAME_LFSCK_NAMESPACE_V2,
and keep a dummy XATTR_NAME_LFSCK_NAMESPACE EA in the trace file
to be compatible with old LFSCK.
Signed-off-by: Fan Yong <fan.yong@intel.com>
Change-Id: I55b5adb962434013b00e3938a67b671010ecc206
Reviewed-on: http://review.whamcloud.com/12321
Tested-by: Jenkins
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Lai Siyao <lai.siyao@intel.com>
#define XATTR_NAME_VERSION "trusted.version"
#define XATTR_NAME_SOM "trusted.som"
#define XATTR_NAME_HSM "trusted.hsm"
#define XATTR_NAME_VERSION "trusted.version"
#define XATTR_NAME_SOM "trusted.som"
#define XATTR_NAME_HSM "trusted.hsm"
-#define XATTR_NAME_LFSCK_NAMESPACE "trusted.lfsck_namespace"
#define XATTR_NAME_LFSCK_BITMAP "trusted.lfsck_bitmap"
#define XATTR_NAME_LFSCK_BITMAP "trusted.lfsck_bitmap"
+
+#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 8, 53, 0)
+# define XATTR_NAME_LFSCK_NAMESPACE_OLD "trusted.lfsck_namespace"
+#endif
+
+#define XATTR_NAME_LFSCK_NAMESPACE "trusted.lfsck_ns"
#define XATTR_NAME_MAX_LEN 32 /* increase this, if there is longer name. */
struct lov_mds_md_v3 { /* LOV EA mds/wire data (little-endian) */
#define XATTR_NAME_MAX_LEN 32 /* increase this, if there is longer name. */
struct lov_mds_md_v3 { /* LOV EA mds/wire data (little-endian) */
- * \retval +ve: the lfsck_namespace is broken, the caller should reset it.
- * \retval 0: succeed.
- * \retval -ve: failed cases.
+ * Load namespace LFSCK statistics information from the trace file.
+ *
+ * For old release (Lustre-2.6 or older), the statistics information was
+ * stored as XATTR_NAME_LFSCK_NAMESPACE_OLD EA. But in Lustre-2.7, we need
+ * more statistics information. To avoid confusing old MDT when downgrade,
+ * Lustre-2.7 stores the namespace LFSCK statistics information as new
+ * XATTR_NAME_LFSCK_NAMESPACE EA.
+ *
+ * \param[in] env pointer to the thread context
+ * \param[in] com pointer to the lfsck component
+ *
+ * \retval 0 for success
+ * \retval negative error number on failure
*/
static int lfsck_namespace_load(const struct lu_env *env,
struct lfsck_component *com)
*/
static int lfsck_namespace_load(const struct lu_env *env,
struct lfsck_component *com)
CDEBUG(D_LFSCK, "%s: invalid lfsck_namespace magic "
"%#x != %#x\n", lfsck_lfsck2name(com->lc_lfsck),
ns->ln_magic, LFSCK_NAMESPACE_MAGIC);
CDEBUG(D_LFSCK, "%s: invalid lfsck_namespace magic "
"%#x != %#x\n", lfsck_lfsck2name(com->lc_lfsck),
ns->ln_magic, LFSCK_NAMESPACE_MAGIC);
"expected = %d: rc = %d\n",
lfsck_lfsck2name(com->lc_lfsck), len, rc);
if (rc >= 0)
"expected = %d: rc = %d\n",
lfsck_lfsck2name(com->lc_lfsck), len, rc);
if (rc >= 0)
+ rc = -ESTALE;
+ } else {
+ /* Check whether it is old trace file or not.
+ * If yes, it should be reset via returning -ESTALE. */
+ rc = dt_xattr_get(env, com->lc_obj,
+ lfsck_buf_get(env, com->lc_file_disk, len),
+ XATTR_NAME_LFSCK_NAMESPACE_OLD, BYPASS_CAPA);
+ if (rc >= 0)
+ rc = -ESTALE;
return rc;
}
static int lfsck_namespace_store(const struct lu_env *env,
return rc;
}
static int lfsck_namespace_store(const struct lu_env *env,
- struct lfsck_component *com)
+ struct lfsck_component *com, bool init)
{
struct dt_object *obj = com->lc_obj;
struct lfsck_instance *lfsck = com->lc_lfsck;
{
struct dt_object *obj = com->lc_obj;
struct lfsck_instance *lfsck = com->lc_lfsck;
__u32 nbits = 0;
int len = com->lc_file_size;
int rc;
__u32 nbits = 0;
int len = com->lc_file_size;
int rc;
+#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 8, 53, 0)
+ struct lu_buf tbuf = { &len, sizeof(len) };
+#endif
ENTRY;
if (lad != NULL) {
ENTRY;
if (lad != NULL) {
+#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 8, 53, 0)
+ /* To be compatible with old Lustre-2.x MDT (x <= 6), generate dummy
+ * XATTR_NAME_LFSCK_NAMESPACE_OLD EA, then when downgrade to Lustre-2.x,
+ * the old LFSCK will find "invalid" XATTR_NAME_LFSCK_NAMESPACE_OLD EA,
+ * then reset the namespace LFSCK trace file. */
+ if (init) {
+ rc = dt_declare_xattr_set(env, obj, &tbuf,
+ XATTR_NAME_LFSCK_NAMESPACE_OLD,
+ LU_XATTR_CREATE, handle);
+ if (rc != 0)
+ GOTO(out, rc);
+ }
+#endif
+
rc = dt_trans_start_local(env, lfsck->li_bottom, handle);
if (rc != 0)
GOTO(out, rc);
rc = dt_trans_start_local(env, lfsck->li_bottom, handle);
if (rc != 0)
GOTO(out, rc);
XATTR_NAME_LFSCK_BITMAP, 0, handle,
BYPASS_CAPA);
XATTR_NAME_LFSCK_BITMAP, 0, handle,
BYPASS_CAPA);
+#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 8, 53, 0)
+ if (rc == 0 && init)
+ rc = dt_xattr_set(env, obj, &tbuf,
+ XATTR_NAME_LFSCK_NAMESPACE_OLD,
+ LU_XATTR_CREATE, handle, BYPASS_CAPA);
+#endif
+
ns->ln_magic = LFSCK_NAMESPACE_MAGIC;
ns->ln_status = LS_INIT;
down_write(&com->lc_sem);
ns->ln_magic = LFSCK_NAMESPACE_MAGIC;
ns->ln_status = LS_INIT;
down_write(&com->lc_sem);
- rc = lfsck_namespace_store(env, com);
+ rc = lfsck_namespace_store(env, com, true);
up_write(&com->lc_sem);
return rc;
}
up_write(&com->lc_sem);
return rc;
}
lad->lad_incomplete = 0;
CFS_RESET_BITMAP(lad->lad_bitmap);
lad->lad_incomplete = 0;
CFS_RESET_BITMAP(lad->lad_bitmap);
- rc = lfsck_namespace_store(env, com);
+ rc = lfsck_namespace_store(env, com, true);
com->lc_new_checked = 0;
}
com->lc_new_checked = 0;
}
- rc = lfsck_namespace_store(env, com);
+ rc = lfsck_namespace_store(env, com, false);
up_write(&com->lc_sem);
log:
up_write(&com->lc_sem);
log:
com->lc_new_checked = 0;
}
com->lc_new_checked = 0;
}
- rc = lfsck_namespace_store(env, com);
+ rc = lfsck_namespace_store(env, com, false);
up_write(&com->lc_sem);
CDEBUG(D_LFSCK, "%s: namespace LFSCK post done: rc = %d\n",
up_write(&com->lc_sem);
CDEBUG(D_LFSCK, "%s: namespace LFSCK post done: rc = %d\n",
ns->ln_time_last_checkpoint = cfs_time_current_sec();
ns->ln_objs_checked_phase2 += com->lc_new_checked;
com->lc_new_checked = 0;
ns->ln_time_last_checkpoint = cfs_time_current_sec();
ns->ln_objs_checked_phase2 += com->lc_new_checked;
com->lc_new_checked = 0;
- rc = lfsck_namespace_store(env, com);
+ rc = lfsck_namespace_store(env, com, false);
up_write(&com->lc_sem);
if (rc != 0)
GOTO(put, rc);
up_write(&com->lc_sem);
if (rc != 0)
GOTO(put, rc);
ns->ln_status = LS_FAILED;
}
ns->ln_status = LS_FAILED;
}
- rc = lfsck_namespace_store(env, com);
+ rc = lfsck_namespace_store(env, com, false);
up_write(&com->lc_sem);
return rc;
up_write(&com->lc_sem);
return rc;
GOTO(out, rc);
rc = lfsck_namespace_load(env, com);
GOTO(out, rc);
rc = lfsck_namespace_load(env, com);
- if (rc > 0)
- rc = lfsck_namespace_reset(env, com, true);
- else if (rc == -ENODATA)
rc = lfsck_namespace_init(env, com);
rc = lfsck_namespace_init(env, com);
+ else if (rc < 0)
+ rc = lfsck_namespace_reset(env, com, true);
if (rc != 0)
GOTO(out, rc);
if (rc != 0)
GOTO(out, rc);
strcmp(xattr_name, XATTR_NAME_HSM) == 0 ||
strcmp(xattr_name, XATTR_NAME_LFSCK_NAMESPACE) == 0)
GOTO(out, rc = 0);
strcmp(xattr_name, XATTR_NAME_HSM) == 0 ||
strcmp(xattr_name, XATTR_NAME_LFSCK_NAMESPACE) == 0)
GOTO(out, rc = 0);
+
+#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 8, 53, 0)
+ if (strcmp(xattr_name, XATTR_NAME_LFSCK_NAMESPACE_OLD) == 0)
+ GOTO(out, rc = 0);
+#endif
} else if ((valid & OBD_MD_FLXATTR) &&
(strcmp(xattr_name, XATTR_NAME_ACL_ACCESS) == 0 ||
strcmp(xattr_name, XATTR_NAME_ACL_DEFAULT) == 0)) {
} else if ((valid & OBD_MD_FLXATTR) &&
(strcmp(xattr_name, XATTR_NAME_ACL_ACCESS) == 0 ||
strcmp(xattr_name, XATTR_NAME_ACL_DEFAULT) == 0)) {
setfattr --remove=$trusted.$name $file1 2> /dev/null
done
setfattr --remove=$trusted.$name $file1 2> /dev/null
done
+ if [ $(lustre_version_code $SINGLEMDS) -gt $(version_code 2.6.50) ]
+ then
+ name="lfsck_ns"
+ # Try to copy xattr from $file0 to $file1.
+ value=$(getxattr $file0 trusted.$name 2> /dev/null)
+
+ setfattr --name=trusted.$name --value="$value" $file1 ||
+ error "setxattr 'trusted.$name' failed"
+
+ # Try to set a garbage xattr.
+ value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4=
+
+ setfattr --name=trusted.$name --value="$value" $file1 ||
+ error "setxattr 'trusted.$name' failed"
+
+ # Try to remove the xattr from $file1. We don't care if this
+ # appears to succeed or fail, we just don't want there to be
+ # any changes or crashes.
+ setfattr --remove=$trusted.$name $file1 2> /dev/null
+ fi
+
# Get 'after' xattrs of file1.
getfattr --absolute-names --dump --match=- $file1 > $xattr1
# Get 'after' xattrs of file1.
getfattr --absolute-names --dump --match=- $file1 > $xattr1