Whamcloud - gitweb
LU-3336 lfsck: use rbtree to record OST-object accessing
[fs/lustre-release.git] / lustre / include / dt_object.h
index 284184d..cdd321a 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 */
@@ -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.
          */
@@ -230,8 +229,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;
 };
 
 /**
@@ -301,6 +302,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 +327,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 +386,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.
          *
@@ -622,6 +633,7 @@ struct dt_index_operations {
 
 enum dt_otable_it_valid {
        DOIV_ERROR_HANDLE       = 0x0001,
+       DOIV_DRYRUN             = 0x0002,
 };
 
 enum dt_otable_it_flags {
@@ -633,6 +645,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.
@@ -656,6 +671,7 @@ struct dt_device {
          * single-threaded start-up shut-down procedures.
          */
         cfs_list_t                         dd_txn_callbacks;
+       unsigned int                       dd_record_fid_accessed:1;
 };
 
 int  dt_device_init(struct dt_device *dev, struct lu_device_type *t);
@@ -687,16 +703,21 @@ struct local_oid_storage {
        cfs_list_t        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;
 
        /* data used to generate new fids */
-       struct mutex     los_id_lock;
+       struct mutex      los_id_lock;
        __u64             los_seq;
        __u32             los_last_oid;
 };
 
+static inline struct lu_device *dt2lu_dev(struct dt_device *d)
+{
+        return &d->dd_lu_dev;
+}
+
 static inline struct dt_object *lu2dt(struct lu_object *l)
 {
         LASSERT(l == NULL || IS_ERR(l) || lu_device_is_dt(l->lo_dev));
@@ -724,6 +745,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
@@ -742,6 +776,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;
 
@@ -758,15 +796,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.
  *
@@ -832,15 +877,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);
@@ -958,8 +1005,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,
@@ -1080,6 +1127,16 @@ 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);
+       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)
 {
@@ -1152,7 +1209,7 @@ 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);
 }
 
@@ -1363,6 +1420,18 @@ static inline int dt_xattr_set(const struct lu_env *env,
         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);
+       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)
@@ -1463,6 +1532,7 @@ 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;
 };
 
@@ -1481,6 +1551,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,
@@ -1493,6 +1564,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 */