extern unsigned long cfs_fail_loc;
extern unsigned int cfs_fail_val;
+extern int cfs_fail_err;
extern wait_queue_head_t cfs_race_waitq;
extern int cfs_race_state;
#define CFS_FAIL_RAND 0x08000000 /* fail 1/N of the times */
#define CFS_FAIL_USR1 0x04000000 /* user flag */
-#define CFS_FAIL_PRECHECK(id) (cfs_fail_loc && \
- (cfs_fail_loc & CFS_FAIL_MASK_LOC) == \
- ((id) & CFS_FAIL_MASK_LOC))
+/* CFS_FAULT may be combined with any one of the above flags. */
+#define CFS_FAULT 0x02000000 /* match any CFS_FAULT_CHECK */
+
+static inline bool CFS_FAIL_PRECHECK(__u32 id)
+{
+ return cfs_fail_loc != 0 &&
+ ((cfs_fail_loc & CFS_FAIL_MASK_LOC) == (id & CFS_FAIL_MASK_LOC) ||
+ (cfs_fail_loc & id & CFS_FAULT));
+}
static inline int cfs_fail_check_set(__u32 id, __u32 value,
int set, int quiet)
#define CFS_FAIL_TIMEOUT_MS_ORSET(id, value, ms) \
cfs_fail_timeout_set(id, value, ms, CFS_FAIL_LOC_ORSET)
+#define CFS_FAULT_CHECK(id) \
+ CFS_FAIL_CHECK(CFS_FAULT | (id))
+
#ifdef __KERNEL__
/* The idea here is to synchronise two threads to force a race. The
* first thread that calls this with a matching fail_loc is put to
LASSERT(dt);
LASSERT(dt->do_ops);
LASSERT(dt->do_ops->do_declare_create);
+
+ if (CFS_FAULT_CHECK(OBD_FAIL_DT_DECLARE_CREATE))
+ return cfs_fail_err;
+
return dt->do_ops->do_declare_create(env, dt, attr, hint, dof, th);
}
LASSERT(dt);
LASSERT(dt->do_ops);
LASSERT(dt->do_ops->do_create);
+
+ if (CFS_FAULT_CHECK(OBD_FAIL_DT_CREATE))
+ return cfs_fail_err;
+
return dt->do_ops->do_create(env, dt, attr, hint, dof, th);
}
LASSERT(dt);
LASSERT(dt->do_ops);
LASSERT(dt->do_ops->do_declare_destroy);
+
+ if (CFS_FAULT_CHECK(OBD_FAIL_DT_DECLARE_DESTROY))
+ return cfs_fail_err;
+
return dt->do_ops->do_declare_destroy(env, dt, th);
}
LASSERT(dt);
LASSERT(dt->do_ops);
LASSERT(dt->do_ops->do_destroy);
+
+ if (CFS_FAULT_CHECK(OBD_FAIL_DT_DESTROY))
+ return cfs_fail_err;
+
return dt->do_ops->do_destroy(env, dt, th);
}
LASSERT(dt);
LASSERT(dt->do_ops);
LASSERT(dt->do_ops->do_declare_attr_get);
+
+ if (CFS_FAULT_CHECK(OBD_FAIL_DT_DECLARE_ATTR_GET))
+ return cfs_fail_err;
+
return dt->do_ops->do_declare_attr_get(env, dt, capa);
}
LASSERT(dt);
LASSERT(dt->do_ops);
LASSERT(dt->do_ops->do_attr_get);
+
+ if (CFS_FAULT_CHECK(OBD_FAIL_DT_ATTR_GET))
+ return cfs_fail_err;
+
return dt->do_ops->do_attr_get(env, dt, la, arg);
}
LASSERT(dt);
LASSERT(dt->do_ops);
LASSERT(dt->do_ops->do_declare_attr_set);
+
+ if (CFS_FAULT_CHECK(OBD_FAIL_DT_DECLARE_ATTR_SET))
+ return cfs_fail_err;
+
return dt->do_ops->do_declare_attr_set(env, dt, la, th);
}
LASSERT(dt);
LASSERT(dt->do_ops);
LASSERT(dt->do_ops->do_attr_set);
+
+ if (CFS_FAULT_CHECK(OBD_FAIL_DT_ATTR_SET))
+ return cfs_fail_err;
+
return dt->do_ops->do_attr_set(env, dt, la, th, capa);
}
LASSERT(dt);
LASSERT(dt->do_ops);
LASSERT(dt->do_ops->do_declare_ref_add);
+
+ if (CFS_FAULT_CHECK(OBD_FAIL_DT_DECLARE_REF_ADD))
+ return cfs_fail_err;
+
return dt->do_ops->do_declare_ref_add(env, dt, th);
}
LASSERT(dt);
LASSERT(dt->do_ops);
LASSERT(dt->do_ops->do_ref_add);
+
+ if (CFS_FAULT_CHECK(OBD_FAIL_DT_REF_ADD))
+ return cfs_fail_err;
+
return dt->do_ops->do_ref_add(env, dt, th);
}
LASSERT(dt);
LASSERT(dt->do_ops);
LASSERT(dt->do_ops->do_declare_ref_del);
+
+ if (CFS_FAULT_CHECK(OBD_FAIL_DT_DECLARE_REF_DEL))
+ return cfs_fail_err;
+
return dt->do_ops->do_declare_ref_del(env, dt, th);
}
LASSERT(dt);
LASSERT(dt->do_ops);
LASSERT(dt->do_ops->do_ref_del);
+
+ if (CFS_FAULT_CHECK(OBD_FAIL_DT_REF_DEL))
+ return cfs_fail_err;
+
return dt->do_ops->do_ref_del(env, dt, th);
}
LASSERT(dt);
LASSERT(dt->do_index_ops);
LASSERT(dt->do_index_ops->dio_declare_insert);
+
+ if (CFS_FAULT_CHECK(OBD_FAIL_DT_DECLARE_INSERT))
+ return cfs_fail_err;
+
return dt->do_index_ops->dio_declare_insert(env, dt, rec, key, th);
}
LASSERT(dt);
LASSERT(dt->do_index_ops);
LASSERT(dt->do_index_ops->dio_insert);
+
+ if (CFS_FAULT_CHECK(OBD_FAIL_DT_INSERT))
+ return cfs_fail_err;
+
return dt->do_index_ops->dio_insert(env, dt, rec, key, th,
capa, noquota);
}
LASSERT(dt);
LASSERT(dt->do_ops);
LASSERT(dt->do_ops->do_declare_xattr_del);
+
+ if (CFS_FAULT_CHECK(OBD_FAIL_DT_DECLARE_XATTR_DEL))
+ return cfs_fail_err;
+
return dt->do_ops->do_declare_xattr_del(env, dt, name, th);
}
LASSERT(dt);
LASSERT(dt->do_ops);
LASSERT(dt->do_ops->do_xattr_del);
+
+ if (CFS_FAULT_CHECK(OBD_FAIL_DT_XATTR_DEL))
+ return cfs_fail_err;
+
return dt->do_ops->do_xattr_del(env, dt, name, th, capa);
}
LASSERT(dt);
LASSERT(dt->do_ops);
LASSERT(dt->do_ops->do_declare_xattr_set);
+
+ if (CFS_FAULT_CHECK(OBD_FAIL_DT_DECLARE_XATTR_SET))
+ return cfs_fail_err;
+
return dt->do_ops->do_declare_xattr_set(env, dt, buf, name, fl, th);
}
LASSERT(dt);
LASSERT(dt->do_ops);
LASSERT(dt->do_ops->do_xattr_set);
+
+ if (CFS_FAULT_CHECK(OBD_FAIL_DT_XATTR_SET))
+ return cfs_fail_err;
+
return dt->do_ops->do_xattr_set(env, dt, buf, name, fl, th, capa);
}
LASSERT(dt);
LASSERT(dt->do_ops);
LASSERT(dt->do_ops->do_declare_xattr_get);
+
+ if (CFS_FAULT_CHECK(OBD_FAIL_DT_DECLARE_XATTR_GET))
+ return cfs_fail_err;
+
return dt->do_ops->do_declare_xattr_get(env, dt, buf, name, capa);
}
LASSERT(dt);
LASSERT(dt->do_ops);
LASSERT(dt->do_ops->do_xattr_get);
+
+ if (CFS_FAULT_CHECK(OBD_FAIL_DT_XATTR_GET))
+ return cfs_fail_err;
+
return dt->do_ops->do_xattr_get(env, dt, buf, name, capa);
}
LASSERT(dt);
LASSERT(dt->do_ops);
LASSERT(dt->do_ops->do_xattr_list);
+
+ if (CFS_FAULT_CHECK(OBD_FAIL_DT_XATTR_LIST))
+ return cfs_fail_err;
+
return dt->do_ops->do_xattr_list(env, dt, buf, capa);
}
LASSERT(dt);
LASSERT(dt->do_index_ops);
LASSERT(dt->do_index_ops->dio_declare_delete);
+
+ if (CFS_FAULT_CHECK(OBD_FAIL_DT_DECLARE_DELETE))
+ return cfs_fail_err;
+
return dt->do_index_ops->dio_declare_delete(env, dt, key, th);
}
LASSERT(dt);
LASSERT(dt->do_index_ops);
LASSERT(dt->do_index_ops->dio_delete);
+
+ if (CFS_FAULT_CHECK(OBD_FAIL_DT_DELETE))
+ return cfs_fail_err;
+
return dt->do_index_ops->dio_delete(env, dt, key, th, capa);
}
LASSERT(dt->do_index_ops);
LASSERT(dt->do_index_ops->dio_lookup);
+ if (CFS_FAULT_CHECK(OBD_FAIL_DT_LOOKUP))
+ return cfs_fail_err;
+
ret = dt->do_index_ops->dio_lookup(env, dt, rec, key, capa);
if (ret > 0)
ret = 0;
/* LMV */
#define OBD_FAIL_UNKNOWN_LMV_STRIPE 0x1901
+/* DT */
+#define OBD_FAIL_DT_DECLARE_ATTR_GET 0x2000
+#define OBD_FAIL_DT_ATTR_GET 0x2001
+#define OBD_FAIL_DT_DECLARE_ATTR_SET 0x2002
+#define OBD_FAIL_DT_ATTR_SET 0x2003
+#define OBD_FAIL_DT_DECLARE_XATTR_GET 0x2004
+#define OBD_FAIL_DT_XATTR_GET 0x2005
+#define OBD_FAIL_DT_DECLARE_XATTR_SET 0x2006
+#define OBD_FAIL_DT_XATTR_SET 0x2007
+#define OBD_FAIL_DT_DECLARE_XATTR_DEL 0x2008
+#define OBD_FAIL_DT_XATTR_DEL 0x2009
+#define OBD_FAIL_DT_XATTR_LIST 0x200a
+#define OBD_FAIL_DT_DECLARE_CREATE 0x200b
+#define OBD_FAIL_DT_CREATE 0x200c
+#define OBD_FAIL_DT_DECLARE_DESTROY 0x200d
+#define OBD_FAIL_DT_DESTROY 0x200e
+#define OBD_FAIL_DT_INDEX_TRY 0x200f
+#define OBD_FAIL_DT_DECLARE_REF_ADD 0x2010
+#define OBD_FAIL_DT_REF_ADD 0x2011
+#define OBD_FAIL_DT_DECLARE_REF_DEL 0x2012
+#define OBD_FAIL_DT_REF_DEL 0x2013
+#define OBD_FAIL_DT_DECLARE_INSERT 0x2014
+#define OBD_FAIL_DT_INSERT 0x2015
+#define OBD_FAIL_DT_DECLARE_DELETE 0x2016
+#define OBD_FAIL_DT_DELETE 0x2017
+#define OBD_FAIL_DT_LOOKUP 0x2018
+
/* Assign references to moved code to reduce code changes */
#define OBD_FAIL_PRECHECK(id) CFS_FAIL_PRECHECK(id)
#define OBD_FAIL_CHECK(id) CFS_FAIL_CHECK(id)