Whamcloud - gitweb
LU-11014 mdc: remove obsolete intent opcodes
[fs/lustre-release.git] / lustre / include / obd.h
index 8da5942..fa3b407 100644 (file)
@@ -23,7 +23,7 @@
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2011, 2016, Intel Corporation.
+ * Copyright (c) 2011, 2017, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
 #ifndef __OBD_H
 #define __OBD_H
 
+#include <linux/kobject.h>
 #include <linux/spinlock.h>
+#include <linux/sysfs.h>
 
-#include <lustre/lustre_idl.h>
+#include <uapi/linux/lustre/lustre_idl.h>
 #include <lustre_lib.h>
 #include <libcfs/bitmap.h>
 #ifdef HAVE_SERVER_SUPPORT
@@ -76,10 +78,6 @@ static inline void loi_kms_set(struct lov_oinfo *oinfo, __u64 kms)
         oinfo->loi_kms_valid = 1;
 }
 
-static inline void loi_init(struct lov_oinfo *loi)
-{
-}
-
 struct lov_stripe_md;
 struct obd_info;
 
@@ -104,11 +102,15 @@ struct obd_type {
        struct md_ops           *typ_md_ops;
        struct proc_dir_entry   *typ_procroot;
        struct proc_dir_entry   *typ_procsym;
-       __u32                    typ_sym_filter;
+       struct dentry           *typ_debugfs_entry;
+#ifdef HAVE_SERVER_SUPPORT
+       bool                     typ_sym_filter;
+#endif
        char                    *typ_name;
        int                      typ_refcnt;
        struct lu_device_type   *typ_lu;
        spinlock_t               obd_type_lock;
+       struct kobject          *typ_kobj;
 };
 
 struct brw_page {
@@ -120,7 +122,7 @@ struct brw_page {
 
 struct timeout_item {
        enum timeout_event ti_event;
-       cfs_time_t         ti_timeout;
+       time64_t           ti_timeout;
        timeout_cb_t       ti_cb;
        void              *ti_cb_data;
        struct list_head   ti_obd_list;
@@ -130,7 +132,7 @@ struct timeout_item {
 #define OBD_MAX_RIF_DEFAULT    8
 #define OBD_MAX_RIF_MAX                512
 #define OSC_MAX_RIF_MAX                256
-#define OSC_MAX_DIRTY_DEFAULT  (OBD_MAX_RIF_DEFAULT * 4)
+#define OSC_MAX_DIRTY_DEFAULT  2000     /* Arbitrary large value */
 #define OSC_MAX_DIRTY_MB_MAX   2048     /* arbitrary, but < MAX_LONG bytes */
 #define OSC_DEFAULT_RESENDS    10
 
@@ -185,6 +187,17 @@ struct client_obd {
         * run-time if a larger observed size is advertised by the MDT. */
        __u32                    cl_max_mds_easize;
 
+       /* Data-on-MDT specific value to set larger reply buffer for possible
+        * data read along with open/stat requests. By default it tries to use
+        * unused space in reply buffer.
+        * This value is used to ensure that reply buffer has at least as
+        * much free space as value indicates. That free space is gained from
+        * LOV EA buffer which is small for DoM files and on big systems can
+        * provide up to 32KB of extra space in reply buffer.
+        * Default value is 8K now.
+        */
+       __u32                    cl_dom_min_inline_repsize;
+
        enum lustre_sec_part     cl_sp_me;
        enum lustre_sec_part     cl_sp_to;
        struct sptlrpc_flavor    cl_flvr_mgc; /* fixed flavor of mgc->mgs */
@@ -204,9 +217,9 @@ struct client_obd {
         * See osc_{reserve|unreserve}_grant for details. */
        long                    cl_reserved_grant;
        struct list_head        cl_cache_waiters; /* waiting for cache/grant */
-       cfs_time_t              cl_next_shrink_grant;   /* jiffies */
-       struct list_head        cl_grant_shrink_list;  /* Timeout event list */
-       int                     cl_grant_shrink_interval; /* seconds */
+       time64_t                cl_next_shrink_grant;   /* seconds */
+       struct list_head        cl_grant_chain;
+       time64_t                cl_grant_shrink_interval; /* seconds */
 
        /* A chunk is an optimal size used by osc_extent to determine
         * the extent size. A chunk is max(PAGE_SIZE, OST block size) */
@@ -246,6 +259,7 @@ struct client_obd {
        atomic_t                cl_pending_r_pages;
        __u32                   cl_max_pages_per_rpc;
        __u32                   cl_max_rpcs_in_flight;
+       __u32                   cl_short_io_bytes;
        struct obd_histogram    cl_read_rpc_hist;
        struct obd_histogram    cl_write_rpc_hist;
        struct obd_histogram    cl_read_page_hist;
@@ -308,29 +322,36 @@ struct client_obd {
        struct mutex              cl_mgc_mutex;
        struct local_oid_storage *cl_mgc_los;
        struct dt_object         *cl_mgc_configs_dir;
-       atomic_t                  cl_mgc_refcount;
        struct obd_export        *cl_mgc_mgsexp;
+       atomic_t                  cl_mgc_refcount;
+       /* in-flight control list and total RPCs counter */
+       struct list_head         cl_flight_waiters;
+       __u32                    cl_rpcs_in_flight;
 
         /* checksumming for data sent over the network */
-        unsigned int             cl_checksum:1; /* 0 = disabled, 1 = enabled */
+       unsigned int             cl_checksum:1, /* 0 = disabled, 1 = enabled */
+                                cl_checksum_dump:1; /* same */
         /* supported checksum types that are worked out at connect time */
         __u32                    cl_supp_cksum_types;
         /* checksum algorithm to be used */
-        cksum_type_t             cl_cksum_type;
+       enum cksum_types         cl_cksum_type;
 
         /* also protected by the poorly named _loi_list_lock lock above */
         struct osc_async_rc      cl_ar;
 
        /* sequence manager */
        struct lu_client_seq    *cl_seq;
+       struct rw_semaphore      cl_seq_rwsem;
 
-       atomic_t             cl_resends; /* resend count */
+       atomic_t                 cl_resends; /* resend count */
 
        /* ptlrpc work for writeback in ptlrpcd context */
        void                    *cl_writeback_work;
        void                    *cl_lru_work;
        /* hash tables for osc_quota_info */
        struct cfs_hash         *cl_quota_hash[LL_MAXQUOTAS];
+       /* Links to the global list of registered changelog devices */
+       struct list_head         cl_chg_dev_linkage;
 };
 #define obd2cli_tgt(obd) ((char *)(obd)->u.cli.cl_target_uuid.uuid)
 
@@ -371,6 +392,11 @@ struct lov_tgt_desc {
                             ltd_reap:1;  /* should this target be deleted */
 };
 
+struct lov_md_tgt_desc {
+       struct obd_device *lmtd_mdc;
+       __u32              lmtd_index;
+};
+
 struct lov_obd {
        struct lov_desc         desc;
        struct lov_tgt_desc   **lov_tgts;               /* sparse array */
@@ -393,10 +419,15 @@ struct lov_obd {
        struct cl_client_cache *lov_cache;
 
        struct rw_semaphore     lov_notify_lock;
+       /* Data-on-MDT: MDC array */
+       struct lov_md_tgt_desc  *lov_mdc_tgts;
+
+       struct kobject          *lov_tgts_kobj;
 };
 
 struct lmv_tgt_desc {
        struct obd_uuid         ltd_uuid;
+       struct obd_device       *ltd_obd;
        struct obd_export       *ltd_exp;
        __u32                   ltd_idx;
        struct mutex            ltd_fid_mutex;
@@ -407,8 +438,6 @@ struct lmv_obd {
        struct lu_client_fld    lmv_fld;
        spinlock_t              lmv_lock;
        struct lmv_desc         desc;
-       struct obd_uuid         cluuid;
-       struct proc_dir_entry   *targets_proc_entry;
 
        struct mutex            lmv_init_mutex;
        int                     connected;
@@ -419,6 +448,7 @@ struct lmv_obd {
        struct lmv_tgt_desc     **tgts;
 
        struct obd_connect_data conn_data;
+       struct kobject          *lmv_tgts_kobj;
 };
 
 struct niobuf_local {
@@ -541,11 +571,11 @@ enum obd_notify_event {
 
 /*
  * Data structure used to pass obd_notify()-event to non-obd listeners (llite
- * and liblustre being main examples).
+ * being main example).
  */
 struct obd_notify_upcall {
-        int (*onu_upcall)(struct obd_device *host, struct obd_device *watched,
-                          enum obd_notify_event ev, void *owner, void *data);
+       int (*onu_upcall)(struct obd_device *host, struct obd_device *watched,
+                         enum obd_notify_event ev, void *owner);
         /* Opaque datum supplied by upper layer listener */
         void *onu_owner;
 };
@@ -596,7 +626,7 @@ struct obd_device {
                                         * (for /proc/status only!!) */
                obd_no_ir:1,            /* no imperative recovery. */
                obd_process_conf:1,     /* device is processing mgs config */
-               obd_uses_nid_stats:1;   /* maintain per-client OBD stats */
+               obd_checksum_dump:1;    /* dump pages upon cksum error */
 
         /* use separate field as it is set in interrupt to don't mess with
          * protection of other bits using _bh lock */
@@ -623,7 +653,7 @@ struct obd_device {
        spinlock_t              obd_dev_lock; /* protect OBD bitfield above */
        spinlock_t              obd_osfs_lock;
        struct obd_statfs       obd_osfs;       /* locked by obd_osfs_lock */
-       __u64                   obd_osfs_age;
+       time64_t                obd_osfs_age;
        __u64                   obd_last_committed;
        struct mutex            obd_dev_mutex;
        struct lvfs_run_ctxt    obd_lvfs_ctxt;
@@ -635,7 +665,7 @@ struct obd_device {
        struct obd_export       *obd_lwp_export;
        /* list of exports in LRU order, for ping evictor, with obd_dev_lock */
        struct list_head        obd_exports_timed;
-       time_t                  obd_eviction_timer;     /* for ping evictor */
+       time64_t                obd_eviction_timer;     /* for ping evictor */
 
        int                     obd_max_recoverable_clients;
        atomic_t                obd_connected_clients;
@@ -650,11 +680,11 @@ struct obd_device {
        /* protected by obd_recovery_task_lock */
        struct timer_list       obd_recovery_timer;
        /* seconds */
-       time_t                  obd_recovery_start;
+       time64_t                obd_recovery_start;
        /* seconds, for lprocfs_status */
-       time_t                  obd_recovery_end;
-       int                     obd_recovery_time_hard;
-       int                     obd_recovery_timeout;
+       time64_t                obd_recovery_end;
+       time64_t                obd_recovery_time_hard;
+       time64_t                obd_recovery_timeout;
        int                     obd_recovery_ir_factor;
 
        /* new recovery stuff from CMD2 */
@@ -683,15 +713,16 @@ struct obd_device {
 
        /* Fields used by LProcFS */
        struct lprocfs_stats            *obd_stats;
-       unsigned int                    obd_cntr_base;
 
        unsigned int                     obd_md_cntr_base;
        struct lprocfs_stats            *obd_md_stats;
 
+       struct dentry                   *obd_debugfs_entry;
        struct proc_dir_entry   *obd_proc_entry;
        struct proc_dir_entry   *obd_proc_exports_entry;
-       struct proc_dir_entry   *obd_svc_procroot;
+       struct dentry                   *obd_svc_debugfs_entry;
        struct lprocfs_stats    *obd_svc_stats;
+       const struct attribute         **obd_attrs;
        struct lprocfs_vars     *obd_vars;
        atomic_t                obd_evict_inprogress;
        wait_queue_head_t       obd_evict_inprogress_waitq;
@@ -709,6 +740,10 @@ struct obd_device {
        /**
         * List of outstanding class_incref()'s fo this OBD. For debugging. */
        struct lu_ref                   obd_reference;
+
+       struct kset                     obd_kset; /* sysfs object collection */
+       struct kobj_type                obd_ktype;
+       struct completion               obd_kobj_unregister;
 };
 
 /* get/set_info keys */
@@ -748,15 +783,14 @@ static inline int it_to_lock_mode(struct lookup_intent *it)
        /* CREAT needs to be tested before open (both could be set) */
        if (it->it_op & IT_CREAT)
                return LCK_CW;
-       else if (it->it_op & (IT_GETATTR | IT_OPEN | IT_LOOKUP |
-                             IT_LAYOUT))
+       else if (it->it_op & (IT_GETATTR | IT_OPEN | IT_LOOKUP))
                return LCK_CR;
+       else if (it->it_op & IT_LAYOUT)
+               return (it->it_flags & FMODE_WRITE) ? LCK_EX : LCK_CR;
        else if (it->it_op &  IT_READDIR)
                return LCK_PR;
        else if (it->it_op &  IT_GETXATTR)
                return LCK_PR;
-       else if (it->it_op &  IT_SETXATTR)
-               return LCK_PW;
 
        LASSERTF(0, "Invalid it_op: %d\n", it->it_op);
        return -EINVAL;
@@ -785,43 +819,40 @@ enum md_cli_flags {
  */
 static inline bool it_has_reply_body(const struct lookup_intent *it)
 {
-       return it->it_op & (IT_OPEN | IT_UNLINK | IT_LOOKUP | IT_GETATTR);
+       return it->it_op & (IT_OPEN | IT_LOOKUP | IT_GETATTR);
 }
 
 struct md_op_data {
-        struct lu_fid           op_fid1; /* operation fid1 (usualy parent) */
-        struct lu_fid           op_fid2; /* operation fid2 (usualy child) */
-        struct lu_fid           op_fid3; /* 2 extra fids to find conflicting */
-        struct lu_fid           op_fid4; /* to the operation locks. */
+       struct lu_fid           op_fid1; /* operation fid1 (usualy parent) */
+       struct lu_fid           op_fid2; /* operation fid2 (usualy child) */
+       struct lu_fid           op_fid3; /* 2 extra fids to find conflicting */
+       struct lu_fid           op_fid4; /* to the operation locks. */
        u32                     op_mds;  /* what mds server open will go to */
-       struct lustre_handle    op_handle;
+       __u32                   op_mode;
+       struct lustre_handle    op_handle;
        s64                     op_mod_time;
-        const char             *op_name;
+       const char              *op_name;
        size_t                  op_namelen;
-        __u32                   op_mode;
-        struct lmv_stripe_md   *op_mea1;
-        struct lmv_stripe_md   *op_mea2;
-        __u32                   op_suppgids[2];
-        __u32                   op_fsuid;
-        __u32                   op_fsgid;
-        cfs_cap_t               op_cap;
-        void                   *op_data;
+       struct lmv_stripe_md    *op_mea1;
+       struct lmv_stripe_md    *op_mea2;
+       __u32                   op_suppgids[2];
+       __u32                   op_fsuid;
+       __u32                   op_fsgid;
+       cfs_cap_t               op_cap;
+       void                    *op_data;
        size_t                  op_data_size;
 
-        /* iattr fields and blocks. */
+       /* iattr fields and blocks. */
        struct iattr            op_attr;
        loff_t                  op_attr_blocks;
-       unsigned int            op_attr_flags; /* LUSTRE_{SYNC,..}_FL */
        __u64                   op_valid; /* OBD_MD_* */
+       unsigned int            op_attr_flags; /* LUSTRE_{SYNC,..}_FL */
 
        enum md_op_flags        op_flags;
 
        /* Various operation flags. */
        enum mds_op_bias        op_bias;
 
-       /* Used by readdir */
-       unsigned int            op_max_pages;
-
        /* used to transfer info between the stacks of MD client
         * see enum op_cli_flags */
        enum md_cli_flags       op_cli_flags;
@@ -837,6 +868,13 @@ struct md_op_data {
 
        /* default stripe offset */
        __u32                   op_default_stripe_offset;
+
+       __u32                   op_projid;
+
+       /* Used by readdir */
+       unsigned int            op_max_pages;
+
+       __u16                   op_mirror_id;
 };
 
 struct md_callback {
@@ -908,9 +946,9 @@ struct obd_ops {
         * about this.
         */
        int (*o_statfs)(const struct lu_env *, struct obd_export *exp,
-                       struct obd_statfs *osfs, __u64 max_age, __u32 flags);
+                       struct obd_statfs *osfs, time64_t max_age, __u32 flags);
        int (*o_statfs_async)(struct obd_export *exp, struct obd_info *oinfo,
-                             __u64 max_age, struct ptlrpc_request_set *set);
+                             time64_t max_age, struct ptlrpc_request_set *set);
        int (*o_create)(const struct lu_env *env, struct obd_export *exp,
                        struct obdo *oa);
        int (*o_destroy)(const struct lu_env *env, struct obd_export *exp,
@@ -935,7 +973,7 @@ struct obd_ops {
                              enum obd_import_event);
 
        int (*o_notify)(struct obd_device *obd, struct obd_device *watched,
-                       enum obd_notify_event ev, void *data);
+                       enum obd_notify_event ev);
 
        int (*o_health_check)(const struct lu_env *env, struct obd_device *);
        struct obd_uuid *(*o_get_uuid) (struct obd_export *exp);
@@ -953,12 +991,6 @@ struct obd_ops {
                          char *ostname);
        int (*o_pool_rem)(struct obd_device *obd, char *poolname,
                          char *ostname);
-       void (*o_getref)(struct obd_device *obd);
-       void (*o_putref)(struct obd_device *obd);
-       /*
-        * NOTE: If adding ops, add another LPROCFS_OBD_OP_INIT() line
-        * to lprocfs_alloc_obd_stats() in obdclass/lprocfs_status.c.
-        * Also, add a wrapper function in include/linux/obd_class.h. */
 };
 
 /* lmv structures */
@@ -1046,12 +1078,11 @@ struct md_ops {
                        struct ptlrpc_request **);
 
        int (*m_setxattr)(struct obd_export *, const struct lu_fid *,
-                         u64, const char *, const char *, int, int, int, u32,
-                         struct ptlrpc_request **);
+                         u64, const char *, const void *, size_t, unsigned int,
+                         u32, struct ptlrpc_request **);
 
        int (*m_getxattr)(struct obd_export *, const struct lu_fid *,
-                         u64, const char *, const char *, int, int, int,
-                         struct ptlrpc_request **);
+                         u64, const char *, size_t, struct ptlrpc_request **);
 
        int (*m_intent_getattr_async)(struct obd_export *,
                                      struct md_enqueue_info *);
@@ -1061,6 +1092,8 @@ struct md_ops {
 
 #define MD_STATS_LAST_OP m_revalidate_lock
 
+       int (*m_file_resync)(struct obd_export *, struct md_op_data *);
+
        int (*m_get_root)(struct obd_export *, const char *, struct lu_fid *);
        int (*m_null_inode)(struct obd_export *, const struct lu_fid *);
 
@@ -1128,6 +1161,7 @@ static inline struct md_open_data *obd_mod_alloc(void)
 
 void obdo_from_inode(struct obdo *dst, struct inode *src, u64 valid);
 void obdo_set_parent_fid(struct obdo *dst, const struct lu_fid *parent);
+void obdo_set_o_projid(struct obdo *dst, u32 projid);
 
 /* return 1 if client should be resend request */
 static inline int client_should_resend(int resend, struct client_obd *cli)
@@ -1197,7 +1231,8 @@ static inline int cli_brw_size(struct obd_device *obd)
        return obd->u.cli.cl_max_pages_per_rpc << PAGE_SHIFT;
 }
 
-/* when RPC size or the max RPCs in flight is increased, the max dirty pages
+/*
+ * When RPC size or the max RPCs in flight is increased, the max dirty pages
  * of the client should be increased accordingly to avoid sending fragmented
  * RPCs over the network when the client runs out of the maximum dirty space
  * when so many RPCs are being generated.
@@ -1205,10 +1240,10 @@ static inline int cli_brw_size(struct obd_device *obd)
 static inline void client_adjust_max_dirty(struct client_obd *cli)
 {
         /* initializing */
-       if (cli->cl_dirty_max_pages <= 0)
-               cli->cl_dirty_max_pages = (OSC_MAX_DIRTY_DEFAULT * 1024 * 1024)
-                                                       >> PAGE_SHIFT;
-       else {
+       if (cli->cl_dirty_max_pages <= 0) {
+               cli->cl_dirty_max_pages =
+                       (OSC_MAX_DIRTY_DEFAULT * 1024 * 1024) >> PAGE_SHIFT;
+       else {
                unsigned long dirty_max = cli->cl_max_rpcs_in_flight *
                                          cli->cl_max_pages_per_rpc;
 
@@ -1218,6 +1253,12 @@ static inline void client_adjust_max_dirty(struct client_obd *cli)
 
        if (cli->cl_dirty_max_pages > totalram_pages / 8)
                cli->cl_dirty_max_pages = totalram_pages / 8;
+
+       /* This value is exported to userspace through the max_dirty_mb
+        * parameter.  So we round up the number of pages to make it a round
+        * number of MBs. */
+       cli->cl_dirty_max_pages = round_up(cli->cl_dirty_max_pages,
+                                          1 << (20 - PAGE_SHIFT));
 }
 
 #endif /* __OBD_H */