Whamcloud - gitweb
LU-354 test: Change dev_set_rdonly() check to warning
[fs/lustre-release.git] / lustre / include / dt_object.h
index a45cd28..9abb6d9 100644 (file)
@@ -28,6 +28,8 @@
 /*
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
+ *
+ * Copyright (c) 2011, 2012, Whamcloud, Inc.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -62,35 +64,49 @@ struct proc_dir_entry;
 struct lustre_cfg;
 
 struct thandle;
-struct txn_param;
 struct dt_device;
 struct dt_object;
 struct dt_index_features;
 struct dt_quota_ctxt;
+struct niobuf_local;
+struct niobuf_remote;
+
+typedef enum {
+        MNTOPT_USERXATTR        = 0x00000001,
+        MNTOPT_ACL              = 0x00000002,
+} mntopt_t;
 
 struct dt_device_param {
         unsigned           ddp_max_name_len;
         unsigned           ddp_max_nlink;
         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 */
+        int                ddp_grant_reserved;
+        /* per-inode space consumption */
+        short              ddp_inodespace;
+        /* per-fragment grant overhead to be used by client for grant
+         * calculation */
+        int                ddp_grant_frag;
 };
 
 /**
- * Basic transaction credit op
+ * Per-transaction commit callback function
+ */
+struct dt_txn_commit_cb;
+typedef void (*dt_cb_t)(struct lu_env *env, struct thandle *th,
+                        struct dt_txn_commit_cb *cb, int err);
+/**
+ * Special per-transaction callback for cases when just commit callback
+ * is needed and per-device callback are not convenient to use
  */
-enum dt_txn_op {
-        DTO_INDEX_INSERT,
-        DTO_INDEX_DELETE,
-        DTO_IDNEX_UPDATE,
-        DTO_OBJECT_CREATE,
-        DTO_OBJECT_DELETE,
-        DTO_ATTR_SET_BASE,
-        DTO_XATTR_SET,
-        DTO_LOG_REC, /**< XXX temporary: dt layer knows nothing about llog. */
-        DTO_WRITE_BASE,
-        DTO_WRITE_BLOCK,
-        DTO_ATTR_SET_CHOWN,
-
-        DTO_NR
+struct dt_txn_commit_cb {
+        cfs_list_t dcb_linkage;
+        dt_cb_t    dcb_func;
 };
 
 /**
@@ -101,19 +117,28 @@ struct dt_device_operations {
          * Return device-wide statistics.
          */
         int   (*dt_statfs)(const struct lu_env *env,
-                           struct dt_device *dev, cfs_kstatfs_t *sfs);
+                           struct dt_device *dev, cfs_kstatfs_t *osfs);
+        /**
+         * Create transaction, described by \a param.
+         */
+        struct thandle *(*dt_trans_create)(const struct lu_env *env,
+                                           struct dt_device *dev);
         /**
          * Start transaction, described by \a param.
          */
-        struct thandle *(*dt_trans_start)(const struct lu_env *env,
-                                          struct dt_device *dev,
-                                          struct txn_param *param);
+        int   (*dt_trans_start)(const struct lu_env *env,
+                                struct dt_device *dev, struct thandle *th);
         /**
          * Finish previously started transaction.
          */
-        void  (*dt_trans_stop)(const struct lu_env *env,
+        int   (*dt_trans_stop)(const struct lu_env *env,
                                struct thandle *th);
         /**
+         * Add commit callback to the transaction.
+         */
+        int   (*dt_trans_cb_add)(struct thandle *th,
+                                 struct dt_txn_commit_cb *dcb);
+        /**
          * Return fid of root index object.
          */
         int   (*dt_root_get)(const struct lu_env *env,
@@ -128,7 +153,7 @@ struct dt_device_operations {
          *  handling device state, mostly for tests
          */
         int   (*dt_sync)(const struct lu_env *env, struct dt_device *dev);
-        void  (*dt_ro)(const struct lu_env *env, struct dt_device *dev);
+        int   (*dt_ro)(const struct lu_env *env, struct dt_device *dev);
         /**
           * Start a transaction commit asynchronously
           *
@@ -152,12 +177,6 @@ struct dt_device_operations {
         void (*dt_init_quota_ctxt)(const struct lu_env *env,
                                    struct dt_device *dev,
                                    struct dt_quota_ctxt *ctxt, void *data);
-
-        /**
-         *  get transaction credits for given \a op.
-         */
-        int (*dt_credit_get)(const struct lu_env *env, struct dt_device *dev,
-                             enum dt_txn_op);
 };
 
 struct dt_index_features {
@@ -242,7 +261,6 @@ struct dt_object_format {
 
 enum dt_format_type dt_mode_to_dft(__u32 mode);
 
-/** Version type. May differ in DMU and ldiskfs */
 typedef __u64 dt_obj_version_t;
 
 /**
@@ -282,6 +300,10 @@ struct dt_object_operations {
          *
          * precondition: dt_object_exists(dt);
          */
+        int   (*do_declare_attr_set)(const struct lu_env *env,
+                                     struct dt_object *dt,
+                                     const struct lu_attr *attr,
+                                     struct thandle *handle);
         int   (*do_attr_set)(const struct lu_env *env,
                              struct dt_object *dt,
                              const struct lu_attr *attr,
@@ -302,6 +324,11 @@ struct dt_object_operations {
          *
          * precondition: dt_object_exists(dt);
          */
+        int   (*do_declare_xattr_set)(const struct lu_env *env,
+                                      struct dt_object *dt,
+                                      const struct lu_buf *buf,
+                                      const char *name, int fl,
+                                      struct thandle *handle);
         int   (*do_xattr_set)(const struct lu_env *env,
                               struct dt_object *dt, const struct lu_buf *buf,
                               const char *name, int fl, struct thandle *handle,
@@ -311,6 +338,9 @@ struct dt_object_operations {
          *
          * precondition: dt_object_exists(dt);
          */
+        int   (*do_declare_xattr_del)(const struct lu_env *env,
+                                      struct dt_object *dt,
+                                      const char *name, struct thandle *handle);
         int   (*do_xattr_del)(const struct lu_env *env,
                               struct dt_object *dt,
                               const char *name, struct thandle *handle,
@@ -341,6 +371,12 @@ struct dt_object_operations {
          * precondition: !dt_object_exists(dt);
          * postcondition: ergo(result == 0, dt_object_exists(dt));
          */
+        int   (*do_declare_create)(const struct lu_env *env,
+                                   struct dt_object *dt,
+                                   struct lu_attr *attr,
+                                   struct dt_allocation_hint *hint,
+                                   struct dt_object_format *dof,
+                                   struct thandle *th);
         int   (*do_create)(const struct lu_env *env, struct dt_object *dt,
                            struct lu_attr *attr,
                            struct dt_allocation_hint *hint,
@@ -348,6 +384,17 @@ struct dt_object_operations {
                            struct thandle *th);
 
         /**
+          Destroy object on this device
+         * precondition: !dt_object_exists(dt);
+         * postcondition: ergo(result == 0, dt_object_exists(dt));
+         */
+        int   (*do_declare_destroy)(const struct lu_env *env,
+                                    struct dt_object *dt,
+                                    struct thandle *th);
+        int   (*do_destroy)(const struct lu_env *env, struct dt_object *dt,
+                            struct thandle *th);
+
+        /**
          * Announce that this object is going to be used as an index. This
          * operation check that object supports indexing operations and
          * installs appropriate dt_index_operations vector on success.
@@ -362,13 +409,17 @@ struct dt_object_operations {
          * Add nlink of the object
          * precondition: dt_object_exists(dt);
          */
-        void  (*do_ref_add)(const struct lu_env *env,
+        int   (*do_declare_ref_add)(const struct lu_env *env,
+                                    struct dt_object *dt, struct thandle *th);
+        int   (*do_ref_add)(const struct lu_env *env,
                             struct dt_object *dt, struct thandle *th);
         /**
          * Del nlink of the object
          * precondition: dt_object_exists(dt);
          */
-        void  (*do_ref_del)(const struct lu_env *env,
+        int   (*do_declare_ref_del)(const struct lu_env *env,
+                                    struct dt_object *dt, struct thandle *th);
+        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,
@@ -376,10 +427,6 @@ struct dt_object_operations {
                                         struct lustre_capa *old,
                                         __u64 opc);
         int (*do_object_sync)(const struct lu_env *, struct dt_object *);
-        dt_obj_version_t (*do_version_get)(const struct lu_env *env,
-                                           struct dt_object *dt);
-        void (*do_version_set)(const struct lu_env *env, struct dt_object *dt,
-                               dt_obj_version_t new_version);
         /**
          * Get object info of next level. Currently, only get inode from osd.
          * This is only used by quota b=16542
@@ -402,10 +449,66 @@ struct dt_body_operations {
         /**
          * 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);
+        /*
+         * methods for zero-copy IO
+         */
+
+        /*
+         * precondition: dt_object_exists(dt);
+         * returns:
+         * < 0 - error code
+         * = 0 - illegal
+         * > 0 - number of local buffers prepared
+         */
+        int (*dbo_bufs_get)(const struct lu_env *env, struct dt_object *dt,
+                            loff_t pos, ssize_t len, struct niobuf_local *lb,
+                            int rw, struct lustre_capa *capa);
+        /*
+         * precondition: dt_object_exists(dt);
+         */
+        int (*dbo_bufs_put)(const struct lu_env *env, struct dt_object *dt,
+                            struct niobuf_local *lb, int nr);
+        /*
+         * precondition: dt_object_exists(dt);
+         */
+        int (*dbo_write_prep)(const struct lu_env *env, struct dt_object *dt,
+                              struct niobuf_local *lb, int nr);
+        /*
+         * precondition: dt_object_exists(dt);
+         */
+        int (*dbo_declare_write_commit)(const struct lu_env *env,
+                                        struct dt_object *dt,
+                                        struct niobuf_local *,
+                                        int, struct thandle *);
+        /*
+         * precondition: dt_object_exists(dt);
+         */
+        int (*dbo_write_commit)(const struct lu_env *env, struct dt_object *dt,
+                                struct niobuf_local *, int, struct thandle *);
+        /*
+         * precondition: dt_object_exists(dt);
+         */
+        int (*dbo_read_prep)(const struct lu_env *env, struct dt_object *dt,
+                             struct niobuf_local *lnb, int nr);
+        int (*dbo_fiemap_get)(const struct lu_env *env, struct dt_object *dt,
+                              struct ll_user_fiemap *fm);
+        /**
+         * Punch object's content
+         * precondition: regular object, not index
+         */
+        int   (*do_declare_punch)(const struct lu_env *, struct dt_object *,
+                                  __u64, __u64, struct thandle *th);
+        int   (*do_punch)(const struct lu_env *env, struct dt_object *dt,
+                          __u64 start, __u64 end, struct thandle *th,
+                          struct lustre_capa *capa);
 };
 
 /**
@@ -436,6 +539,11 @@ struct dt_index_operations {
         /**
          * precondition: dt_object_exists(dt);
          */
+        int (*dio_declare_insert)(const struct lu_env *env,
+                                  struct dt_object *dt,
+                                  const struct dt_rec *rec,
+                                  const struct dt_key *key,
+                                  struct thandle *handle);
         int (*dio_insert)(const struct lu_env *env, struct dt_object *dt,
                           const struct dt_rec *rec, const struct dt_key *key,
                           struct thandle *handle, struct lustre_capa *capa,
@@ -443,6 +551,10 @@ struct dt_index_operations {
         /**
          * precondition: dt_object_exists(dt);
          */
+        int (*dio_declare_delete)(const struct lu_env *env,
+                                  struct dt_object *dt,
+                                  const struct dt_key *key,
+                                  struct thandle *handle);
         int (*dio_delete)(const struct lu_env *env, struct dt_object *dt,
                           const struct dt_key *key, struct thandle *handle,
                           struct lustre_capa *capa);
@@ -457,6 +569,7 @@ struct dt_index_operations {
                  */
                 struct dt_it *(*init)(const struct lu_env *env,
                                       struct dt_object *dt,
+                                      __u32 attr,
                                       struct lustre_capa *capa);
                 void          (*fini)(const struct lu_env *env,
                                       struct dt_it *di);
@@ -473,12 +586,14 @@ struct dt_index_operations {
                                       const struct dt_it *di);
                 int            (*rec)(const struct lu_env *env,
                                       const struct dt_it *di,
-                                      struct lu_dirent *lde,
+                                      struct dt_rec *rec,
                                       __u32 attr);
                 __u64        (*store)(const struct lu_env *env,
                                       const struct dt_it *di);
                 int           (*load)(const struct lu_env *env,
                                       const struct dt_it *di, __u64 hash);
+                int        (*key_rec)(const struct lu_env *env,
+                                      const struct dt_it *di, void* key_rec);
         } dio_it;
 };
 
@@ -515,6 +630,12 @@ struct dt_object {
         const struct dt_index_operations  *do_index_ops;
 };
 
+static inline struct dt_object *lu2dt(struct lu_object *l)
+{
+        LASSERT(l == NULL || IS_ERR(l) || lu_device_is_dt(l->lo_dev));
+        return container_of0(l, struct dt_object, do_lu);
+}
+
 int  dt_object_init(struct dt_object *obj,
                     struct lu_object_header *h, struct lu_device *d);
 
@@ -525,30 +646,6 @@ static inline int dt_object_exists(const struct dt_object *dt)
         return lu_object_exists(&dt->do_lu);
 }
 
-struct txn_param {
-        /** number of blocks this transaction will modify */
-        unsigned int tp_credits;
-        /** sync transaction is needed */
-        __u32        tp_sync:1;
-};
-
-static inline void txn_param_init(struct txn_param *p, unsigned int credits)
-{
-        memset(p, 0, sizeof(*p));
-        p->tp_credits = credits;
-}
-
-static inline void txn_param_credit_add(struct txn_param *p,
-                                        unsigned int credits)
-{
-        p->tp_credits += credits;
-}
-
-static inline void txn_param_sync(struct txn_param *p)
-{
-        p->tp_sync = 1;
-}
-
 /**
  * This is the general purpose transaction handle.
  * 1. Transaction Life Cycle
@@ -567,12 +664,21 @@ struct thandle {
         /** the dt device on which the transactions are executed */
         struct dt_device *th_dev;
 
+        /** additional tags (layers can add in declare) */
+        __u32             th_tags;
+
         /** context for this transaction, tag is LCT_TX_HANDLE */
         struct lu_context th_ctx;
 
         /** the last operation result in this transaction.
          * this value is used in recovery */
         __s32             th_result;
+
+        /** whether we need sync commit */
+        int               th_sync:1;
+
+        /* local transation, no need to inform other layers */
+        int               th_local:1;
 };
 
 /**
@@ -588,11 +694,10 @@ struct thandle {
  */
 struct dt_txn_callback {
         int (*dtc_txn_start)(const struct lu_env *env,
-                             struct txn_param *param, void *cookie);
+                             struct thandle *txn, void *cookie);
         int (*dtc_txn_stop)(const struct lu_env *env,
                             struct thandle *txn, void *cookie);
-        int (*dtc_txn_commit)(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;
@@ -602,9 +707,9 @@ void dt_txn_callback_add(struct dt_device *dev, struct dt_txn_callback *cb);
 void dt_txn_callback_del(struct dt_device *dev, struct dt_txn_callback *cb);
 
 int dt_txn_hook_start(const struct lu_env *env,
-                      struct dt_device *dev, struct txn_param *param);
+                      struct dt_device *dev, struct thandle *txn);
 int dt_txn_hook_stop(const struct lu_env *env, struct thandle *txn);
-int dt_txn_hook_commit(const struct lu_env *env, struct thandle *txn);
+void dt_txn_hook_commit(struct thandle *txn);
 
 int dt_try_as_dir(const struct lu_env *env, struct dt_object *obj);
 
@@ -632,19 +737,12 @@ struct dt_object *dt_locate(const struct lu_env *env,
                             struct dt_device *dev,
                             const struct lu_fid *fid);
 
-static inline dt_obj_version_t do_version_get(const struct lu_env *env,
-                                              struct dt_object *o)
-{
-        LASSERT(o->do_ops->do_version_get);
-        return o->do_ops->do_version_get(env, o);
-}
+int dt_declare_version_set(const struct lu_env *env, struct dt_object *o,
+                           struct thandle *th);
+void dt_version_set(const struct lu_env *env, struct dt_object *o,
+                    dt_obj_version_t version, struct thandle *th);
+dt_obj_version_t dt_version_get(const struct lu_env *env, struct dt_object *o);
 
-static inline void do_version_set(const struct lu_env *env,
-                                  struct dt_object *o, dt_obj_version_t v)
-{
-        LASSERT(o->do_ops->do_version_set);
-        return o->do_ops->do_version_set(env, o, v);
-}
 
 int dt_record_read(const struct lu_env *env, struct dt_object *dt,
                    struct lu_buf *buf, loff_t *pos);
@@ -652,20 +750,502 @@ int dt_record_write(const struct lu_env *env, struct dt_object *dt,
                     const struct lu_buf *buf, loff_t *pos, struct thandle *th);
 
 
-static inline struct thandle *dt_trans_start(const struct lu_env *env,
-                                             struct dt_device *d,
-                                             struct txn_param *p)
+static inline struct thandle *dt_trans_create(const struct lu_env *env,
+                                              struct dt_device *d)
+{
+        LASSERT(d->dd_ops->dt_trans_create);
+        return d->dd_ops->dt_trans_create(env, d);
+}
+
+static inline int dt_trans_start(const struct lu_env *env,
+                                 struct dt_device *d, struct thandle *th)
+{
+        LASSERT(d->dd_ops->dt_trans_start);
+        return d->dd_ops->dt_trans_start(env, d, th);
+}
+
+/* for this transaction hooks shouldn't be called */
+static inline int dt_trans_start_local(const struct lu_env *env,
+                                       struct dt_device *d, struct thandle *th)
 {
         LASSERT(d->dd_ops->dt_trans_start);
-        return d->dd_ops->dt_trans_start(env, d, p);
+        th->th_local = 1;
+        return d->dd_ops->dt_trans_start(env, d, th);
 }
 
-static inline void dt_trans_stop(const struct lu_env *env,
-                                 struct dt_device *d,
-                                 struct thandle *th)
+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);
 }
+
+static inline int dt_trans_cb_add(struct thandle *th,
+                                  struct dt_txn_commit_cb *dcb)
+{
+        LASSERT(th->th_dev->dd_ops->dt_trans_cb_add);
+        return th->th_dev->dd_ops->dt_trans_cb_add(th, dcb);
+}
 /** @} dt */
+
+
+static inline int dt_declare_record_write(const struct lu_env *env,
+                                          struct dt_object *dt,
+                                          int size, loff_t pos,
+                                          struct thandle *th)
+{
+        int rc;
+
+        LASSERTF(dt != NULL, "dt is NULL when we want to write record\n");
+        LASSERT(th != NULL);
+        rc = dt->do_body_ops->dbo_declare_write(env, dt, size, pos, th);
+        return rc;
+}
+
+static inline int dt_declare_create(const struct lu_env *env,
+                                    struct dt_object *dt,
+                                    struct lu_attr *attr,
+                                    struct dt_allocation_hint *hint,
+                                    struct dt_object_format *dof,
+                                    struct thandle *th)
+{
+        LASSERT(dt);
+        LASSERT(dt->do_ops);
+        LASSERT(dt->do_ops->do_declare_create);
+        return dt->do_ops->do_declare_create(env, dt, attr, hint, dof, th);
+}
+
+static inline int dt_create(const struct lu_env *env,
+                                    struct dt_object *dt,
+                                    struct lu_attr *attr,
+                                    struct dt_allocation_hint *hint,
+                                    struct dt_object_format *dof,
+                                    struct thandle *th)
+{
+        LASSERT(dt);
+        LASSERT(dt->do_ops);
+        LASSERT(dt->do_ops->do_create);
+        return dt->do_ops->do_create(env, dt, attr, hint, dof, th);
+}
+
+static inline int dt_declare_destroy(const struct lu_env *env,
+                                     struct dt_object *dt,
+                                     struct thandle *th)
+{
+        LASSERT(dt);
+        LASSERT(dt->do_ops);
+        LASSERT(dt->do_ops->do_declare_destroy);
+        return dt->do_ops->do_declare_destroy(env, dt, th);
+}
+
+static inline int dt_destroy(const struct lu_env *env,
+                             struct dt_object *dt,
+                             struct thandle *th)
+{
+        LASSERT(dt);
+        LASSERT(dt->do_ops);
+        LASSERT(dt->do_ops->do_destroy);
+        return dt->do_ops->do_destroy(env, dt, th);
+}
+
+static inline void dt_read_lock(const struct lu_env *env,
+                                struct dt_object *dt,
+                                unsigned role)
+{
+        LASSERT(dt);
+        LASSERT(dt->do_ops);
+        LASSERT(dt->do_ops->do_read_lock);
+        dt->do_ops->do_read_lock(env, dt, role);
+}
+
+static inline void dt_write_lock(const struct lu_env *env,
+                                struct dt_object *dt,
+                                unsigned role)
+{
+        LASSERT(dt);
+        LASSERT(dt->do_ops);
+        LASSERT(dt->do_ops->do_write_lock);
+        dt->do_ops->do_write_lock(env, dt, role);
+}
+
+static inline void dt_read_unlock(const struct lu_env *env,
+                                struct dt_object *dt)
+{
+        LASSERT(dt);
+        LASSERT(dt->do_ops);
+        LASSERT(dt->do_ops->do_read_unlock);
+        dt->do_ops->do_read_unlock(env, dt);
+}
+
+static inline void dt_write_unlock(const struct lu_env *env,
+                                struct dt_object *dt)
+{
+        LASSERT(dt);
+        LASSERT(dt->do_ops);
+        LASSERT(dt->do_ops->do_write_unlock);
+        dt->do_ops->do_write_unlock(env, dt);
+}
+
+static inline int dt_write_locked(const struct lu_env *env,
+                                  struct dt_object *dt)
+{
+        LASSERT(dt);
+        LASSERT(dt->do_ops);
+        LASSERT(dt->do_ops->do_write_locked);
+        return dt->do_ops->do_write_locked(env, dt);
+}
+
+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);
+        return dt->do_ops->do_attr_get(env, dt, la, arg);
+}
+
+static inline int dt_declare_attr_set(const struct lu_env *env,
+                                      struct dt_object *dt,
+                                      const struct lu_attr *la,
+                                      struct thandle *th)
+{
+        LASSERT(dt);
+        LASSERT(dt->do_ops);
+        LASSERT(dt->do_ops->do_declare_attr_set);
+        return dt->do_ops->do_declare_attr_set(env, dt, la, th);
+}
+
+static inline int dt_attr_set(const struct lu_env *env, struct dt_object *dt,
+                              const struct lu_attr *la, struct thandle *th,
+                              struct lustre_capa *capa)
+{
+        LASSERT(dt);
+        LASSERT(dt->do_ops);
+        LASSERT(dt->do_ops->do_attr_set);
+        return dt->do_ops->do_attr_set(env, dt, la, th, capa);
+}
+
+static inline int dt_declare_ref_add(const struct lu_env *env,
+                                     struct dt_object *dt, struct thandle *th)
+{
+        LASSERT(dt);
+        LASSERT(dt->do_ops);
+        LASSERT(dt->do_ops->do_declare_ref_add);
+        return dt->do_ops->do_declare_ref_add(env, dt, th);
+}
+
+static inline int dt_ref_add(const struct lu_env *env,
+                             struct dt_object *dt, struct thandle *th)
+{
+        LASSERT(dt);
+        LASSERT(dt->do_ops);
+        LASSERT(dt->do_ops->do_ref_add);
+        return dt->do_ops->do_ref_add(env, dt, th);
+}
+
+static inline int dt_declare_ref_del(const struct lu_env *env,
+                                     struct dt_object *dt, struct thandle *th)
+{
+        LASSERT(dt);
+        LASSERT(dt->do_ops);
+        LASSERT(dt->do_ops->do_declare_ref_del);
+        return dt->do_ops->do_declare_ref_del(env, dt, th);
+}
+
+static inline int dt_ref_del(const struct lu_env *env,
+                             struct dt_object *dt, struct thandle *th)
+{
+        LASSERT(dt);
+        LASSERT(dt->do_ops);
+        LASSERT(dt->do_ops->do_ref_del);
+        return dt->do_ops->do_ref_del(env, dt, th);
+}
+
+static inline struct obd_capa *dt_capa_get(const struct lu_env *env,
+                                           struct dt_object *dt,
+                                           struct lustre_capa *old, __u64 opc)
+{
+        LASSERT(dt);
+        LASSERT(dt->do_ops);
+        LASSERT(dt->do_ops->do_ref_del);
+        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)
+{
+        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);
+}
+
+static inline int dt_bufs_put(const struct lu_env *env, struct dt_object *d,
+                              struct niobuf_local *lnb, int n)
+{
+        LASSERT(d);
+        LASSERT(d->do_body_ops);
+        LASSERT(d->do_body_ops->dbo_bufs_put);
+        return d->do_body_ops->dbo_bufs_put(env, d, lnb, n);
+}
+
+static inline int dt_write_prep(const struct lu_env *env, struct dt_object *d,
+                                struct niobuf_local *lnb, int n)
+{
+        LASSERT(d);
+        LASSERT(d->do_body_ops);
+        LASSERT(d->do_body_ops->dbo_write_prep);
+        return d->do_body_ops->dbo_write_prep(env, d, lnb, n);
+}
+
+static inline int dt_declare_write_commit(const struct lu_env *env,
+                                          struct dt_object *d,
+                                          struct niobuf_local *lnb,
+                                          int n, struct thandle *th)
+{
+        LASSERTF(d != NULL, "dt is NULL when we want to declare write\n");
+        LASSERT(th != NULL);
+        return d->do_body_ops->dbo_declare_write_commit(env, d, lnb, n, th);
+}
+
+
+static inline int dt_write_commit(const struct lu_env *env,
+                                  struct dt_object *d, struct niobuf_local *lnb,
+                                  int n, struct thandle *th)
+{
+        LASSERT(d);
+        LASSERT(d->do_body_ops);
+        LASSERT(d->do_body_ops->dbo_write_commit);
+        return d->do_body_ops->dbo_write_commit(env, d, lnb, n, th);
+}
+
+static inline int dt_read_prep(const struct lu_env *env, struct dt_object *d,
+                               struct niobuf_local *lnb, int n)
+{
+        LASSERT(d);
+        LASSERT(d->do_body_ops);
+        LASSERT(d->do_body_ops->dbo_read_prep);
+        return d->do_body_ops->dbo_read_prep(env, d, lnb, n);
+}
+
+static inline int dt_declare_punch(const struct lu_env *env,
+                                   struct dt_object *dt, __u64 start,
+                                   __u64 end, struct thandle *th)
+{
+        LASSERT(dt);
+        LASSERT(dt->do_body_ops);
+        LASSERT(dt->do_body_ops->do_declare_punch);
+        return dt->do_body_ops->do_declare_punch(env, dt, start, end, th);
+}
+
+static inline int dt_punch(const struct lu_env *env, struct dt_object *dt,
+                           __u64 start, __u64 end, struct thandle *th,
+                           struct lustre_capa *capa)
+{
+        LASSERT(dt);
+        LASSERT(dt->do_body_ops);
+        LASSERT(dt->do_body_ops->do_punch);
+        return dt->do_body_ops->do_punch(env, dt, start, end, th, capa);
+}
+
+static inline int dt_fiemap_get(const struct lu_env *env, struct dt_object *d,
+                                struct ll_user_fiemap *fm)
+{
+        LASSERT(d);
+        if (d->do_body_ops == NULL)
+                return -EPROTO;
+        LASSERT(d->do_body_ops->dbo_fiemap_get);
+        return d->do_body_ops->dbo_fiemap_get(env, d, fm);
+}
+
+static inline int dt_statfs(const struct lu_env *env, struct dt_device *dev,
+                            cfs_kstatfs_t *osfs)
+{
+        LASSERT(dev);
+        LASSERT(dev->dd_ops);
+        LASSERT(dev->dd_ops->dt_statfs);
+        return dev->dd_ops->dt_statfs(env, dev, osfs);
+}
+
+static inline int dt_root_get(const struct lu_env *env, struct dt_device *dev,
+                              struct lu_fid *f)
+{
+        LASSERT(dev);
+        LASSERT(dev->dd_ops);
+        LASSERT(dev->dd_ops->dt_root_get);
+        return dev->dd_ops->dt_root_get(env, dev, f);
+}
+
+static inline void dt_conf_get(const struct lu_env *env,
+                               const struct dt_device *dev,
+                               struct dt_device_param *param)
+{
+        LASSERT(dev);
+        LASSERT(dev->dd_ops);
+        LASSERT(dev->dd_ops->dt_conf_get);
+        return dev->dd_ops->dt_conf_get(env, dev, param);
+}
+
+static inline int dt_sync(const struct lu_env *env, struct dt_device *dev)
+{
+        LASSERT(dev);
+        LASSERT(dev->dd_ops);
+        LASSERT(dev->dd_ops->dt_sync);
+        return dev->dd_ops->dt_sync(env, dev);
+}
+
+static inline int dt_ro(const struct lu_env *env, struct dt_device *dev)
+{
+        LASSERT(dev);
+        LASSERT(dev->dd_ops);
+        LASSERT(dev->dd_ops->dt_ro);
+        return dev->dd_ops->dt_ro(env, dev);
+}
+
+static inline int dt_declare_insert(const struct lu_env *env,
+                                    struct dt_object *dt,
+                                    const struct dt_rec *rec,
+                                    const struct dt_key *key,
+                                    struct thandle *th)
+{
+        LASSERT(dt);
+        LASSERT(dt->do_index_ops);
+        LASSERT(dt->do_index_ops->dio_declare_insert);
+        return dt->do_index_ops->dio_declare_insert(env, dt, rec, key, th);
+}
+
+static inline int dt_insert(const struct lu_env *env,
+                                    struct dt_object *dt,
+                                    const struct dt_rec *rec,
+                                    const struct dt_key *key,
+                                    struct thandle *th,
+                                    struct lustre_capa *capa,
+                                    int noquota)
+{
+        LASSERT(dt);
+        LASSERT(dt->do_index_ops);
+        LASSERT(dt->do_index_ops->dio_insert);
+        return dt->do_index_ops->dio_insert(env, dt, rec, key, th,
+                                            capa, noquota);
+}
+
+static inline int dt_declare_xattr_del(const struct lu_env *env,
+                                       struct dt_object *dt,
+                                       const char *name,
+                                       struct thandle *th)
+{
+        LASSERT(dt);
+        LASSERT(dt->do_ops);
+        LASSERT(dt->do_ops->do_declare_xattr_del);
+        return dt->do_ops->do_declare_xattr_del(env, dt, name, th);
+}
+
+static inline int dt_xattr_del(const struct lu_env *env,
+                               struct dt_object *dt, const char *name,
+                               struct thandle *th,
+                               struct lustre_capa *capa)
+{
+        LASSERT(dt);
+        LASSERT(dt->do_ops);
+        LASSERT(dt->do_ops->do_xattr_del);
+        return dt->do_ops->do_xattr_del(env, dt, name, th, capa);
+}
+
+static inline int dt_declare_xattr_set(const struct lu_env *env,
+                                      struct dt_object *dt,
+                                      const struct lu_buf *buf,
+                                      const char *name, int fl,
+                                      struct thandle *th)
+{
+        LASSERT(dt);
+        LASSERT(dt->do_ops);
+        LASSERT(dt->do_ops->do_declare_xattr_set);
+        return dt->do_ops->do_declare_xattr_set(env, dt, buf, name, fl, th);
+}
+
+static inline int dt_xattr_set(const struct lu_env *env,
+                              struct dt_object *dt, const struct lu_buf *buf,
+                              const char *name, int fl, struct thandle *th,
+                              struct lustre_capa *capa)
+{
+        LASSERT(dt);
+        LASSERT(dt->do_ops);
+        LASSERT(dt->do_ops->do_xattr_set);
+        return dt->do_ops->do_xattr_set(env, dt, buf, name, fl, th, 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)
+{
+        LASSERT(dt);
+        LASSERT(dt->do_ops);
+        LASSERT(dt->do_ops->do_xattr_get);
+        return dt->do_ops->do_xattr_get(env, dt, buf, name, capa);
+}
+
+static inline int dt_xattr_list(const struct lu_env *env,
+                               struct dt_object *dt, struct lu_buf *buf,
+                               struct lustre_capa *capa)
+{
+        LASSERT(dt);
+        LASSERT(dt->do_ops);
+        LASSERT(dt->do_ops->do_xattr_list);
+        return dt->do_ops->do_xattr_list(env, dt, buf, capa);
+}
+
+static inline int dt_declare_delete(const struct lu_env *env,
+                                    struct dt_object *dt,
+                                    const struct dt_key *key,
+                                    struct thandle *th)
+{
+        LASSERT(dt);
+        LASSERT(dt->do_index_ops);
+        LASSERT(dt->do_index_ops->dio_declare_delete);
+        return dt->do_index_ops->dio_declare_delete(env, dt, key, th);
+}
+
+static inline int dt_delete(const struct lu_env *env,
+                            struct dt_object *dt,
+                            const struct dt_key *key,
+                            struct thandle *th,
+                            struct lustre_capa *capa)
+{
+        LASSERT(dt);
+        LASSERT(dt->do_index_ops);
+        LASSERT(dt->do_index_ops->dio_delete);
+        return dt->do_index_ops->dio_delete(env, dt, key, th, capa);
+}
+
+static inline int dt_commit_async(const struct lu_env *env,
+                                  struct dt_device *dev)
+{
+        LASSERT(dev);
+        LASSERT(dev->dd_ops);
+        LASSERT(dev->dd_ops->dt_commit_async);
+        return dev->dd_ops->dt_commit_async(env, dev);
+}
+
+static inline int dt_lookup(const struct lu_env *env,
+                            struct dt_object *dt,
+                            struct dt_rec *rec,
+                            const struct dt_key *key,
+                            struct lustre_capa *capa)
+{
+        int ret;
+
+        LASSERT(dt);
+        LASSERT(dt->do_index_ops);
+        LASSERT(dt->do_index_ops->dio_lookup);
+
+        ret = dt->do_index_ops->dio_lookup(env, dt, rec, key, capa);
+        if (ret > 0)
+                ret = 0;
+        else if (ret == 0)
+                ret = -ENOENT;
+        return ret;
+}
 #endif /* __LUSTRE_DT_OBJECT_H */