struct lfsck_layout_slave_target *llsaa_llst;
};
-static inline bool lfsck_comp_extent_aligned(__u64 size)
+static inline bool lfsck_comp_extent_aligned(__u64 border, __u32 size)
{
- return (size & (LOV_MIN_STRIPE_SIZE - 1)) == 0;
+ return (border & (size - 1)) == 0;
}
static inline void
static int lfsck_layout_verify_header_v1v3(struct dt_object *obj,
struct lov_mds_md_v1 *lmm,
- __u64 start, __u32 comp_id)
+ __u64 start, __u64 end,
+ __u32 comp_id,
+ bool ext, bool *dom)
{
__u32 magic;
__u32 pattern;
+ __u32 size;
magic = le32_to_cpu(lmm->lmm_magic);
/* If magic crashed, keep it there. Sometime later, during OST-object
else
rc = -EINVAL;
- CDEBUG(D_LFSCK, "%s LOV EA magic %u for the file "DFID"\n",
+ CDEBUG(D_LFSCK, "%s LOV EA magic 0x%X for the file "DFID"\n",
rc == -EINVAL ? "Unknown" : "Unsupported",
magic, PFID(lfsck_dto2fid(obj)));
}
pattern = le32_to_cpu(lmm->lmm_pattern);
+ *dom = !!(lov_pattern(pattern) == LOV_PATTERN_MDT);
-#if 0
/* XXX: DoM file verification will be supportted via LU-11081. */
if (lov_pattern(pattern) == LOV_PATTERN_MDT) {
+#if 0
if (start != 0) {
CDEBUG(D_LFSCK, "The DoM entry for "DFID" is not "
"the first component in the mirror %x/%llu\n",
return -EINVAL;
}
- }
#endif
-
- if (!lov_pattern_supported_normal_comp(lov_pattern(pattern))) {
+ } else if (!lov_pattern_supported_normal_comp(lov_pattern(pattern))) {
CDEBUG(D_LFSCK, "Unsupported LOV EA pattern %u for the file "
DFID" in the component %x\n",
pattern, PFID(lfsck_dto2fid(obj)), comp_id);
return -EOPNOTSUPP;
}
+ size = le32_to_cpu(lmm->lmm_stripe_size);
+ if (!ext && end != LUSTRE_EOF && start != end &&
+ !lfsck_comp_extent_aligned(end, size)){
+ CDEBUG(D_LFSCK, "not aligned border in PFL extent range "
+ "[%llu - %llu) stripesize %u for the file "DFID
+ " at idx %d\n", start, end, size,
+ PFID(lfsck_dto2fid(obj)), comp_id);
+
+ return -EINVAL;
+ }
+
return 0;
}
static int lfsck_layout_verify_header(struct dt_object *obj,
struct lov_mds_md_v1 *lmm, size_t len)
{
+ bool p_dom = false;
int rc = 0;
- if (le32_to_cpu(lmm->lmm_magic) == LOV_MAGIC_COMP_V1) {
+ if (le32_to_cpu(lmm->lmm_magic) == LOV_MAGIC_COMP_V1 ||
+ le32_to_cpu(lmm->lmm_magic) == LOV_MAGIC_SEL) {
struct lov_comp_md_v1 *lcm = (struct lov_comp_md_v1 *)lmm;
+ bool p_zero = false;
int i;
__u16 count = le16_to_cpu(lcm->lcm_entry_count);
__u64 start = le64_to_cpu(lcme->lcme_extent.e_start);
__u64 end = le64_to_cpu(lcme->lcme_extent.e_end);
__u32 comp_id = le32_to_cpu(lcme->lcme_id);
+ bool ext, inited, zero;
+ __u32 flags;
if (unlikely(comp_id == LCME_ID_INVAL ||
comp_id > LCME_ID_MAX)) {
- CDEBUG(D_LFSCK, "found invalid FPL ID %u "
+ CDEBUG(D_LFSCK, "found invalid PFL ID %u "
"for the file "DFID" at idx %d\n",
comp_id, PFID(lfsck_dto2fid(obj)), i);
return -EINVAL;
}
- if (unlikely(start >= end ||
- !lfsck_comp_extent_aligned(start) ||
- (!lfsck_comp_extent_aligned(end) &&
- end != LUSTRE_EOF))) {
- CDEBUG(D_LFSCK, "found invalid FPL extent "
- "range [%llu - %llu) for the file "
- DFID" at idx %d\n",
- start, end, PFID(lfsck_dto2fid(obj)), i);
+ flags = le32_to_cpu(lcme->lcme_flags);
+ ext = flags & LCME_FL_EXTENSION;
+ inited = flags & LCME_FL_INIT;
+ zero = !!(start == end);
+
+ if ((i == 0) && zero) {
+ CDEBUG(D_LFSCK, "invalid PFL comp %d: [%llu "
+ "- %llu) for "DFID"\n", i, start, end,
+ PFID(lfsck_dto2fid(obj)));
+ return -EINVAL;
+ }
+
+ if ((zero && (inited || (i + 1 == count))) ||
+ (start > end)) {
+ CDEBUG(D_LFSCK, "invalid PFL comp %d/%d: "
+ "[%llu, %llu) for "DFID", %sinited\n",
+ i, count, start, end,
+ PFID(lfsck_dto2fid(obj)),
+ inited ? "" : "NOT ");
+ return -EINVAL;
+ }
+ if (!ext && p_zero) {
+ CDEBUG(D_LFSCK, "invalid PFL comp %d: [%llu, "
+ "%llu) for "DFID": NOT extension "
+ "after 0-length component\n", i,
+ start, end, PFID(lfsck_dto2fid(obj)));
+ return -EINVAL;
+ }
+
+ if (ext && (inited || p_dom || zero)) {
+ CDEBUG(D_LFSCK, "invalid PFL comp %d: [%llu, "
+ "%llu) for "DFID": %s\n", i,
+ start, end, PFID(lfsck_dto2fid(obj)),
+ inited ? "inited extension" :
+ p_dom ? "extension follows DOM" :
+ zero ? "zero length extension" : "");
return -EINVAL;
}
rc = lfsck_layout_verify_header_v1v3(obj,
(struct lov_mds_md_v1 *)((char *)lmm +
le32_to_cpu(lcme->lcme_offset)), start,
- comp_id);
+ end, comp_id, ext, &p_dom);
+
+ p_zero = zero;
}
} else if (le32_to_cpu(lmm->lmm_magic) == LOV_MAGIC_FOREIGN) {
rc = lfsck_layout_verify_header_foreign(obj,
(struct lov_foreign_md *)lmm,
len);
} else {
- rc = lfsck_layout_verify_header_v1v3(obj, lmm, 1, 0);
+ rc = lfsck_layout_verify_header_v1v3(obj, lmm, 0, LUSTRE_EOF,
+ 0, false, &p_dom);
}
return rc;
GOTO(unlock_parent, rc = rc1);
magic = le32_to_cpu(lmm->lmm_magic);
- if (magic == LOV_MAGIC_COMP_V1) {
+ if (magic == LOV_MAGIC_COMP_V1 || magic == LOV_MAGIC_SEL) {
__u64 start;
__u64 end;
__u16 mirror_id0 = mirror_id_of(ol->ol_comp_id);
ol->ol_comp_id = 0;
ff->ff_layout_version = 0;
ff->ff_range = 0;
- } else if (magic == LOV_MAGIC_COMP_V1) {
+ } else if (magic == LOV_MAGIC_COMP_V1 || magic == LOV_MAGIC_SEL) {
struct lov_comp_md_v1 *lcm = (struct lov_comp_md_v1 *)lmm;
struct lov_comp_md_entry_v1 *lcme = NULL;
__u16 count = le16_to_cpu(lcm->lcm_entry_count);
lmm = lovea->lb_buf;
magic = le32_to_cpu(lmm->lmm_magic);
- if (magic == LOV_MAGIC_COMP_V1) {
+ if (magic == LOV_MAGIC_COMP_V1 || magic == LOV_MAGIC_SEL) {
struct lov_comp_md_v1 *lcm = buf->lb_buf;
struct lov_comp_md_entry_v1 *lcme;
__u16 count = le16_to_cpu(lcm->lcm_entry_count);
lmm = buf->lb_buf;
magic = le32_to_cpu(lmm->lmm_magic);
- if (magic == LOV_MAGIC_COMP_V1) {
+ if (magic == LOV_MAGIC_COMP_V1 || magic == LOV_MAGIC_SEL) {
struct lov_comp_md_v1 *lcm = buf->lb_buf;
struct lov_comp_md_entry_v1 *lcme;
__u16 count = le16_to_cpu(lcm->lcm_entry_count);
lmm = buf->lb_buf;
magic = le32_to_cpu(lmm->lmm_magic);
- if (magic == LOV_MAGIC_COMP_V1) {
+ if (magic == LOV_MAGIC_COMP_V1 || magic == LOV_MAGIC_SEL) {
struct lov_comp_md_v1 *lcm = buf->lb_buf;
struct lov_comp_md_entry_v1 *lcme;
lmm = buf->lb_buf;
magic = le32_to_cpu(lmm->lmm_magic);
- if (magic == LOV_MAGIC_COMP_V1) {
+ if (magic == LOV_MAGIC_COMP_V1 || magic == LOV_MAGIC_SEL) {
struct lov_comp_md_v1 *lcm = buf->lb_buf;
struct lov_comp_md_entry_v1 *lcme;
size = rc;
lmm = buf->lb_buf;
magic = le32_to_cpu(lmm->lmm_magic);
- if (magic == LOV_MAGIC_COMP_V1) {
+ if (magic == LOV_MAGIC_COMP_V1 || magic == LOV_MAGIC_SEL) {
struct lov_mds_md_v1 *v1;
int i;
goto again;
}
- if (magic == LOV_MAGIC_COMP_V1) {
+ if (magic == LOV_MAGIC_COMP_V1 || magic == LOV_MAGIC_SEL) {
struct lov_mds_md_v1 *v1;
int i;
PFID(lfsck_dto2fid(obj)), rc);
if (stripe) {
- if (magic == LOV_MAGIC_COMP_V1) {
+ if (magic == LOV_MAGIC_COMP_V1 || magic == LOV_MAGIC_SEL) {
int i;
for (i = 0; i < count; i++) {