- rc = lod_prep_lmv_md(env, dt, &lmv_buf);
- if (rc != 0)
- GOTO(out_put, rc);
- lmm = lmv_buf.lb_buf;
-
- OBD_ALLOC_PTR(slave_lmm);
- if (slave_lmm == NULL)
- GOTO(out_put, rc = -ENOMEM);
-
- lod_prep_slave_lmv_md(slave_lmm, lmm);
- slave_lmv_buf.lb_buf = slave_lmm;
- slave_lmv_buf.lb_len = sizeof(*slave_lmm);
-
- if (!dt_try_as_dir(env, dt_object_child(dt)))
- GOTO(out_put, rc = -EINVAL);
-
- rec->rec_type = S_IFDIR;
- for (i = 0; i < lo->ldo_stripenr; i++) {
- struct dt_object *dto = stripe[i];
- char *stripe_name = info->lti_key;
- struct lu_name *sname;
- struct linkea_data ldata = { 0 };
- struct lu_buf linkea_buf;
-
- rc = dt_declare_create(env, dto, attr, NULL, dof, th);
- if (rc != 0)
- GOTO(out_put, rc);
-
- if (!dt_try_as_dir(env, dto))
- GOTO(out_put, rc = -EINVAL);
-
- rec->rec_fid = lu_object_fid(&dto->do_lu);
- rc = dt_declare_insert(env, dto, (const struct dt_rec *)rec,
- (const struct dt_key *)dot, th);
- if (rc != 0)
- GOTO(out_put, rc);
-
- /* master stripe FID will be put to .. */
- rec->rec_fid = lu_object_fid(&dt->do_lu);
- rc = dt_declare_insert(env, dto, (const struct dt_rec *)rec,
- (const struct dt_key *)dotdot, th);
- if (rc != 0)
- GOTO(out_put, rc);
-
- /* probably nothing to inherite */
- if (lo->ldo_striping_cached &&
- !LOVEA_DELETE_VALUES(lo->ldo_def_stripe_size,
- lo->ldo_def_stripenr,
- lo->ldo_def_stripe_offset)) {
- struct lov_user_md_v3 *v3;
-
- /* sigh, lti_ea_store has been used for lmv_buf,
- * so we have to allocate buffer for default
- * stripe EA */
- OBD_ALLOC_PTR(v3);
- if (v3 == NULL)
- GOTO(out_put, rc = -ENOMEM);
-
- memset(v3, 0, sizeof(*v3));
- v3->lmm_magic = cpu_to_le32(LOV_USER_MAGIC_V3);
- v3->lmm_stripe_count =
- cpu_to_le16(lo->ldo_def_stripenr);
- v3->lmm_stripe_offset =
- cpu_to_le16(lo->ldo_def_stripe_offset);
- v3->lmm_stripe_size =
- cpu_to_le32(lo->ldo_def_stripe_size);
- if (lo->ldo_pool != NULL)
- strlcpy(v3->lmm_pool_name, lo->ldo_pool,
- sizeof(v3->lmm_pool_name));
-
- info->lti_buf.lb_buf = v3;
- info->lti_buf.lb_len = sizeof(*v3);
- rc = dt_declare_xattr_set(env, dto,
- &info->lti_buf,
- XATTR_NAME_LOV,
- 0, th);
- OBD_FREE_PTR(v3);
- if (rc != 0)
- GOTO(out_put, rc);
- }
-
- slave_lmm->lmv_master_mdt_index = cpu_to_le32(i);
- rc = dt_declare_xattr_set(env, dto, &slave_lmv_buf,
- XATTR_NAME_LMV, 0, th);
- if (rc != 0)
- GOTO(out_put, rc);
-
- snprintf(stripe_name, sizeof(info->lti_key), DFID":%u",
- PFID(lu_object_fid(&dto->do_lu)), i);
-
- sname = lod_name_get(env, stripe_name, strlen(stripe_name));
- rc = linkea_data_new(&ldata, &info->lti_linkea_buf);
- if (rc != 0)
- GOTO(out_put, rc);
-
- rc = linkea_add_buf(&ldata, sname, lu_object_fid(&dt->do_lu));
- if (rc != 0)
- GOTO(out_put, rc);
-
- linkea_buf.lb_buf = ldata.ld_buf->lb_buf;
- linkea_buf.lb_len = ldata.ld_leh->leh_len;
- rc = dt_declare_xattr_set(env, dto, &linkea_buf,
- XATTR_NAME_LINK, 0, th);
- if (rc != 0)
- GOTO(out_put, rc);
-
- rec->rec_fid = lu_object_fid(&dto->do_lu);
- rc = dt_declare_insert(env, dt_object_child(dt),
- (const struct dt_rec *)rec,
- (const struct dt_key *)stripe_name, th);
- if (rc != 0)
- GOTO(out_put, rc);
-
- rc = dt_declare_ref_add(env, dt_object_child(dt), th);
- if (rc != 0)
- GOTO(out_put, rc);
- }
-
- rc = dt_declare_xattr_set(env, dt_object_child(dt), &lmv_buf,
- XATTR_NAME_LMV, 0, th);