Whamcloud - gitweb
LU-957 lfsck: LFSCK main engine
[fs/lustre-release.git] / lustre / osd-ldiskfs / osd_handler.c
index 0a258ec..8e4c862 100644 (file)
@@ -90,6 +90,7 @@ static const char remote_obj_dir[] = "REM_OBJ_DIR";
 static const struct lu_object_operations      osd_lu_obj_ops;
 static const struct dt_object_operations      osd_obj_ops;
 static const struct dt_object_operations      osd_obj_ea_ops;
+static const struct dt_object_operations      osd_obj_otable_it_ops;
 static const struct dt_index_operations       osd_index_iam_ops;
 static const struct dt_index_operations       osd_index_ea_ops;
 
@@ -524,13 +525,18 @@ static int osd_object_init(const struct lu_env *env, struct lu_object *l,
        LINVRNT(osd_invariant(obj));
 
        result = osd_fid_lookup(env, obj, lu_object_fid(l), conf);
-        obj->oo_dt.do_body_ops = &osd_body_ops_new;
-        if (result == 0) {
-                if (obj->oo_inode != NULL)
-                        osd_object_init0(obj);
-        }
-        LINVRNT(osd_invariant(obj));
-        return result;
+       obj->oo_dt.do_body_ops = &osd_body_ops_new;
+       if (result == 0) {
+               if (obj->oo_inode != NULL) {
+                       osd_object_init0(obj);
+               } else if (fid_is_otable_it(&l->lo_header->loh_fid)) {
+                       obj->oo_dt.do_ops = &osd_obj_otable_it_ops;
+                       /* LFSCK iterator object is special without inode */
+                       l->lo_header->loh_attr |= LOHA_EXISTS;
+               }
+       }
+       LINVRNT(osd_invariant(obj));
+       return result;
 }
 
 /*
@@ -2758,6 +2764,15 @@ static int osd_index_try(const struct lu_env *env, struct dt_object *dt,
         return result;
 }
 
+static int osd_otable_it_attr_get(const struct lu_env *env,
+                                struct dt_object *dt,
+                                struct lu_attr *attr,
+                                struct lustre_capa *capa)
+{
+       attr->la_valid = 0;
+       return 0;
+}
+
 static const struct dt_object_operations osd_obj_ops = {
         .do_read_lock         = osd_object_read_lock,
         .do_write_lock        = osd_object_write_lock,
@@ -2822,6 +2837,11 @@ static const struct dt_object_operations osd_obj_ea_ops = {
         .do_data_get          = osd_data_get,
 };
 
+static const struct dt_object_operations osd_obj_otable_it_ops = {
+       .do_attr_get    = osd_otable_it_attr_get,
+       .do_index_try   = osd_index_try,
+};
+
 static int osd_index_declare_iam_delete(const struct lu_env *env,
                                         struct dt_object *dt,
                                         const struct dt_key *key,