===================================================================
--- iam.orig/fs/ext3/iam_lvar.c
+++ iam/fs/ext3/iam_lvar.c
-@@ -0,0 +1,1048 @@
+@@ -0,0 +1,1045 @@
+/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
+ * vim:expandtab:shiftwidth=8:tabstop=8:
+ *
+ l->il_at = lvar_lentry(e_next(l, n_cur(l)));
+}
+
-+atomic_t lvar_enoent_debug = ATOMIC_INIT(0);
-+EXPORT_SYMBOL(lvar_enoent_debug);
-+
+static int lvar_lookup(struct iam_leaf *leaf, const struct iam_key *k)
+{
+ struct lvar_leaf_entry *found;
+ result |= IAM_LOOKUP_LAST;
+ assert_inv(n_invariant(leaf));
+
-+ if (unlikely(atomic_read(&lvar_enoent_debug))) {
++ if (unlikely(current->debugging1 & 0x1)) {
+ struct iam_path *path;
+
+ path = leaf->il_path;
RETURN(rc);
}
-extern atomic_t lvar_enoent_debug;
static int mdd_unlink(const struct lu_env *env, struct md_object *pobj,
struct md_object *cobj, const char *name,
struct md_attr *ma)
GOTO(cleanup, rc);
is_dir = S_ISDIR(lu_object_attr(&cobj->mo_lu));
- /*
- * This should be per-thread debugging flag, but
- */
- atomic_inc(&lvar_enoent_debug);
+
+ current->debugging1 |= 0x1; /* XXX enable lvar_enoent_debug
+ * debugging */
rc = __mdd_index_delete(env, mdd_pobj, name, is_dir, handle,
mdd_object_capa(env, mdd_pobj));
- atomic_dec(&lvar_enoent_debug);
+ current->debugging1 &= ~0x1;
if (rc)
GOTO(cleanup, rc);
/* Let lower layer know current lock mode. */
info->mti_spec.sp_cr_mode =
mdt_dlm_mode2mdl_mode(lh->mlh_pdo_mode);
-
- /*
+
+ /*
* Do perform lookup sanity check. We do not know if name exists
* or not.
*/
info->mti_spec.sp_cr_lookup = 1;
-
+
rc = mdo_create(info->mti_env, next, rr->rr_name,
mdt_object_child(child),
&info->mti_spec, ma);
ma->ma_need = MA_INODE;
ma->ma_valid = 0;
-
+
/*
* Cross-ref create can encounter already created obj in case of
* recovery, just get attr in that case.
mdt_lprocfs_time_start(info->mti_mdt, &info->mti_time,
LPROC_MDT_REINT_SETATTR);
-
+
DEBUG_REQ(D_INODE, req, "setattr "DFID" %x", PFID(rr->rr_fid1),
(unsigned int)ma->ma_attr.la_valid);
mdt_lprocfs_time_start(info->mti_mdt, &info->mti_time,
LPROC_MDT_REINT_CREATE);
-
+
if (MDT_FAIL_CHECK(OBD_FAIL_MDS_REINT_CREATE))
GOTO(out, rc = err_serious(-ESTALE));
mdt_lprocfs_time_start(info->mti_mdt, &info->mti_time,
LPROC_MDT_REINT_UNLINK);
-
+
+ /*
+ * XXX Enforce full debugging log for unlinks, to track buffalo
+ * -ENOENT error.
+ */
+ current->debugging0 = ~0;
+
DEBUG_REQ(D_INODE, req, "unlink "DFID"/%s\n", PFID(rr->rr_fid1),
rr->rr_name);
mdt_shrink_reply(info, REPLY_REC_OFF + 1, 0, 0);
mdt_lprocfs_time_end(info->mti_mdt, &info->mti_time,
LPROC_MDT_REINT_UNLINK);
+ current->debugging0 = 0;
return rc;
}
mdt_lprocfs_time_start(info->mti_mdt, &info->mti_time,
LPROC_MDT_REINT_LINK);
-
+
DEBUG_REQ(D_INODE, req, "link "DFID" to "DFID"/%s",
PFID(rr->rr_fid1), PFID(rr->rr_fid2), rr->rr_name);
* processing it */
if (lu_fid_eq(rr->rr_fid1, rr->rr_fid2))
GOTO(out, rc = -EPERM);
-
+
/* step 1: find & lock the target parent dir */
lhp = &info->mti_lh[MDT_LH_PARENT];
mdt_lock_pdo_init(lhp, LCK_EX, rr->rr_name,
/* step 2: find & lock the source */
lhs = &info->mti_lh[MDT_LH_CHILD];
mdt_lock_reg_init(lhs, LCK_EX);
-
+
ms = mdt_object_find(info->mti_env, info->mti_mdt, rr->rr_fid1);
if (IS_ERR(ms))
GOTO(out_unlock_parent, rc = PTR_ERR(ms));
-
+
rc = mdt_object_lock(info, ms, lhs, MDS_INODELOCK_UPDATE,
MDT_CROSS_LOCK);
if (rc != 0) {
mdt_lprocfs_time_start(info->mti_mdt, &info->mti_time,
LPROC_MDT_REINT_RENAME);
-
+
if (info->mti_cross_ref) {
rc = mdt_reint_rename_tgt(info);
mdt_lprocfs_time_end(info->mti_mdt, &info->mti_time,