struct lu_attr lti_attr;
struct lod_it lti_it;
struct ldlm_res_id lti_res_id;
-
- /* used to hold lu_dirent, NAME_MAX + sizeof(struct lu_dirent) */
- char lti_key[NAME_MAX + sizeof(struct lu_dirent)];
-
+ /* used to hold lu_dirent, sizeof(struct lu_dirent) + NAME_MAX */
+ char lti_key[sizeof(struct lu_dirent) + NAME_MAX];
struct dt_object_format lti_format;
+ struct lu_name lti_name;
+ struct lu_buf lti_linkea_buf;
};
extern const struct lu_device_operations lod_lu_ops;
return info;
}
+static inline struct lu_name *
+lod_name_get(const struct lu_env *env, const void *area, int len)
+{
+ struct lu_name *lname;
+
+ lname = &lod_env_info(env)->lti_name;
+ lname->ln_name = area;
+ lname->ln_namelen = len;
+ return lname;
+}
+
#define lod_foreach_ost(__dev, index) \
if ((__dev)->lod_osts_size > 0) \
cfs_foreach_bit((__dev)->lod_ost_bitmap, (index))
#include <lustre_fid.h>
#include <lustre_lmv.h>
#include <md_object.h>
+#include <lustre_linkea.h>
#include "lod_internal.h"
GOTO(out_put, rc = -EINVAL);
for (i = 0; i < lo->ldo_stripenr; i++) {
- struct dt_object *dto = stripe[i];
- char *stripe_name = info->lti_key;
+ 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)
snprintf(stripe_name, sizeof(info->lti_key), DFID":%d",
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);
+
rc = dt_declare_insert(env, dt_object_child(dt),
(const struct dt_rec *)lu_object_fid(&dto->do_lu),
(const struct dt_key *)stripe_name, th);
slave_lmv_buf.lb_len = sizeof(*slave_lmm);
for (i = 0; i < lo->ldo_stripenr; i++) {
- struct dt_object *dto;
- char *stripe_name = info->lti_key;
+ struct dt_object *dto;
+ char *stripe_name = info->lti_key;
+ struct lu_name *sname;
+ struct linkea_data ldata = { 0 };
+ struct lu_buf linkea_buf;
dto = lo->ldo_stripe[i];
dt_write_lock(env, dto, MOR_TGT_CHILD);
snprintf(stripe_name, sizeof(info->lti_key), DFID":%d",
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, rc);
+
+ rc = linkea_add_buf(&ldata, sname, lu_object_fid(&dt->do_lu));
+ if (rc != 0)
+ GOTO(out, rc);
+
+ linkea_buf.lb_buf = ldata.ld_buf->lb_buf;
+ linkea_buf.lb_len = ldata.ld_leh->leh_len;
+ rc = dt_xattr_set(env, dto, &linkea_buf, XATTR_NAME_LINK,
+ 0, th, BYPASS_CAPA);
+ if (rc != 0)
+ GOTO(out, rc);
+
rc = dt_insert(env, dt_object_child(dt),
(const struct dt_rec *)lu_object_fid(&dto->do_lu),
(const struct dt_key *)stripe_name, th, capa, 0);