+static int mdd_find_or_create_root(const struct lu_env *env,
+ struct mdd_device *mdd)
+{
+ struct dt_object *root;
+ struct md_object *mroot;
+ struct lu_fid *fid = &mdd_env_info(env)->mti_fid;
+ int rc = 0;
+
+ ENTRY;
+
+ /* Check if the "ROOT" entry exists already */
+ root = dt_store_open(env, mdd->mdd_child, "", mdd_root_dir_name,
+ fid);
+ if (!IS_ERR(root)) {
+ lu_object_put(env, &root->do_lu);
+ GOTO(out, rc = 0);
+ }
+
+ lu_root_fid(fid);
+ /* New Filesystem, create /ROOT */
+ mroot = llo_store_create_index(env, &mdd->mdd_md_dev, mdd->mdd_bottom,
+ "", mdd_root_dir_name, fid,
+ &dt_directory_features);
+ if (IS_ERR(mroot))
+ GOTO(out, rc = PTR_ERR(mroot));
+
+ lu_object_put(env, &mroot->mo_lu);
+out:
+ if (rc == 0)
+ mdd->mdd_root_fid = *fid;
+
+ RETURN(rc);
+}
+