__u32 lsm_md_layout_version;
__u32 lsm_md_migrate_offset;
__u32 lsm_md_migrate_hash;
- __u32 lsm_md_default_count;
- __u32 lsm_md_default_index;
char lsm_md_pool_name[LOV_MAXPOOLNAME + 1];
struct lmv_oinfo lsm_md_oinfo[0];
};
-static inline bool lmv_dir_striped(const struct lmv_stripe_md *lsm)
+struct lmv_stripe_object {
+ atomic_t lso_refs;
+ union {
+ struct lmv_stripe_md lso_lsm;
+ struct lmv_foreign_md lso_lfm;
+ };
+};
+
+static inline bool lmv_dir_striped(const struct lmv_stripe_object *lso)
{
- return lsm && lsm->lsm_md_magic == LMV_MAGIC;
+ return lso && lso->lso_lsm.lsm_md_magic == LMV_MAGIC;
}
-static inline bool lmv_dir_foreign(const struct lmv_stripe_md *lsm)
+static inline bool lmv_dir_foreign(const struct lmv_stripe_object *lso)
{
- return lsm && lsm->lsm_md_magic == LMV_MAGIC_FOREIGN;
+ return lso && lso->lso_lsm.lsm_md_magic == LMV_MAGIC_FOREIGN;
}
-static inline bool lmv_dir_layout_changing(const struct lmv_stripe_md *lsm)
+static inline bool lmv_dir_layout_changing(const struct lmv_stripe_object *lso)
{
- return lmv_dir_striped(lsm) &&
- lmv_hash_is_layout_changing(lsm->lsm_md_hash_type);
+ return lmv_dir_striped(lso) &&
+ lmv_hash_is_layout_changing(lso->lso_lsm.lsm_md_hash_type);
}
-static inline bool lmv_dir_bad_hash(const struct lmv_stripe_md *lsm)
+static inline bool lmv_dir_bad_hash(const struct lmv_stripe_object *lso)
{
- if (!lmv_dir_striped(lsm))
+ if (!lmv_dir_striped(lso))
return false;
- if (lsm->lsm_md_hash_type & LMV_HASH_FLAG_BAD_TYPE)
+ if (lso->lso_lsm.lsm_md_hash_type & LMV_HASH_FLAG_BAD_TYPE)
return true;
- return !lmv_is_known_hash_type(lsm->lsm_md_hash_type);
+ return !lmv_is_known_hash_type(lso->lso_lsm.lsm_md_hash_type);
}
-static inline bool
-lsm_md_eq(const struct lmv_stripe_md *lsm1, const struct lmv_stripe_md *lsm2)
+static inline __u8 lmv_inherit_next(__u8 inherit)
{
+ if (inherit == LMV_INHERIT_END || inherit == LMV_INHERIT_NONE)
+ return LMV_INHERIT_NONE;
+
+ if (inherit == LMV_INHERIT_UNLIMITED || inherit > LMV_INHERIT_MAX)
+ return inherit;
+
+ return inherit - 1;
+}
+
+static inline __u8 lmv_inherit_rr_next(__u8 inherit_rr)
+{
+ if (inherit_rr == LMV_INHERIT_RR_NONE ||
+ inherit_rr == LMV_INHERIT_RR_UNLIMITED ||
+ inherit_rr > LMV_INHERIT_RR_MAX)
+ return inherit_rr;
+
+ return inherit_rr - 1;
+}
+
+static inline bool lmv_is_inheritable(__u8 inherit)
+{
+ return inherit == LMV_INHERIT_UNLIMITED ||
+ (inherit > LMV_INHERIT_END && inherit <= LMV_INHERIT_MAX);
+}
+
+static inline bool lsm_md_eq(const struct lmv_stripe_object *lso1,
+ const struct lmv_stripe_object *lso2)
+{
+ const struct lmv_stripe_md *lsm1 = &lso1->lso_lsm;
+ const struct lmv_stripe_md *lsm2 = &lso2->lso_lsm;
__u32 idx;
if (lsm1->lsm_md_magic != lsm2->lsm_md_magic ||
sizeof(lsm1->lsm_md_pool_name)) != 0)
return false;
- if (lmv_dir_striped(lsm1)) {
+ if (lmv_dir_striped(lso1)) {
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 true;
}
-static inline void lsm_md_dump(int mask, const struct lmv_stripe_md *lsm)
+static inline void
+lmv_stripe_object_dump(int mask, const struct lmv_stripe_object *lsmo)
{
+ const struct lmv_stripe_md *lsm = &lsmo->lso_lsm;
int i;
- CDEBUG_LIMIT(mask,
- "dump LMV: magic=%#x count=%u index=%u hash=%s:%#x max_inherit=%hhu max_inherit_rr=%hhu version=%u migrate_offset=%u migrate_hash=%s:%x pool=%.*s\n",
- lsm->lsm_md_magic, lsm->lsm_md_stripe_count,
- lsm->lsm_md_master_mdt_index,
+ CDEBUG(mask,
+ "dump LMV: refs %u magic=%#x count=%u index=%u hash=%s:%#x max_inherit=%hhu max_inherit_rr=%hhu version=%u migrate_offset=%u migrate_hash=%s:%x pool=%.*s\n",
+ lsm->lsm_md_magic, atomic_read(&lsmo->lso_refs),
+ lsm->lsm_md_stripe_count, lsm->lsm_md_master_mdt_index,
lmv_is_known_hash_type(lsm->lsm_md_hash_type) ?
mdt_hash_name[lsm->lsm_md_hash_type & LMV_HASH_TYPE_MASK] :
"invalid", lsm->lsm_md_hash_type,
"invalid", lsm->lsm_md_migrate_hash,
LOV_MAXPOOLNAME, lsm->lsm_md_pool_name);
- if (!lmv_dir_striped(lsm))
+ if (!lmv_dir_striped(lsmo))
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));
+ CDEBUG_LIMIT(mask, "stripe[%d] "DFID"\n",
+ i, PFID(&lsm->lsm_md_oinfo[i].lmo_fid));
+}
+
+static inline bool
+lmv_object_inherited(const struct lmv_stripe_object *plsm,
+ const struct lmv_stripe_object *clsm)
+{
+ return plsm && clsm &&
+ plsm->lso_lsm.lsm_md_magic ==
+ clsm->lso_lsm.lsm_md_magic &&
+ plsm->lso_lsm.lsm_md_stripe_count ==
+ clsm->lso_lsm.lsm_md_stripe_count &&
+ plsm->lso_lsm.lsm_md_master_mdt_index ==
+ clsm->lso_lsm.lsm_md_master_mdt_index &&
+ plsm->lso_lsm.lsm_md_hash_type ==
+ clsm->lso_lsm.lsm_md_hash_type &&
+ lmv_inherit_next(plsm->lso_lsm.lsm_md_max_inherit) ==
+ clsm->lso_lsm.lsm_md_max_inherit &&
+ lmv_inherit_rr_next(plsm->lso_lsm.lsm_md_max_inherit_rr) ==
+ clsm->lso_lsm.lsm_md_max_inherit_rr;
}
union lmv_mds_md;
-void lmv_free_memmd(struct lmv_stripe_md *lsm);
+struct lmv_stripe_object *lmv_stripe_object_alloc(__u32 magic,
+ const union lmv_mds_md *lmm,
+ size_t lmm_size);
+
+void lmv_stripe_object_put(struct lmv_stripe_object **lsm_obj);
+
+struct lmv_stripe_object *
+ lmv_stripe_object_get(struct lmv_stripe_object *lsm_obj);
static inline void lmv1_le_to_cpu(struct lmv_mds_md_v1 *lmv_dst,
const struct lmv_mds_md_v1 *lmv_src)
static inline int lmv_name_to_stripe_index(struct lmv_mds_md_v1 *lmv,
const char *name, int namelen)
{
- if (lmv->lmv_magic == LMV_MAGIC_V1)
+ if (lmv->lmv_magic == LMV_MAGIC_V1 ||
+ lmv->lmv_magic == LMV_MAGIC_STRIPE)
return __lmv_name_to_stripe_index(lmv->lmv_hash_type,
lmv->lmv_stripe_count,
lmv->lmv_migrate_hash,
lmv->lmv_migrate_offset,
name, namelen, true);
- if (lmv->lmv_magic == cpu_to_le32(LMV_MAGIC_V1))
+ if (lmv->lmv_magic == cpu_to_le32(LMV_MAGIC_V1) ||
+ lmv->lmv_magic == cpu_to_le32(LMV_MAGIC_STRIPE))
return __lmv_name_to_stripe_index(
le32_to_cpu(lmv->lmv_hash_type),
le32_to_cpu(lmv->lmv_stripe_count),
if (le32_to_cpu(lmv->lmv_stripe_count) == 0)
goto insane;
- if (!lmv_is_known_hash_type(le32_to_cpu(lmv->lmv_hash_type)))
+ if (!lmv_is_sane_hash_type(le32_to_cpu(lmv->lmv_hash_type)))
goto insane;
return true;
if (le32_to_cpu(lmv->lmv_stripe_count) == 0)
goto insane;
- if (!lmv_is_known_hash_type(le32_to_cpu(lmv->lmv_hash_type)))
+ if (!lmv_is_sane_hash_type(le32_to_cpu(lmv->lmv_hash_type)))
goto insane;
return true;