Whamcloud - gitweb
LU-5409 obd: add CFS_FAULT_CHECK()
[fs/lustre-release.git] / lustre / include / dt_object.h
index 477433f..254134b 100644 (file)
@@ -49,7 +49,7 @@
  * @{
  */
 
-
+#include <obd_support.h>
 /*
  * super-class definitions.
  */
@@ -80,7 +80,6 @@ struct dt_device_param {
         unsigned           ddp_block_shift;
         mntopt_t           ddp_mntopts;
         unsigned           ddp_max_ea_size;
-        void              *ddp_mnt; /* XXX: old code can retrieve mnt -bzzz */
         int                ddp_mount_type;
         unsigned long long ddp_maxbytes;
         /* percentage of available space to reserve for grant error margin */
@@ -106,10 +105,10 @@ typedef void (*dt_cb_t)(struct lu_env *env, struct thandle *th,
 #define MAX_COMMIT_CB_STR_LEN  32
 
 struct dt_txn_commit_cb {
-       cfs_list_t      dcb_linkage;
-       dt_cb_t         dcb_func;
-       __u32           dcb_magic;
-       char            dcb_name[MAX_COMMIT_CB_STR_LEN];
+       struct list_head        dcb_linkage;
+       dt_cb_t                 dcb_func;
+       __u32                   dcb_magic;
+       char                    dcb_name[MAX_COMMIT_CB_STR_LEN];
 };
 
 /**
@@ -131,11 +130,11 @@ struct dt_device_operations {
          */
         int   (*dt_trans_start)(const struct lu_env *env,
                                 struct dt_device *dev, struct thandle *th);
-        /**
-         * Finish previously started transaction.
-         */
-        int   (*dt_trans_stop)(const struct lu_env *env,
-                               struct thandle *th);
+       /**
+        * Finish previously started transaction.
+        */
+       int   (*dt_trans_stop)(const struct lu_env *env, struct dt_device *dev,
+                              struct thandle *th);
         /**
          * Add commit callback to the transaction.
          */
@@ -213,6 +212,7 @@ enum dt_index_flags {
  */
 extern const struct dt_index_features dt_directory_features;
 extern const struct dt_index_features dt_otable_features;
+extern const struct dt_index_features dt_lfsck_orphan_features;
 extern const struct dt_index_features dt_lfsck_features;
 
 /* index features supported by the accounting objects */
@@ -230,8 +230,10 @@ extern const struct dt_index_features dt_quota_slv_features;
  * It can contain any allocation hint in the future.
  */
 struct dt_allocation_hint {
-        struct dt_object           *dah_parent;
-        __u32                       dah_mode;
+       struct dt_object        *dah_parent;
+       const void              *dah_eadata;
+       int                     dah_eadata_len;
+       __u32                   dah_mode;
 };
 
 /**
@@ -277,6 +279,8 @@ enum dt_format_type dt_mode_to_dft(__u32 mode);
 
 typedef __u64 dt_obj_version_t;
 
+union ldlm_policy_data;
+
 /**
  * Per-dt-object operations.
  */
@@ -301,6 +305,9 @@ struct dt_object_operations {
          * lu_object_operations, but that would break existing symmetry.
          */
 
+       int   (*do_declare_attr_get)(const struct lu_env *env,
+                                    struct dt_object *dt,
+                                    struct lustre_capa *capa);
         /**
          * Return standard attributes.
          *
@@ -323,6 +330,13 @@ struct dt_object_operations {
                              const struct lu_attr *attr,
                              struct thandle *handle,
                              struct lustre_capa *capa);
+
+       int   (*do_declare_xattr_get)(const struct lu_env *env,
+                                     struct dt_object *dt,
+                                     struct lu_buf *buf,
+                                     const char *name,
+                                     struct lustre_capa *capa);
+
         /**
          * Return a value of an extended attribute.
          *
@@ -375,11 +389,11 @@ struct dt_object_operations {
          * (2) The type of child is in \a child_mode.
          * (3) The result hint is stored in \a ah;
          */
-        void  (*do_ah_init)(const struct lu_env *env,
-                            struct dt_allocation_hint *ah,
-                            struct dt_object *parent,
+       void  (*do_ah_init)(const struct lu_env *env,
+                           struct dt_allocation_hint *ah,
+                           struct dt_object *parent,
                            struct dt_object *child,
-                            cfs_umode_t child_mode);
+                           umode_t child_mode);
         /**
          * Create new object on this device.
          *
@@ -437,18 +451,19 @@ struct dt_object_operations {
         int   (*do_ref_del)(const struct lu_env *env,
                             struct dt_object *dt, struct thandle *th);
 
-        struct obd_capa *(*do_capa_get)(const struct lu_env *env,
-                                        struct dt_object *dt,
-                                        struct lustre_capa *old,
-                                        __u64 opc);
-        int (*do_object_sync)(const struct lu_env *, struct dt_object *);
-        /**
-         * Get object info of next level. Currently, only get inode from osd.
-         * This is only used by quota b=16542
-         * precondition: dt_object_exists(dt);
-         */
-        int (*do_data_get)(const struct lu_env *env, struct dt_object *dt,
-                           void **data);
+       struct obd_capa *(*do_capa_get)(const struct lu_env *env,
+                                       struct dt_object *dt,
+                                       struct lustre_capa *old,
+                                       __u64 opc);
+       int (*do_object_sync)(const struct lu_env *env, struct dt_object *obj,
+                             __u64 start, __u64 end);
+       /**
+        * Get object info of next level. Currently, only get inode from osd.
+        * This is only used by quota b=16542
+        * precondition: dt_object_exists(dt);
+        */
+       int (*do_data_get)(const struct lu_env *env, struct dt_object *dt,
+                          void **data);
 
        /**
         * Lock object.
@@ -456,7 +471,11 @@ struct dt_object_operations {
        int (*do_object_lock)(const struct lu_env *env, struct dt_object *dt,
                              struct lustre_handle *lh,
                              struct ldlm_enqueue_info *einfo,
-                             void *policy);
+                             union ldlm_policy_data *policy);
+
+       int (*do_object_unlock)(const struct lu_env *env, struct dt_object *dt,
+                               struct ldlm_enqueue_info *einfo,
+                               union ldlm_policy_data *policy);
 };
 
 /**
@@ -469,17 +488,17 @@ struct dt_body_operations {
         ssize_t (*dbo_read)(const struct lu_env *env, struct dt_object *dt,
                             struct lu_buf *buf, loff_t *pos,
                             struct lustre_capa *capa);
-        /**
-         * precondition: dt_object_exists(dt);
-         */
-        ssize_t (*dbo_declare_write)(const struct lu_env *env,
-                                     struct dt_object *dt,
-                                     const loff_t size, loff_t pos,
-                                     struct thandle *handle);
-        ssize_t (*dbo_write)(const struct lu_env *env, struct dt_object *dt,
-                             const struct lu_buf *buf, loff_t *pos,
-                             struct thandle *handle, struct lustre_capa *capa,
-                             int ignore_quota);
+       /**
+        * precondition: dt_object_exists(dt);
+        */
+       ssize_t (*dbo_declare_write)(const struct lu_env *env,
+                                    struct dt_object *dt,
+                                    const struct lu_buf *buf, loff_t pos,
+                                    struct thandle *handle);
+       ssize_t (*dbo_write)(const struct lu_env *env, struct dt_object *dt,
+                            const struct lu_buf *buf, loff_t *pos,
+                            struct thandle *handle, struct lustre_capa *capa,
+                            int ignore_quota);
         /*
          * methods for zero-copy IO
          */
@@ -611,6 +630,9 @@ struct dt_index_operations {
                                       const struct dt_it *di,
                                       struct dt_rec *rec,
                                       __u32 attr);
+               int        (*rec_size)(const struct lu_env *env,
+                                      const struct dt_it *di,
+                                     __u32 attr);
                 __u64        (*store)(const struct lu_env *env,
                                       const struct dt_it *di);
                 int           (*load)(const struct lu_env *env,
@@ -622,6 +644,7 @@ struct dt_index_operations {
 
 enum dt_otable_it_valid {
        DOIV_ERROR_HANDLE       = 0x0001,
+       DOIV_DRYRUN             = 0x0002,
 };
 
 enum dt_otable_it_flags {
@@ -633,6 +656,9 @@ enum dt_otable_it_flags {
 
        /* There is up layer component uses the iteration. */
        DOIF_OUTUSED    = 0x0004,
+
+       /* Check only without repairing. */
+       DOIF_DRYRUN     = 0x0008,
 };
 
 /* otable based iteration needs to use the common DT interation APIs.
@@ -655,7 +681,8 @@ struct dt_device {
          * way, because callbacks are supposed to be added/deleted only during
          * single-threaded start-up shut-down procedures.
          */
-        cfs_list_t                         dd_txn_callbacks;
+       struct list_head                   dd_txn_callbacks;
+       unsigned int                       dd_record_fid_accessed:1;
 };
 
 int  dt_device_init(struct dt_device *dev, struct lu_device_type *t);
@@ -684,10 +711,10 @@ struct dt_object {
  */
 struct local_oid_storage {
        /* all initialized llog systems on this node linked by this */
-       cfs_list_t        los_list;
+       struct list_head  los_list;
 
        /* how many handle's reference this los has */
-       cfs_atomic_t      los_refcount;
+       atomic_t          los_refcount;
        struct dt_device *los_dev;
        struct dt_object *los_obj;
 
@@ -729,6 +756,19 @@ static inline struct dt_object *lu2dt_obj(struct lu_object *o)
        return container_of0(o, struct dt_object, do_lu);
 }
 
+struct thandle_update {
+       /* In DNE, one transaction can be disassembled into
+        * updates on several different MDTs, and these updates
+        * will be attached to tu_remote_update_list per target.
+        * Only single thread will access the list, no need lock
+        */
+       struct list_head        tu_remote_update_list;
+
+       /* sent after or before local transaction */
+       unsigned int            tu_sent_after_local_trans:1,
+                               tu_only_remote_trans:1;
+};
+
 /**
  * This is the general purpose transaction handle.
  * 1. Transaction Life Cycle
@@ -747,6 +787,10 @@ struct thandle {
        /** the dt device on which the transactions are executed */
        struct dt_device *th_dev;
 
+       atomic_t        th_refc;
+       /* the size of transaction */
+       int             th_alloc_size;
+
        /** context for this transaction, tag is LCT_TX_HANDLE */
        struct lu_context th_ctx;
 
@@ -763,15 +807,22 @@ struct thandle {
        /* local transation, no need to inform other layers */
        unsigned int            th_local:1;
 
-       /* In DNE, one transaction can be disassemblied into
-        * updates on several different MDTs, and these updates
-        * will be attached to th_remote_update_list per target.
-        * Only single thread will access the list, no need lock
-        */
-       cfs_list_t              th_remote_update_list;
-       struct update_request   *th_current_request;
+       struct thandle_update   *th_update;
 };
 
+static inline void thandle_get(struct thandle *thandle)
+{
+       atomic_inc(&thandle->th_refc);
+}
+
+static inline void thandle_put(struct thandle *thandle)
+{
+       if (atomic_dec_and_test(&thandle->th_refc)) {
+               if (thandle->th_update != NULL)
+                       OBD_FREE_PTR(thandle->th_update);
+               OBD_FREE(thandle, thandle->th_alloc_size);
+       }
+}
 /**
  * Transaction call-backs.
  *
@@ -789,9 +840,9 @@ struct dt_txn_callback {
         int (*dtc_txn_stop)(const struct lu_env *env,
                             struct thandle *txn, void *cookie);
         void (*dtc_txn_commit)(struct thandle *txn, void *cookie);
-        void                *dtc_cookie;
-        __u32                dtc_tag;
-        cfs_list_t           dtc_linkage;
+       void                    *dtc_cookie;
+       __u32                   dtc_tag;
+       struct list_head        dtc_linkage;
 };
 
 void dt_txn_callback_add(struct dt_device *dev, struct dt_txn_callback *cb);
@@ -837,15 +888,17 @@ struct dt_object *dt_find_or_create(const struct lu_env *env,
 struct dt_object *dt_locate_at(const struct lu_env *env,
                               struct dt_device *dev,
                               const struct lu_fid *fid,
-                              struct lu_device *top_dev);
+                              struct lu_device *top_dev,
+                              const struct lu_object_conf *conf);
+
 static inline struct dt_object *
 dt_locate(const struct lu_env *env, struct dt_device *dev,
          const struct lu_fid *fid)
 {
-       return dt_locate_at(env, dev, fid, dev->dd_lu_dev.ld_site->ls_top_dev);
+       return dt_locate_at(env, dev, fid,
+                           dev->dd_lu_dev.ld_site->ls_top_dev, NULL);
 }
 
-
 int local_oid_storage_init(const struct lu_env *env, struct dt_device *dev,
                           const struct lu_fid *first_fid,
                           struct local_oid_storage **los);
@@ -894,24 +947,35 @@ int local_object_unlink(const struct lu_env *env, struct dt_device *dt,
 static inline int dt_object_lock(const struct lu_env *env,
                                 struct dt_object *o, struct lustre_handle *lh,
                                 struct ldlm_enqueue_info *einfo,
-                                void *policy)
+                                union ldlm_policy_data *policy)
 {
-       LASSERT(o);
-       LASSERT(o->do_ops);
-       LASSERT(o->do_ops->do_object_lock);
+       LASSERT(o != NULL);
+       LASSERT(o->do_ops != NULL);
+       LASSERT(o->do_ops->do_object_lock != NULL);
        return o->do_ops->do_object_lock(env, o, lh, einfo, policy);
 }
 
+static inline int dt_object_unlock(const struct lu_env *env,
+                                  struct dt_object *o,
+                                  struct ldlm_enqueue_info *einfo,
+                                  union ldlm_policy_data *policy)
+{
+       LASSERT(o != NULL);
+       LASSERT(o->do_ops != NULL);
+       LASSERT(o->do_ops->do_object_unlock != NULL);
+       return o->do_ops->do_object_unlock(env, o, einfo, policy);
+}
+
 int dt_lookup_dir(const struct lu_env *env, struct dt_object *dir,
                  const char *name, struct lu_fid *fid);
 
-static inline int dt_object_sync(const struct lu_env *env,
-                                 struct dt_object *o)
+static inline int dt_object_sync(const struct lu_env *env, struct dt_object *o,
+                                __u64 start, __u64 end)
 {
-        LASSERT(o);
-        LASSERT(o->do_ops);
-        LASSERT(o->do_ops->do_object_sync);
-        return o->do_ops->do_object_sync(env, o);
+       LASSERT(o);
+       LASSERT(o->do_ops);
+       LASSERT(o->do_ops->do_object_sync);
+       return o->do_ops->do_object_sync(env, o, start, end);
 }
 
 int dt_declare_version_set(const struct lu_env *env, struct dt_object *o,
@@ -963,8 +1027,8 @@ static inline int dt_trans_start_local(const struct lu_env *env,
 static inline int dt_trans_stop(const struct lu_env *env,
                                 struct dt_device *d, struct thandle *th)
 {
-        LASSERT(d->dd_ops->dt_trans_stop);
-        return d->dd_ops->dt_trans_stop(env, th);
+       LASSERT(d->dd_ops->dt_trans_stop);
+       return d->dd_ops->dt_trans_stop(env, d, th);
 }
 
 static inline int dt_trans_cb_add(struct thandle *th,
@@ -978,18 +1042,19 @@ static inline int dt_trans_cb_add(struct thandle *th,
 
 
 static inline int dt_declare_record_write(const struct lu_env *env,
-                                          struct dt_object *dt,
-                                          int size, loff_t pos,
-                                          struct thandle *th)
+                                         struct dt_object *dt,
+                                         const struct lu_buf *buf,
+                                         loff_t pos,
+                                         struct thandle *th)
 {
-        int rc;
-
-        LASSERTF(dt != NULL, "dt is NULL when we want to write record\n");
-        LASSERT(th != NULL);
-        LASSERT(dt->do_body_ops);
-        LASSERT(dt->do_body_ops->dbo_declare_write);
-        rc = dt->do_body_ops->dbo_declare_write(env, dt, size, pos, th);
-        return rc;
+       int rc;
+
+       LASSERTF(dt != NULL, "dt is NULL when we want to write record\n");
+       LASSERT(th != NULL);
+       LASSERT(dt->do_body_ops);
+       LASSERT(dt->do_body_ops->dbo_declare_write);
+       rc = dt->do_body_ops->dbo_declare_write(env, dt, buf, pos, th);
+       return rc;
 }
 
 static inline int dt_declare_create(const struct lu_env *env,
@@ -1002,6 +1067,10 @@ static inline int dt_declare_create(const struct lu_env *env,
         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);
 }
 
@@ -1015,6 +1084,10 @@ static inline int dt_create(const struct lu_env *env,
         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);
 }
 
@@ -1025,6 +1098,10 @@ static inline int dt_declare_destroy(const struct lu_env *env,
         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);
 }
 
@@ -1035,6 +1112,10 @@ static inline int dt_destroy(const struct lu_env *env,
         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);
 }
 
@@ -1085,12 +1166,30 @@ static inline int dt_write_locked(const struct lu_env *env,
         return dt->do_ops->do_write_locked(env, dt);
 }
 
+static inline int dt_declare_attr_get(const struct lu_env *env,
+                                     struct dt_object *dt,
+                                     struct lustre_capa *capa)
+{
+       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);
+}
+
 static inline int dt_attr_get(const struct lu_env *env, struct dt_object *dt,
                               struct lu_attr *la, void *arg)
 {
         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);
 }
 
@@ -1102,6 +1201,10 @@ static inline int dt_declare_attr_set(const struct lu_env *env,
         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);
 }
 
@@ -1112,6 +1215,10 @@ static inline int dt_attr_set(const struct lu_env *env, struct dt_object *dt,
         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);
 }
 
@@ -1121,6 +1228,10 @@ static inline int dt_declare_ref_add(const struct lu_env *env,
         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);
 }
 
@@ -1130,6 +1241,10 @@ static inline int dt_ref_add(const struct lu_env *env,
         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);
 }
 
@@ -1139,6 +1254,10 @@ static inline int dt_declare_ref_del(const struct lu_env *env,
         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);
 }
 
@@ -1148,6 +1267,10 @@ static inline int dt_ref_del(const struct lu_env *env,
         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);
 }
 
@@ -1157,20 +1280,20 @@ static inline struct obd_capa *dt_capa_get(const struct lu_env *env,
 {
         LASSERT(dt);
         LASSERT(dt->do_ops);
-        LASSERT(dt->do_ops->do_ref_del);
+       LASSERT(dt->do_ops->do_capa_get);
         return dt->do_ops->do_capa_get(env, dt, old, opc);
 }
 
 static inline int dt_bufs_get(const struct lu_env *env, struct dt_object *d,
-                              struct niobuf_remote *rnb,
-                              struct niobuf_local *lnb, int rw,
-                              struct lustre_capa *capa)
+                             struct niobuf_remote *rnb,
+                             struct niobuf_local *lnb, int rw,
+                             struct lustre_capa *capa)
 {
-        LASSERT(d);
-        LASSERT(d->do_body_ops);
-        LASSERT(d->do_body_ops->dbo_bufs_get);
-        return d->do_body_ops->dbo_bufs_get(env, d, rnb->offset,
-                                            rnb->len, lnb, rw, capa);
+       LASSERT(d);
+       LASSERT(d->do_body_ops);
+       LASSERT(d->do_body_ops->dbo_bufs_get);
+       return d->do_body_ops->dbo_bufs_get(env, d, rnb->rnb_offset,
+                                           rnb->rnb_len, lnb, rw, capa);
 }
 
 static inline int dt_bufs_put(const struct lu_env *env, struct dt_object *d,
@@ -1305,6 +1428,10 @@ static inline int dt_declare_insert(const struct lu_env *env,
         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);
 }
 
@@ -1319,6 +1446,10 @@ static inline int dt_insert(const struct lu_env *env,
         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);
 }
@@ -1331,6 +1462,10 @@ static inline int dt_declare_xattr_del(const struct lu_env *env,
         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);
 }
 
@@ -1342,6 +1477,10 @@ static inline int dt_xattr_del(const struct lu_env *env,
         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);
 }
 
@@ -1354,6 +1493,10 @@ static inline int dt_declare_xattr_set(const struct lu_env *env,
         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);
 }
 
@@ -1365,9 +1508,29 @@ static inline int dt_xattr_set(const struct lu_env *env,
         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);
 }
 
+static inline int dt_declare_xattr_get(const struct lu_env *env,
+                                      struct dt_object *dt,
+                                      struct lu_buf *buf,
+                                      const char *name,
+                                      struct lustre_capa *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);
+}
+
 static inline int dt_xattr_get(const struct lu_env *env,
                               struct dt_object *dt, struct lu_buf *buf,
                               const char *name, struct lustre_capa *capa)
@@ -1375,6 +1538,10 @@ static inline int dt_xattr_get(const struct lu_env *env,
         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);
 }
 
@@ -1385,6 +1552,10 @@ static inline int dt_xattr_list(const struct lu_env *env,
         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);
 }
 
@@ -1396,6 +1567,10 @@ static inline int dt_declare_delete(const struct lu_env *env,
         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);
 }
 
@@ -1408,6 +1583,10 @@ static inline int dt_delete(const struct lu_env *env,
         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);
 }
 
@@ -1444,6 +1623,9 @@ static inline int dt_lookup(const struct lu_env *env,
         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;
@@ -1460,6 +1642,20 @@ struct dt_find_hint {
        struct dt_object     *dfh_o;
 };
 
+struct dt_insert_rec {
+       union {
+               const struct lu_fid     *rec_fid;
+               void                    *rec_data;
+       };
+       union {
+               struct {
+                       __u32            rec_type;
+                       __u32            rec_padding;
+               };
+               __u64                    rec_misc;
+       };
+};
+
 struct dt_thread_info {
        char                     dti_buf[DT_MAX_PATH];
        struct dt_find_hint      dti_dfh;
@@ -1468,7 +1664,9 @@ struct dt_thread_info {
        struct dt_object_format  dti_dof;
        struct lustre_mdt_attrs  dti_lma;
        struct lu_buf            dti_lb;
+       struct lu_object_conf    dti_conf;
        loff_t                   dti_off;
+       struct dt_insert_rec     dti_dt_rec;
 };
 
 extern struct lu_context_key dt_key;
@@ -1486,6 +1684,7 @@ int dt_global_init(void);
 void dt_global_fini(void);
 
 # ifdef LPROCFS
+#ifndef HAVE_ONLY_PROCFS_SEQ
 int lprocfs_dt_rd_blksize(char *page, char **start, off_t off,
                          int count, int *eof, void *data);
 int lprocfs_dt_rd_kbytestotal(char *page, char **start, off_t off,
@@ -1498,6 +1697,13 @@ int lprocfs_dt_rd_filestotal(char *page, char **start, off_t off,
                             int count, int *eof, void *data);
 int lprocfs_dt_rd_filesfree(char *page, char **start, off_t off,
                            int count, int *eof, void *data);
+#endif
+int lprocfs_dt_blksize_seq_show(struct seq_file *m, void *v);
+int lprocfs_dt_kbytestotal_seq_show(struct seq_file *m, void *v);
+int lprocfs_dt_kbytesfree_seq_show(struct seq_file *m, void *v);
+int lprocfs_dt_kbytesavail_seq_show(struct seq_file *m, void *v);
+int lprocfs_dt_filestotal_seq_show(struct seq_file *m, void *v);
+int lprocfs_dt_filesfree_seq_show(struct seq_file *m, void *v);
 # endif /* LPROCFS */
 
 #endif /* __LUSTRE_DT_OBJECT_H */