Whamcloud - gitweb
LU-5223 lod: generate linkEA for shard of striped directory
[fs/lustre-release.git] / lustre / lod / lod_object.c
index 5674a36..ed457a8 100644 (file)
@@ -44,6 +44,7 @@
 #include <lustre_fid.h>
 #include <lustre_lmv.h>
 #include <md_object.h>
+#include <lustre_linkea.h>
 
 #include "lod_internal.h"
 
@@ -1431,8 +1432,11 @@ next:
                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)
@@ -1476,9 +1480,9 @@ next:
                                cpu_to_le16(lo->ldo_def_stripe_offset);
                        v3->lmm_stripe_size =
                                cpu_to_le32(lo->ldo_def_stripe_size);
-                       if (lo->ldo_pool)
-                               strncpy(v3->lmm_pool_name, lo->ldo_pool,
-                                       LOV_MAXPOOLNAME);
+                       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);
@@ -1499,6 +1503,23 @@ next:
 
                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);
@@ -1890,8 +1911,11 @@ static int lod_xattr_set_lmv(const struct lu_env *env, struct dt_object *dt,
        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);
@@ -1933,9 +1957,9 @@ static int lod_xattr_set_lmv(const struct lu_env *env, struct dt_object *dt,
                                cpu_to_le16(lo->ldo_def_stripe_offset);
                        v3->lmm_stripe_size =
                                cpu_to_le32(lo->ldo_def_stripe_size);
-                       if (lo->ldo_pool)
-                               strncpy(v3->lmm_pool_name, lo->ldo_pool,
-                                       LOV_MAXPOOLNAME);
+                       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);
@@ -1954,6 +1978,23 @@ static int lod_xattr_set_lmv(const struct lu_env *env, struct dt_object *dt,
 
                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);
@@ -2076,9 +2117,9 @@ int lod_dir_striping_create_internal(const struct lu_env *env,
                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)
-                       strncpy(v3->lmm_pool_name, lo->ldo_pool,
-                               LOV_MAXPOOLNAME);
+               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);