-static int mdd_dir_page_build(const struct lu_env *env, int first,
- void *area, int nob, const struct dt_it_ops *iops,
- struct dt_it *it, __u64 *start, __u64 *end,
- struct lu_dirent **last)
+static int mdd_append_attrs(const struct lu_env *env,
+ struct mdd_device *mdd,
+ __u32 attr,
+ const struct dt_it_ops *iops,
+ struct dt_it *it,
+ struct lu_dirent*ent)
+{
+ struct mdd_thread_info *info = mdd_env_info(env);
+ struct lu_fid *fid = &info->mti_fid2;
+ int len = cpu_to_le16(ent->lde_namelen);
+ const unsigned align = sizeof(struct luda_type) - 1;
+ struct lu_fid_pack *pack;
+ struct mdd_object *obj;
+ struct luda_type *lt;
+ int rc = 0;
+
+ if (attr & LUDA_FID) {
+ pack = (struct lu_fid_pack *)iops->rec(env, it);
+ if (IS_ERR(pack)) {
+ rc = PTR_ERR(pack);
+ ent->lde_attrs = 0;
+ goto out;
+ }
+ rc = fid_unpack(pack, fid);
+ if (rc != 0) {
+ ent->lde_attrs = 0;
+ goto out;
+ }
+
+ fid_cpu_to_le(&ent->lde_fid, fid);
+ ent->lde_attrs = LUDA_FID;
+ }
+
+ /* check if file type is required */
+ if (attr & LUDA_TYPE) {
+ if (!(attr & LUDA_FID)) {
+ CERROR("wrong attr : [%x]\n",attr);
+ rc = -EINVAL;
+ goto out;
+ }
+
+ obj = mdd_object_find(env, mdd, fid);
+ if (obj == NULL) /* remote object */
+ goto out;
+
+ if (IS_ERR(obj)) {
+ rc = PTR_ERR(obj);
+ goto out;
+ }
+
+ if (mdd_object_exists(obj) == +1) {
+ len = (len + align) & ~align;
+
+ lt = (void *) ent->lde_name + len;
+ lt->lt_type = cpu_to_le16(mdd_object_type(obj));
+
+ ent->lde_attrs |= LUDA_TYPE;
+ }
+ mdd_object_put(env, obj);
+ }
+out:
+ ent->lde_attrs = cpu_to_le32(ent->lde_attrs);
+ return rc;
+}
+
+static int mdd_dir_page_build(const struct lu_env *env, struct mdd_device *mdd,
+ int first, void *area, int nob,
+ const struct dt_it_ops *iops, struct dt_it *it,
+ __u64 *start, __u64 *end,
+ struct lu_dirent **last, __u32 attr)