- dt_obj = dt_store_open(env, dt, "", fld_index_name, &fid);
- if (!IS_ERR(dt_obj)) {
- fld->lsf_obj = dt_obj;
- rc = dt_obj->do_ops->do_index_try(env, dt_obj,
- &fld_index_features);
- if (rc == 0) {
- LASSERT(dt_obj->do_index_ops != NULL);
- rc = fld_insert_igif_fld(fld, env);
-
- if (rc != 0) {
- CERROR("insert igif in fld! = %d\n", rc);
- lu_object_put(env, &dt_obj->do_lu);
- fld->lsf_obj = NULL;
- }
- } else if (rc == -ERANGE) {
- CWARN("%s: File \"%s\" doesn't support range lookup, "
- "using stub. DNE and FIDs on OST will not work "
- "with this backend\n",
- fld->lsf_name, fld_index_name);
-
- LASSERT(dt_obj->do_index_ops == NULL);
- fld->lsf_no_range_lookup = 1;
- rc = 0;
- } else {
- CERROR("%s: File \"%s\" is not index, rc %d!\n",
- fld->lsf_name, fld_index_name, rc);
- lu_object_put(env, &fld->lsf_obj->do_lu);
- fld->lsf_obj = NULL;
+ rc = fld_insert_entry(env, fld, &IGIF_FLD_RANGE);
+ if (rc != 0)
+ RETURN(rc);
+
+ rc = fld_insert_entry(env, fld, &DOT_LUSTRE_FLD_RANGE);
+ if (rc != 0)
+ RETURN(rc);
+
+ rc = fld_insert_entry(env, fld, &ROOT_FLD_RANGE);
+
+ RETURN(rc);
+}
+
+int fld_index_init(const struct lu_env *env, struct lu_server_fld *fld,
+ struct dt_device *dt, int type)
+{
+ struct dt_object *dt_obj = NULL;
+ struct lu_fid fid;
+ struct lu_attr *attr = NULL;
+ struct lu_seq_range *range = NULL;
+ struct fld_thread_info *info;
+ struct dt_object_format dof;
+ struct dt_it *it;
+ const struct dt_it_ops *iops;
+ int rc;
+ __u32 index;
+ ENTRY;
+
+ info = lu_context_key_get(&env->le_ctx, &fld_thread_key);
+ LASSERT(info != NULL);
+
+ lu_local_obj_fid(&fid, FLD_INDEX_OID);
+ OBD_ALLOC_PTR(attr);
+ if (attr == NULL)
+ RETURN(-ENOMEM);
+
+ memset(attr, 0, sizeof(*attr));
+ attr->la_valid = LA_MODE;
+ attr->la_mode = S_IFREG | 0666;
+ dof.dof_type = DFT_INDEX;
+ dof.u.dof_idx.di_feat = &fld_index_features;
+
+ dt_obj = dt_locate(env, dt, &fid);
+ if (IS_ERR(dt_obj)) {
+ rc = PTR_ERR(dt_obj);
+ dt_obj = NULL;
+ GOTO(out, rc);
+ }
+
+ LASSERT(dt_obj != NULL);
+ if (!dt_object_exists(dt_obj)) {
+ lu_object_put(env, &dt_obj->do_lu);
+ dt_obj = dt_find_or_create(env, dt, &fid, &dof, attr);
+ fld->lsf_new = 1;
+ if (IS_ERR(dt_obj)) {
+ rc = PTR_ERR(dt_obj);
+ CERROR("%s: Can't find \"%s\" obj %d\n", fld->lsf_name,
+ fld_index_name, rc);
+ dt_obj = NULL;
+ GOTO(out, rc);