+ if (lmm->lmm_magic != le32_to_cpu(LOV_MAGIC_V1)) {
+ CERROR("bad disk LOV MAGIC: 0x%08X\n",
+ le32_to_cpu(*(__u32 *)lmm));
+ return -EINVAL;
+ }
+
+ *stripe_count = le32_to_cpu(lmm->lmm_stripe_count);
+
+ if (*stripe_count == 0) {
+ CERROR("bad stripe count %d\n", *stripe_count);
+ lov_dump_lmm_v1(D_WARNING, lmm);
+ return -EINVAL;
+ }
+
+ if (lmm_bytes < lov_mds_md_v1_size(*stripe_count)) {
+ CERROR("LOV EA too small: %d, need %d\n",
+ lmm_bytes, lov_mds_md_v1_size(*stripe_count));
+ lov_dump_lmm_v1(D_WARNING, lmm);
+ return -EINVAL;
+ }
+
+ if (lmm->lmm_object_id == 0) {
+ CERROR("zero object id\n");
+ lov_dump_lmm_v1(D_WARNING, lmm);
+ return -EINVAL;
+ }
+
+ if (lmm->lmm_pattern != cpu_to_le32(LOV_PATTERN_RAID0)) {
+ CERROR("bad striping pattern\n");
+ lov_dump_lmm_v1(D_WARNING, lmm);
+ return -EINVAL;
+ }
+
+ if (lmm->lmm_stripe_size == 0 ||
+ (__u64)le32_to_cpu(lmm->lmm_stripe_size) * *stripe_count > ~0UL) {
+ CERROR("bad stripe size %u\n",
+ le32_to_cpu(lmm->lmm_stripe_size));
+ lov_dump_lmm_v1(D_WARNING, lmm);
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int lov_verify_lmm(void *lmm, int lmm_bytes, int *stripe_count)
+{
+ switch (le32_to_cpu(*(__u32 *)lmm)) {
+ case LOV_MAGIC_V1:
+ return lov_verify_lmm_v1(lmm, lmm_bytes, stripe_count);
+ case LOV_MAGIC_V0:
+ return lov_verify_lmm_v0(lmm, lmm_bytes, stripe_count);
+ default:
+ CERROR("bad disk LOV MAGIC: 0x%08X\n",
+ le32_to_cpu(*(__u32 *)lmm));
+ return -EINVAL;
+ }
+}
+
+int lov_alloc_memmd(struct lov_stripe_md **lsmp, int stripe_count, int pattern)
+{
+ int lsm_size = lov_stripe_md_size(stripe_count);
+ struct lov_oinfo *loi;
+ int i;