+/**
+ * A generic function to initialize the stripe objects.
+ *
+ * A protected version of lod_load_striping_locked() - load the striping
+ * information from storage, parse that and instantiate LU objects to
+ * represent the stripes. The LOD object \a lo supplies a pointer to the
+ * next sub-object in the LU stack so we can lock it. Also use \a lo to
+ * return an array of references to the newly instantiated objects.
+ *
+ * \param[in] env execution environment for this thread
+ * \param[in,out] lo LOD object, where striping is stored and
+ * which gets an array of references
+ *
+ * \retval 0 if parsing and object creation succeed
+ * \retval negative error number on failure
+ **/
+int lod_load_striping(const struct lu_env *env, struct lod_object *lo)
+{
+ struct dt_object *next = dt_object_child(&lo->ldo_obj);
+ int rc = 0;
+
+ /* currently this code is supposed to be called from declaration
+ * phase only, thus the object is not expected to be locked by caller */
+ dt_write_lock(env, next, 0);
+ rc = lod_load_striping_locked(env, lo);
+ dt_write_unlock(env, next);
+ return rc;
+}
+
+/**
+ * Verify striping.
+ *
+ * Check the validity of all fields including the magic, stripe size,
+ * stripe count, stripe offset and that the pool is present. Also check
+ * that each target index points to an existing target. The additional
+ * \a is_from_disk turns additional checks. In some cases zero fields
+ * are allowed (like pattern=0).
+ *
+ * \param[in] d LOD device
+ * \param[in] buf buffer with LOV EA to verify
+ * \param[in] is_from_disk 0 - from user, allow some fields to be 0
+ * 1 - from disk, do not allow
+ *
+ * \retval 0 if the striping is valid
+ * \retval -EINVAL if striping is invalid
+ */