#include "lfsck_internal.h"
-static void lfsck_unpack_ent(struct lu_dirent *ent)
+static void lfsck_unpack_ent(struct lu_dirent *ent, __u64 *cookie)
{
fid_le_to_cpu(&ent->lde_fid, &ent->lde_fid);
- ent->lde_hash = le64_to_cpu(ent->lde_hash);
+ *cookie = le64_to_cpu(ent->lde_hash);
ent->lde_reclen = le16_to_cpu(ent->lde_reclen);
ent->lde_namelen = le16_to_cpu(ent->lde_namelen);
ent->lde_attrs = le32_to_cpu(ent->lde_attrs);
ent->lde_name[ent->lde_namelen] = 0;
}
+static void lfsck_di_oit_put(const struct lu_env *env, struct lfsck_instance *lfsck)
+{
+ const struct dt_it_ops *iops;
+ struct dt_it *di;
+
+ spin_lock(&lfsck->li_lock);
+ iops = &lfsck->li_obj_oit->do_index_ops->dio_it;
+ di = lfsck->li_di_oit;
+ lfsck->li_di_oit = NULL;
+ spin_unlock(&lfsck->li_lock);
+ iops->put(env, di);
+}
+
+static void lfsck_di_dir_put(const struct lu_env *env, struct lfsck_instance *lfsck)
+{
+ const struct dt_it_ops *iops;
+ struct dt_it *di;
+
+ spin_lock(&lfsck->li_lock);
+ iops = &lfsck->li_obj_dir->do_index_ops->dio_it;
+ di = lfsck->li_di_dir;
+ lfsck->li_di_dir = NULL;
+ lfsck->li_cookie_dir = 0;
+ spin_unlock(&lfsck->li_lock);
+ iops->put(env, di);
+}
+
static void lfsck_close_dir(const struct lu_env *env,
struct lfsck_instance *lfsck)
{
const struct dt_it_ops *dir_iops = &dir_obj->do_index_ops->dio_it;
struct dt_it *dir_di = lfsck->li_di_dir;
- spin_lock(&lfsck->li_lock);
- lfsck->li_di_dir = NULL;
- spin_unlock(&lfsck->li_lock);
-
- dir_iops->put(env, dir_di);
+ lfsck_di_dir_put(env, lfsck);
dir_iops->fini(env, dir_di);
lfsck->li_obj_dir = NULL;
lfsck_object_put(env, dir_obj);
lfsck->li_new_scanned++;
rc = iops->rec(env, di, (struct dt_rec *)ent,
lfsck->li_args_dir);
+ lfsck_unpack_ent(ent, &lfsck->li_cookie_dir);
if (rc != 0) {
lfsck_fail(env, lfsck, true);
if (bk->lb_param & LPF_FAILOUT)
goto checkpoint;
}
- lfsck_unpack_ent(ent);
if (ent->lde_attrs & LUDA_IGNORE)
goto checkpoint;
PFID(&lfsck->li_pos_current.lp_dir_parent),
cfs_curproc_pid(), rc);
- if (lfsck->li_paused && cfs_list_empty(&lfsck->li_list_scan))
- oit_iops->put(&env, oit_di);
-
if (!OBD_FAIL_CHECK(OBD_FAIL_LFSCK_CRASH))
rc = lfsck_post(&env, lfsck, rc);
if (lfsck->li_di_dir != NULL)
lfsck_close_dir(&env, lfsck);
fini_oit:
- spin_lock(&lfsck->li_lock);
- lfsck->li_di_oit = NULL;
- spin_unlock(&lfsck->li_lock);
-
+ lfsck_di_oit_put(&env, lfsck);
oit_iops->fini(&env, oit_di);
if (rc == 1) {
if (!cfs_list_empty(&lfsck->li_list_double_scan))