+ * directory structure on legacy MDT:
+ *
+ * REM_OBJ_DIR/ per mdt
+ * AGENT_OBJ_DIR/ per mdt
+ *
+ */
+static const char remote_obj_dir[] = "REM_OBJ_DIR";
+static const char agent_obj_dir[] = "AGENT_OBJ_DIR";
+int osd_mdt_init(struct osd_device *dev)
+{
+ struct lvfs_run_ctxt new;
+ struct lvfs_run_ctxt save;
+ struct dentry *parent;
+ struct osd_mdobj_map *omm;
+ struct dentry *d;
+ int rc = 0;
+ ENTRY;
+
+ OBD_ALLOC_PTR(dev->od_mdt_map);
+ if (dev->od_mdt_map == NULL)
+ RETURN(-ENOMEM);
+
+ omm = dev->od_mdt_map;
+
+ LASSERT(dev->od_fsops);
+
+ parent = osd_sb(dev)->s_root;
+ osd_push_ctxt(dev, &new, &save);
+
+ d = simple_mkdir(parent, dev->od_mnt, agent_obj_dir,
+ 0755, 1);
+ if (IS_ERR(d))
+ GOTO(cleanup, rc = PTR_ERR(d));
+
+ omm->omm_agent_dentry = d;
+
+cleanup:
+ pop_ctxt(&save, &new, NULL);
+ if (rc) {
+ if (omm->omm_agent_dentry != NULL)
+ dput(omm->omm_agent_dentry);
+ OBD_FREE_PTR(omm);
+ dev->od_mdt_map = NULL;
+ }
+ RETURN(rc);
+}
+
+static void osd_mdt_fini(struct osd_device *osd)
+{
+ struct osd_mdobj_map *omm = osd->od_mdt_map;
+
+ if (omm == NULL)
+ return;
+
+ if (omm->omm_agent_dentry)
+ dput(omm->omm_agent_dentry);
+
+ OBD_FREE_PTR(omm);
+ osd->od_ost_map = NULL;
+}
+
+int osd_create_agent_inode(const struct lu_env *env, struct osd_device *osd,
+ struct osd_object *obj, struct osd_thandle *oh)
+{
+ struct osd_mdobj_map *omm = osd->od_mdt_map;
+ struct osd_thread_info *oti = osd_oti_get(env);
+ char *name_buf = oti->oti_name;
+ struct dentry *agent;
+ struct dentry *parent;
+ int rc;
+
+ parent = omm->omm_agent_dentry;
+ sprintf(name_buf, DFID_NOBRACE, PFID(lu_object_fid(&obj->oo_dt.do_lu)));
+ agent = osd_child_dentry_by_inode(env, parent->d_inode,
+ name_buf, strlen(name_buf));
+ mutex_lock(&parent->d_inode->i_mutex);
+ rc = osd_ldiskfs_add_entry(oh->ot_handle, agent, obj->oo_inode, NULL);
+ parent->d_inode->i_nlink++;
+ mark_inode_dirty(parent->d_inode);
+ mutex_unlock(&parent->d_inode->i_mutex);
+ if (rc != 0)
+ CERROR("%s: "DFID" add agent error: rc = %d\n", osd_name(osd),
+ PFID(lu_object_fid(&obj->oo_dt.do_lu)), rc);
+ RETURN(rc);
+}
+
+int osd_delete_agent_inode(const struct lu_env *env, struct osd_device *osd,
+ struct osd_object *obj, struct osd_thandle *oh)
+{
+ struct osd_mdobj_map *omm = osd->od_mdt_map;
+ struct osd_thread_info *oti = osd_oti_get(env);
+ char *name = oti->oti_name;
+ struct dentry *agent;
+ struct dentry *parent;
+ struct ldiskfs_dir_entry_2 *de;
+ struct buffer_head *bh;
+ int rc;
+
+ parent = omm->omm_agent_dentry;
+ sprintf(name, DFID, PFID(lu_object_fid(&obj->oo_dt.do_lu)));
+ agent = osd_child_dentry_by_inode(env, parent->d_inode,
+ name, strlen(name));
+ mutex_lock(&parent->d_inode->i_mutex);
+ bh = osd_ldiskfs_find_entry(parent->d_inode, agent, &de, NULL);
+ if (bh == NULL) {
+ mutex_unlock(&parent->d_inode->i_mutex);
+ RETURN(-ENOENT);
+ }
+ rc = ldiskfs_delete_entry(oh->ot_handle, parent->d_inode, de, bh);
+ parent->d_inode->i_nlink--;
+ mark_inode_dirty(parent->d_inode);
+ mutex_unlock(&parent->d_inode->i_mutex);
+ brelse(bh);
+ RETURN(rc);
+}
+
+/*