+static inline bool lmv_dir_striped(const struct lmv_stripe_md *lsm)
+{
+ return lsm && lsm->lsm_md_magic == LMV_MAGIC;
+}
+
+static inline bool lmv_dir_foreign(const struct lmv_stripe_md *lsm)
+{
+ return lsm && lsm->lsm_md_magic == LMV_MAGIC_FOREIGN;
+}
+
+static inline bool lmv_dir_migrating(const struct lmv_stripe_md *lsm)
+{
+ return lmv_dir_striped(lsm) &&
+ lsm->lsm_md_hash_type & LMV_HASH_FLAG_MIGRATION;
+}
+
+static inline bool lmv_dir_bad_hash(const struct lmv_stripe_md *lsm)
+{
+ if (!lmv_dir_striped(lsm))
+ return false;
+
+ if (lmv_dir_migrating(lsm) &&
+ lsm->lsm_md_stripe_count - lsm->lsm_md_migrate_offset <= 1)
+ return false;
+
+ return !lmv_is_known_hash_type(lsm->lsm_md_hash_type);
+}
+
+static inline bool
+lsm_md_eq(const struct lmv_stripe_md *lsm1, const struct lmv_stripe_md *lsm2)
+{
+ __u32 idx;
+
+ if (lsm1->lsm_md_magic != lsm2->lsm_md_magic ||
+ lsm1->lsm_md_stripe_count != lsm2->lsm_md_stripe_count ||
+ lsm1->lsm_md_master_mdt_index !=
+ lsm2->lsm_md_master_mdt_index ||
+ lsm1->lsm_md_hash_type != lsm2->lsm_md_hash_type ||
+ lsm1->lsm_md_layout_version !=
+ lsm2->lsm_md_layout_version ||
+ lsm1->lsm_md_migrate_offset !=
+ lsm2->lsm_md_migrate_offset ||
+ lsm1->lsm_md_migrate_hash !=
+ lsm2->lsm_md_migrate_hash ||
+ strcmp(lsm1->lsm_md_pool_name,
+ lsm2->lsm_md_pool_name) != 0)
+ return false;
+
+ if (lmv_dir_striped(lsm1)) {
+ for (idx = 0; idx < lsm1->lsm_md_stripe_count; idx++) {
+ if (!lu_fid_eq(&lsm1->lsm_md_oinfo[idx].lmo_fid,
+ &lsm2->lsm_md_oinfo[idx].lmo_fid))
+ return false;
+ }
+ }
+
+ return true;
+}
+
+static inline void lsm_md_dump(int mask, const struct lmv_stripe_md *lsm)
+{
+ int i;
+
+ CDEBUG(mask, "magic %#x stripe count %d master mdt %d hash type %#x "
+ "version %d migrate offset %d migrate hash %#x pool %s\n",
+ lsm->lsm_md_magic, lsm->lsm_md_stripe_count,
+ lsm->lsm_md_master_mdt_index, lsm->lsm_md_hash_type,
+ lsm->lsm_md_layout_version, lsm->lsm_md_migrate_offset,
+ lsm->lsm_md_migrate_hash, lsm->lsm_md_pool_name);
+
+ if (!lmv_dir_striped(lsm))
+ return;
+
+ for (i = 0; i < lsm->lsm_md_stripe_count; i++)
+ CDEBUG(mask, "stripe[%d] "DFID"\n",
+ i, PFID(&lsm->lsm_md_oinfo[i].lmo_fid));
+}
+