Whamcloud - gitweb
LU-17744 ldiskfs: mballoc stats fixes
[fs/lustre-release.git] / lustre / ofd / ofd_internal.h
index bbe8cc2..688c332 100644 (file)
@@ -27,7 +27,6 @@
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
  */
 
 #ifndef _OFD_INTERNAL_H
@@ -61,7 +60,9 @@
 
 /* request stats */
 enum {
-       LPROC_OFD_STATS_READ = 0,
+       LPROC_OFD_STATS_READ_BYTES = 0,
+       LPROC_OFD_STATS_WRITE_BYTES,
+       LPROC_OFD_STATS_READ,
        LPROC_OFD_STATS_WRITE,
        LPROC_OFD_STATS_GETATTR,
        LPROC_OFD_STATS_SETATTR,
@@ -83,7 +84,7 @@ static inline void ofd_counter_incr(struct obd_export *exp, int opcode,
        if (exp->exp_obd && exp->exp_obd->obd_stats)
                lprocfs_counter_add(exp->exp_obd->obd_stats, opcode, amount);
 
-       if (exp->exp_obd && exp->exp_obd->u.obt.obt_jobstats.ojs_hash &&
+       if (exp->exp_obd && obd2obt(exp->exp_obd)->obt_jobstats.ojs_hash &&
            (exp_connect_flags(exp) & OBD_CONNECT_JOBSTATS))
                lprocfs_job_stats_log(exp->exp_obd, jobid, opcode, amount);
 
@@ -99,7 +100,7 @@ struct ofd_seq {
        struct ost_id           os_oi;
        spinlock_t              os_last_oid_lock;
        struct mutex            os_create_lock;
-       atomic_t                os_refc;
+       refcount_t              os_refc;
        atomic_t                os_precreate_in_progress;
        struct dt_object        *os_lastid_obj;
        unsigned long           os_destroys_in_progress:1,
@@ -133,9 +134,6 @@ struct ofd_device {
 
        /* preferred BRW size, decided by storage type and capability */
        __u32                    ofd_brw_size;
-       /* checksum types supported on this node */
-       enum cksum_types         ofd_cksum_types_supported;
-
        spinlock_t               ofd_flags_lock;
        unsigned long            ofd_raid_degraded:1,
                                 /* sync journal on writes */
@@ -144,17 +142,14 @@ struct ofd_device {
                                 ofd_lastid_rebuilding:1,
                                 ofd_record_fid_accessed:1,
                                 ofd_lfsck_verify_pfid:1,
-                                ofd_no_precreate:1,
-                                ofd_skip_lfsck:1,
-                                /* Whether to enforce T10PI checksum of RPC */
-                                ofd_checksum_t10pi_enforce:1;
+                                ofd_skip_lfsck:1;
        struct seq_server_site   ofd_seq_site;
        /* the limit of SOFT_SYNC RPCs that will trigger a soft sync */
        unsigned int             ofd_soft_sync_limit;
        /* Protect ::ofd_lastid_rebuilding */
        struct rw_semaphore      ofd_lastid_rwsem;
        __u64                    ofd_lastid_gen;
-       struct ptlrpc_thread     ofd_inconsistency_thread;
+       struct task_struct      *ofd_inconsistency_task;
        struct list_head         ofd_inconsistency_list;
        spinlock_t               ofd_inconsistency_lock;
        /* Backwards compatibility */
@@ -166,7 +161,7 @@ struct ofd_device {
 
 static inline struct ofd_device *ofd_dev(struct lu_device *d)
 {
-       return container_of0(d, struct ofd_device, ofd_dt_dev.dd_lu_dev);
+       return container_of_safe(d, struct ofd_device, ofd_dt_dev.dd_lu_dev);
 }
 
 static inline struct obd_device *ofd_obd(struct ofd_device *ofd)
@@ -184,6 +179,13 @@ static inline char *ofd_name(struct ofd_device *ofd)
        return ofd->ofd_dt_dev.dd_lu_dev.ld_obd->obd_name;
 }
 
+/**
+ * for compatibility, filter_fid could occupy more space in newer version and
+ * downgraded Lustre would fail reading it with -ERANGE, so it can read it
+ * again with more space to hold it.
+ */
+#define FILTER_FID_EXTRA_SIZE  32
+
 struct ofd_object {
        struct lu_object_header ofo_header;
        struct dt_object        ofo_obj;
@@ -195,7 +197,7 @@ struct ofd_object {
 
 static inline struct ofd_object *ofd_obj(struct lu_object *o)
 {
-       return container_of0(o, struct ofd_object, ofo_obj.do_lu);
+       return container_of_safe(o, struct ofd_object, ofo_obj.do_lu);
 }
 
 static inline int ofd_object_exists(struct ofd_object *obj)
@@ -302,7 +304,7 @@ void ofd_access_log_module_exit(void);
 struct ofd_access_log;
 struct ofd_access_log *ofd_access_log_create(const char *ofd_name, size_t size);
 void ofd_access_log_delete(struct ofd_access_log *oal);
-void ofd_access(struct ofd_device *m,
+void ofd_access(const struct lu_env *env, struct ofd_device *m,
                const struct lu_fid *parent_fid, __u64 begin, __u64 end,
                unsigned int size, unsigned int segment_count, int rw);
 
@@ -352,7 +354,8 @@ int ofd_preprw(const struct lu_env *env,int cmd, struct obd_export *exp,
 int ofd_commitrw(const struct lu_env *env, int cmd, struct obd_export *exp,
                 struct obdo *oa, int objcount, struct obd_ioobj *obj,
                 struct niobuf_remote *rnb, int npages,
-                struct niobuf_local *lnb, int old_rc);
+                struct niobuf_local *lnb, int old_rc, int nob,
+                ktime_t kstart);
 
 /* ofd_trans.c */
 struct thandle *ofd_trans_create(const struct lu_env *env,
@@ -368,9 +371,13 @@ int ofd_txn_stop_cb(const struct lu_env *env, struct thandle *txn,
 /* lproc_ofd.c */
 int ofd_tunables_init(struct ofd_device *ofd);
 #ifdef CONFIG_PROC_FS
-void ofd_stats_counter_init(struct lprocfs_stats *stats);
+void ofd_stats_counter_init(struct lprocfs_stats *stats, unsigned int offset,
+                           enum lprocfs_counter_config cntr_umask);
 #else
-static inline void ofd_stats_counter_init(struct lprocfs_stats *stats) {}
+static inline void
+ofd_stats_counter_init(struct lprocfs_stats *stats,
+                      unsigned int offset,
+                      enum lprocfs_counter_config cntr_umask) {}
 #endif
 
 /* ofd_objects.c */
@@ -381,7 +388,8 @@ int ofd_object_ff_load(const struct lu_env *env, struct ofd_object *fo);
 int ofd_object_ff_update(const struct lu_env *env, struct ofd_object *fo,
                         const struct obdo *oa, struct filter_fid *ff);
 int ofd_precreate_objects(const struct lu_env *env, struct ofd_device *ofd,
-                         u64 id, struct ofd_seq *oseq, int nr, int sync);
+                         u64 id, struct ofd_seq *oseq, int nr, int sync,
+                         bool trans_local);
 
 static inline void ofd_object_put(const struct lu_env *env,
                                  struct ofd_object *fo)
@@ -503,4 +511,40 @@ static inline int ofd_validate_seq(struct obd_export *exp, __u64 seq)
        return 0;
 }
 
+/**
+ * whether the requestion IO contains older layout version than that on the
+ * disk.
+ */
+static inline bool ofd_layout_version_less(__u32 req_version,
+                                          __u32 ondisk_version)
+{
+       __u32 req = req_version & ~LU_LAYOUT_RESYNC;
+       __u32 ondisk = ondisk_version & ~LU_LAYOUT_RESYNC;
+
+       /**
+        * request layout version could be circularly increased to the samllest
+        * value, in that case @req < @ondisk but @req does not have the high
+        * end bit set while @ondisk does.
+        */
+       return (req < ondisk) &&
+               ((req & LU_LAYOUT_HIGEN) == (ondisk & LU_LAYOUT_HIGEN));
+}
+
+static inline int ofd_seq_is_exhausted(struct ofd_device *ofd,
+                                      const struct obdo *oa)
+{
+       struct seq_server_site *ss = &ofd->ofd_seq_site;
+       __u64 seq_width = ss->ss_client_seq->lcs_width;
+       __u64 seq = ostid_seq(&oa->o_oi);
+       __u64 oid = ostid_id(&oa->o_oi);
+
+       if (fid_seq_is_norm(seq))
+               return oid >= min(seq_width, OBIF_MAX_OID);
+       if (fid_seq_is_idif(seq) || fid_seq_is_mdt0(seq))
+               return oid >= min(seq_width, IDIF_MAX_OID);
+       CERROR("%s : invalid o_seq "DOSTID"\n",
+              ofd_name(ofd), POSTID(&oa->o_oi));
+       return -EINVAL;
+}
+
 #endif /* _OFD_INTERNAL_H */