static int lsm_lmm_verify_common(struct lov_mds_md *lmm, int lmm_bytes, __u16 stripe_count) { if (stripe_count == 0 || stripe_count > LOV_V1_INSANE_STRIPE_COUNT) { CERROR("bad stripe count %d\n", stripe_count); lov_dump_lmm_common(D_WARNING, lmm); return -EINVAL; } if (lmm_oi_id(&lmm->lmm_oi) == 0) { CERROR("zero object id\n"); lov_dump_lmm_common(D_WARNING, lmm); return -EINVAL; } if (lmm->lmm_pattern != cpu_to_le32(LOV_PATTERN_RAID0)) { CERROR("bad striping pattern\n"); lov_dump_lmm_common(D_WARNING, lmm); return -EINVAL; } if (lmm->lmm_stripe_size == 0 || (le32_to_cpu(lmm->lmm_stripe_size)&(LOV_MIN_STRIPE_SIZE-1)) != 0) { CERROR("bad stripe size %u\n", le32_to_cpu(lmm->lmm_stripe_size)); lov_dump_lmm_common(D_WARNING, lmm); return -EINVAL; } return 0; }
void lov_dump_lmm_v3(int level, struct lov_mds_md_v3 *lmm) { lov_dump_lmm_common(level, lmm); CDEBUG(level, "pool_name "LOV_POOLNAMEF"\n", lmm->lmm_pool_name); lov_dump_lmm_objects(level, lmm->lmm_objects, le16_to_cpu(lmm->lmm_stripe_count)); }
static int lsm_lmm_verify_v3(struct lov_mds_md *lmmv1, int lmm_bytes, __u16 *stripe_count) { struct lov_mds_md_v3 *lmm; lmm = (struct lov_mds_md_v3 *)lmmv1; if (lmm_bytes < sizeof(*lmm)) { CERROR("lov_mds_md_v3 too small: %d, need at least %d\n", lmm_bytes, (int)sizeof(*lmm)); return -EINVAL; } *stripe_count = le16_to_cpu(lmm->lmm_stripe_count); if (lmm_bytes < lov_mds_md_size(*stripe_count, LOV_MAGIC_V3)) { CERROR("LOV EA V3 too small: %d, need %d\n", lmm_bytes, lov_mds_md_size(*stripe_count, LOV_MAGIC_V3)); lov_dump_lmm_common(D_WARNING, lmm); return -EINVAL; } return lsm_lmm_verify_common((struct lov_mds_md_v1 *)lmm, lmm_bytes, *stripe_count); }
void lov_dump_lmm(int level, void *lmm) { int magic; magic = le32_to_cpu(((struct lov_mds_md *)lmm)->lmm_magic); switch (magic) { case LOV_MAGIC_V1: lov_dump_lmm_v1(level, (struct lov_mds_md_v1 *)lmm); break; case LOV_MAGIC_V3: lov_dump_lmm_v3(level, (struct lov_mds_md_v3 *)lmm); break; default: CDEBUG(level, "unrecognized lmm_magic %x, assuming %x\n", magic, LOV_MAGIC_V1); lov_dump_lmm_common(level, lmm); break; } }
static int lsm_lmm_verify_v1(struct lov_mds_md_v1 *lmm, int lmm_bytes, __u16 *stripe_count) { if (lmm_bytes < sizeof(*lmm)) { CERROR("lov_mds_md_v1 too small: %d, need at least %d\n", lmm_bytes, (int)sizeof(*lmm)); return -EINVAL; } *stripe_count = le16_to_cpu(lmm->lmm_stripe_count); if (le32_to_cpu(lmm->lmm_pattern) & LOV_PATTERN_F_RELEASED) *stripe_count = 0; if (lmm_bytes < lov_mds_md_size(*stripe_count, LOV_MAGIC_V1)) { CERROR("LOV EA V1 too small: %d, need %d\n", lmm_bytes, lov_mds_md_size(*stripe_count, LOV_MAGIC_V1)); lov_dump_lmm_common(D_WARNING, lmm); return -EINVAL; } return lsm_lmm_verify_common(lmm, lmm_bytes, *stripe_count); }
void lov_dump_lmm_v1(int level, struct lov_mds_md_v1 *lmm) { lov_dump_lmm_common(level, lmm); lov_dump_lmm_objects(level, lmm->lmm_objects, le16_to_cpu(lmm->lmm_stripe_count)); }