+ /* sanity check of target list */
+ if (param->lsp_is_specific) {
+ char mdtname[MAX_OBD_NAME + 1];
+ bool found = false;
+ int i;
+
+ for (i = 0; i < param->lsp_stripe_count; i++) {
+ snprintf(mdtname, sizeof(mdtname), "%s-MDT%04x_UUID",
+ fsname, param->lsp_tgts[i]);
+ rc = llapi_search_tgt(fsname, pool_name, mdtname, true);
+ if (rc <= 0) {
+ if (rc == 0)
+ rc = -ENODEV;
+
+ llapi_error(LLAPI_MSG_ERROR, rc,
+ "%s: cannot find MDT %s in %s",
+ __func__, mdtname,
+ pool_name != NULL ?
+ "pool" : "system");
+ return rc;
+ }
+
+ /* Make sure stripe offset is in MDT list. */
+ if (param->lsp_tgts[i] == param->lsp_stripe_offset)
+ found = true;
+ }
+ if (!found) {
+ llapi_error(LLAPI_MSG_ERROR, -EINVAL,
+ "%s: stripe offset '%d' is not in the "
+ "target list",
+ __func__, param->lsp_stripe_offset);
+ return -EINVAL;
+ }
+ }
+
+ return 0;
+}
+
+static inline void param2lmu(struct lmv_user_md *lmu,
+ const struct llapi_stripe_param *param)
+{
+ lmu->lum_magic = param->lsp_is_specific ? LMV_USER_MAGIC_SPECIFIC :
+ LMV_USER_MAGIC;
+ lmu->lum_stripe_count = param->lsp_stripe_count;
+ lmu->lum_stripe_offset = param->lsp_stripe_offset;
+ lmu->lum_hash_type = param->lsp_stripe_pattern;
+ if (param->lsp_pool != NULL)
+ strncpy(lmu->lum_pool_name, param->lsp_pool, LOV_MAXPOOLNAME);
+ if (param->lsp_is_specific) {
+ int i;
+
+ for (i = 0; i < param->lsp_stripe_count; i++)
+ lmu->lum_objects[i].lum_mds = param->lsp_tgts[i];
+ }
+}
+
+int llapi_dir_set_default_lmv(const char *name,
+ const struct llapi_stripe_param *param)
+{
+ struct lmv_user_md lmu = { 0 };
+ int fd;
+ int rc = 0;
+
+ rc = verify_dir_param(name, param);
+ if (rc)
+ return rc;
+
+ /* TODO: default lmv doesn't support specific targets yet */
+ if (param->lsp_is_specific)
+ return -EINVAL;
+
+ param2lmu(&lmu, param);
+