Whamcloud - gitweb
Cleanup Compiler Warnings(Patch by Robert Read)
[fs/lustre-release.git] / lustre / include / obd.h
index b5c14c0..242d80d 100644 (file)
@@ -52,7 +52,7 @@ struct loi_oap_pages {
 struct osc_async_rc {
         int     ar_rc;
         int     ar_force_sync;
-        int     ar_min_xid;
+        __u64   ar_min_xid;
 };
 
 struct lov_oinfo {                 /* per-stripe data structure */
@@ -105,7 +105,7 @@ struct lov_array_info {
 
 struct lov_stripe_md {
         spinlock_t       lsm_lock;
-        void            *lsm_lock_owner; /* debugging */
+        pid_t            lsm_lock_owner; /* debugging */
 
         struct {
                 /* Public members. */
@@ -142,8 +142,11 @@ struct obd_info {
          * OSC. (e.g. lov_prep_enqueue_set initialises extent of the policy,
          * and osc_enqueue passes it into ldlm_lock_match & ldlm_cli_enqueue. */
         ldlm_policy_data_t      oi_policy;
-        /* Flags used while lock handling. The flags obtained on the enqueue
-         * request are set here, therefore they are request specific. */
+        /* Flags used for set request specific flags:
+           - while lock handling, the flags obtained on the enqueue
+           request are set here.
+           - while stats, the flags used for control delay/resend.
+         */
         int                     oi_flags;
         /* Lock handle specific for every OSC lock. */
         struct lustre_handle   *oi_lockh;
@@ -252,31 +255,30 @@ struct obd_device_target {
         struct lustre_quota_ctxt  obt_qctxt;
 };
 
+typedef void (*obd_pin_extent_cb)(void *data);
+typedef int (*obd_page_removal_cb_t)(void *data, int discard);
+typedef int (*obd_lock_cancel_cb)(struct ldlm_lock *,struct ldlm_lock_desc *,
+                                   void *, int);
+
 /* llog contexts */
 enum llog_ctxt_id {
         LLOG_CONFIG_ORIG_CTXT  =  0,
-        LLOG_CONFIG_REPL_CTXT  =  1,
-        LLOG_MDS_OST_ORIG_CTXT =  2,
-        LLOG_MDS_OST_REPL_CTXT =  3,
-        LLOG_SIZE_ORIG_CTXT    =  4,
-        LLOG_SIZE_REPL_CTXT    =  5,
-        LLOG_MD_ORIG_CTXT      =  6,
-        LLOG_MD_REPL_CTXT      =  7,
-        LLOG_RD1_ORIG_CTXT     =  8,
-        LLOG_RD1_REPL_CTXT     =  9,
-        LLOG_TEST_ORIG_CTXT    = 10,
-        LLOG_TEST_REPL_CTXT    = 11,
-        LLOG_LOVEA_ORIG_CTXT   = 12,
-        LLOG_LOVEA_REPL_CTXT   = 13,
+        LLOG_CONFIG_REPL_CTXT,
+        LLOG_MDS_OST_ORIG_CTXT,
+        LLOG_MDS_OST_REPL_CTXT,
+        LLOG_SIZE_ORIG_CTXT,
+        LLOG_SIZE_REPL_CTXT,
+        LLOG_RD1_ORIG_CTXT,
+        LLOG_RD1_REPL_CTXT,
+        LLOG_TEST_ORIG_CTXT,
+        LLOG_TEST_REPL_CTXT,
+        LLOG_LOVEA_ORIG_CTXT,
+        LLOG_LOVEA_REPL_CTXT,
         LLOG_MAX_CTXTS
 };
 
 #define FILTER_SUBDIR_COUNT      32            /* set to zero for no subdirs */
 
-#define FILTER_GROUP_LLOG 1
-#define FILTER_GROUP_ECHO 2
-#define FILTER_GROUP_MDS0 3
-
 struct filter_subdirs {
        cfs_dentry_t *dentry[FILTER_SUBDIR_COUNT];
 };
@@ -287,17 +289,6 @@ struct filter_ext {
         __u64                fe_end;
 };
 
-struct obd_llogs {
-        struct llog_ctxt        *llog_ctxt[LLOG_MAX_CTXTS];
-};
-
-struct filter_group_llog {
-        struct list_head list;
-        int group;
-        struct obd_llogs *llogs;
-        struct obd_export *exp;
-};
-
 struct filter_obd {
         /* NB this field MUST be first */
         struct obd_device_target fo_obt;
@@ -370,10 +361,16 @@ struct filter_obd {
         int                      fo_fmd_max_num; /* per exp filter_mod_data */
         int                      fo_fmd_max_age; /* jiffies to fmd expiry */
 
+        /* sptlrpc stuff */
+        rwlock_t                 fo_sptlrpc_lock;
+        struct sptlrpc_rule_set  fo_sptlrpc_rset;
+
         /* capability related */
         unsigned int             fo_fl_oss_capa;
         struct list_head         fo_capa_keys;
         struct hlist_head       *fo_capa_hash;
+
+        void                    *fo_lcm;
 };
 
 #define OSC_MAX_RIF_DEFAULT       8
@@ -387,8 +384,9 @@ struct filter_obd {
 
 struct mdc_rpc_lock;
 struct obd_import;
+struct lustre_cache;
 struct client_obd {
-        struct semaphore         cl_sem;
+        struct rw_semaphore      cl_sem;
         struct obd_uuid          cl_target_uuid;
         struct obd_import       *cl_import; /* ptlrpc connection state */
         int                      cl_conn_count;
@@ -399,7 +397,8 @@ struct client_obd {
         int                      cl_max_mds_cookiesize;
 
         /* security configuration */
-        struct sec_flavor_config cl_sec_conf;
+        struct sptlrpc_rule_set  cl_sptlrpc_rset;
+        enum lustre_sec_part     cl_sec_part;
 
         //struct llog_canceld_ctxt *cl_llcd; /* it's included by obd_llog_ctxt */
         void                    *cl_llcd_offset;
@@ -463,9 +462,13 @@ struct client_obd {
         atomic_t                 cl_mgc_refcount;
         struct obd_export       *cl_mgc_mgsexp;
 
-        /* Flags section */
-        unsigned long            cl_checksum:1; /* debug checksums */
-
+        /* checksumming for data sent over the network */
+        unsigned int             cl_checksum:1; /* 0 = disabled, 1 = enabled */
+        /* 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;
         /* also protected by the poorly named _loi_list_lock lock above */
         struct osc_async_rc      cl_ar;
 
@@ -476,6 +479,10 @@ struct client_obd {
         struct lu_client_seq    *cl_seq;
 
         atomic_t                 cl_resends; /* resend count */
+
+        /* Cache of triples */
+        struct lustre_cache     *cl_cache;
+        obd_lock_cancel_cb       cl_ext_lock_cancel_cb;
 };
 #define obd2cli_tgt(obd) ((char *)(obd)->u.cli.cl_target_uuid.uuid)
 
@@ -492,15 +499,6 @@ struct mgs_obd {
         cfs_proc_dir_entry_t            *mgs_proc_live;
 };
 
-/* hah, upper limit 64 should be enough */
-#define N_NOSQUASH_NIDS 64
-struct rootsquash_info {
-        uid_t           rsi_uid;
-        gid_t           rsi_gid;
-        int             rsi_n_nosquash_nids;
-        lnet_nid_t      rsi_nosquash_nids[N_NOSQUASH_NIDS];
-};
-
 struct mds_obd {
         /* NB this field MUST be first */
         struct obd_device_target         mds_obt;
@@ -524,7 +522,6 @@ struct mds_obd {
         cfs_dentry_t                    *mds_logs_dir;
         cfs_dentry_t                    *mds_objects_dir;
         struct llog_handle              *mds_cfg_llh;
-//        struct llog_handle              *mds_catalog;
         struct obd_device               *mds_osc_obd; /* XXX lov_obd */
         struct obd_uuid                  mds_lov_uuid;
         char                            *mds_profile;
@@ -556,13 +553,10 @@ struct mds_obd {
                                          mds_fl_synced:1;
 
         struct upcall_cache             *mds_identity_cache;
-        struct upcall_cache             *mds_rmtacl_cache;
-
-        /* root squash */
-        struct rootsquash_info          *mds_rootsquash_info;
 
         /* for capability keys update */
         struct lustre_capa_key          *mds_capa_keys;
+        struct rw_semaphore             mds_notify_lock;
 };
 
 /* lov objid */
@@ -664,6 +658,9 @@ struct lov_obd {
         __u32                   lov_offset_idx; /* aliasing for start_idx  */
         int                     lov_start_count;/* reseed counter */
         int                     lov_connects;
+        obd_page_removal_cb_t   lov_page_removal_cb;
+        obd_pin_extent_cb       lov_page_pin_cb;
+        obd_lock_cancel_cb      lov_lock_cancel_cb;
 };
 
 struct lmv_tgt_desc {
@@ -765,17 +762,18 @@ static inline void oti_init(struct obd_trans_info *oti,
 {
         if (oti == NULL)
                 return;
-        memset(oti, 0, sizeof *oti);
+        memset(oti, 0, sizeof(*oti));
 
         if (req == NULL)
                 return;
 
         oti->oti_xid = req->rq_xid;
 
-        if (req->rq_repmsg && req->rq_reqmsg != 0)
+        if (req->rq_repmsg != NULL)
                 oti->oti_transno = lustre_msg_get_transno(req->rq_repmsg);
         oti->oti_thread_id = req->rq_svc_thread ? req->rq_svc_thread->t_id : -1;
-        oti->oti_conn_cnt = lustre_msg_get_conn_cnt(req->rq_reqmsg);
+        if (req->rq_reqmsg != NULL)
+                oti->oti_conn_cnt = lustre_msg_get_conn_cnt(req->rq_reqmsg);
 }
 
 static inline void oti_alloc_cookies(struct obd_trans_info *oti,int num_cookies)
@@ -849,6 +847,24 @@ struct target_recovery_data {
         struct completion trd_finishing;
 };
 
+#define OBD_LLOG_GROUP  0
+
+enum filter_groups {
+        FILTER_GROUP_LLOG = 1,
+        FILTER_GROUP_ECHO,
+        FILTER_GROUP_MDS0
+};
+
+struct obd_llog_group {
+        struct list_head   olg_list;
+        int                olg_group;
+        struct llog_ctxt  *olg_ctxts[LLOG_MAX_CTXTS];
+        cfs_waitq_t        olg_waitq;
+        spinlock_t         olg_lock;
+        struct obd_export *olg_exp;
+        int                olg_initializing;
+};
+
 /* corresponds to one of the obd's */
 #define MAX_OBD_NAME 128
 #define OBD_DEVICE_MAGIC        0XAB5CD6EF
@@ -882,11 +898,15 @@ struct obd_device {
         /* uuid-export hash body */
         struct lustre_class_hash_body *obd_uuid_hash_body;
         /* nid-export hash body */
-        struct lustre_class_hash_body *obd_nid_hash_body; 
-        atomic_t obd_refcount;
+        struct lustre_class_hash_body *obd_nid_hash_body;
+        /* nid stats body */
+        struct lustre_class_hash_body *obd_nid_stats_hash_body;
+        struct list_head        obd_nid_stats;
+        atomic_t                obd_refcount;
         cfs_waitq_t             obd_refcount_waitq;
         struct list_head        obd_exports;
         int                     obd_num_exports;
+        spinlock_t              obd_nid_lock;
         struct ldlm_namespace  *obd_namespace;
         struct ptlrpc_client    obd_ldlm_client; /* XXX OST/MDS only */
         /* a spinlock is OK for what we do now, may need a semaphore later */
@@ -898,7 +918,7 @@ struct obd_device {
         struct obd_statfs       obd_osfs;       /* locked by obd_osfs_lock */
         __u64                   obd_osfs_age;
         struct lvfs_run_ctxt    obd_lvfs_ctxt;
-        struct llog_ctxt        *obd_llog_ctxt[LLOG_MAX_CTXTS];
+        struct obd_llog_group   obd_olg; /* default llog group */
         struct obd_device       *obd_observer;
         struct obd_notify_upcall obd_upcall;
         struct obd_export       *obd_self_export;
@@ -921,8 +941,10 @@ struct obd_device {
         struct list_head                 obd_uncommitted_replies;
         spinlock_t                       obd_uncommitted_replies_lock;
         cfs_timer_t                      obd_recovery_timer;
-        time_t                           obd_recovery_start;
-        time_t                           obd_recovery_end;
+        time_t                           obd_recovery_start; /* seconds */
+        time_t                           obd_recovery_end; /* seconds, for lprocfs_status */
+        time_t                           obd_recovery_max_time; /* seconds, bz13079 */
+        int                              obd_recovery_timeout;
         
         /* new recovery stuff from CMD2 */
         struct target_recovery_data      obd_recovery_data;
@@ -954,12 +976,18 @@ struct obd_device {
         struct lprocfs_stats  *md_stats;
 
         cfs_proc_dir_entry_t  *obd_proc_entry;
-        cfs_proc_dir_entry_t  *obd_proc_exports;
+        cfs_proc_dir_entry_t  *obd_proc_exports_entry;
         cfs_proc_dir_entry_t  *obd_svc_procroot;
         struct lprocfs_stats  *obd_svc_stats;
-        struct semaphore       obd_proc_exp_sem;
         atomic_t               obd_evict_inprogress;
         cfs_waitq_t            obd_evict_inprogress_waitq;
+
+        /** 
+         * Ldlm pool part. Save last calculated SLV and Limit. 
+         */
+        rwlock_t               obd_pool_lock;
+        int                    obd_pool_limit;
+        __u64                  obd_pool_slv;
 };
 
 #define OBD_OPT_FORCE           0x0001
@@ -970,15 +998,8 @@ struct obd_device {
 enum obd_cleanup_stage {
 /* Special case hack for MDS LOVs */
         OBD_CLEANUP_EARLY,
-/* Precleanup stage 1, we must make sure all exports (other than the
-   self-export) get destroyed. */
+/* can be directly mapped to .ldto_device_fini() */
         OBD_CLEANUP_EXPORTS,
-/* Precleanup stage 2,  do other type-specific cleanup requiring the
-   self-export. */
-        OBD_CLEANUP_SELF_EXP,
-/* FIXME we should eliminate the "precleanup" function and make them stages
-   of the "cleanup" function. */
-        OBD_CLEANUP_OBD,
 };
 
 /* get/set_info keys */
@@ -995,9 +1016,34 @@ enum obd_cleanup_stage {
 #define KEY_REVIMP_UPD          "revimp_update"
 #define KEY_LOV_IDX             "lov_idx"
 #define KEY_LAST_ID             "last_id"
+#define KEY_READONLY            "read-only"
+#define KEY_LOCK_TO_STRIPE      "lock_to_stripe"
+#define KEY_CHECKSUM            "checksum"
+#define KEY_UNLINKED            "unlinked"
+#define KEY_EVICT_BY_NID        "evict_by_nid"
+#define KEY_REGISTER_TARGET     "register_target"
+#define KEY_SET_FS              "set_fs"
+#define KEY_CLEAR_FS            "clear_fs"
+#define KEY_BLOCKSIZE           "blocksize"
+#define KEY_BLOCKSIZE_BITS      "blocksize_bits"
+/* XXX unused ?*/
+#define KEY_INTERMDS            "inter_mds"
+#define KEY_ASYNC               "async"
 
 struct lu_context;
 
+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_READDIR | IT_GETATTR | IT_OPEN | IT_LOOKUP))
+                return LCK_CR;
+        LASSERTF(0, "Invalid it_op: %d\n", it->it_op);
+        return -EINVAL;
+}
+
 struct md_op_data {
         struct lu_fid           op_fid1; /* operation fid1 (usualy parent) */
         struct lu_fid           op_fid2; /* operation fid2 (usualy child) */
@@ -1041,6 +1087,22 @@ struct md_op_data {
         __u32                   op_opc;
 };
 
+struct md_enqueue_info;
+/* metadata stat-ahead */
+typedef int (* md_enqueue_cb_t)(struct ptlrpc_request *req,
+                                struct md_enqueue_info *minfo,
+                                int rc);
+
+struct md_enqueue_info {
+        struct md_op_data       mi_data;
+        struct lookup_intent    mi_it;
+        struct lustre_handle    mi_lockh;
+        struct dentry          *mi_dentry;
+        md_enqueue_cb_t         mi_cb;
+        unsigned int            mi_generation;
+        void                   *mi_cbdata;
+};
+
 struct obd_ops {
         struct module *o_owner;
         int (*o_iocontrol)(unsigned int cmd, struct obd_export *exp, int len,
@@ -1068,8 +1130,10 @@ struct obd_ops {
          * asked for. If @ocd == NULL, use default parameters. */
         int (*o_connect)(const struct lu_env *env,
                          struct lustre_handle *conn, struct obd_device *src,
-                         struct obd_uuid *cluuid, struct obd_connect_data *ocd);
-        int (*o_reconnect)(struct obd_export *exp, struct obd_device *src,
+                         struct obd_uuid *cluuid, struct obd_connect_data *ocd,
+                         void *localdata);
+        int (*o_reconnect)(const struct lu_env *env,
+                           struct obd_export *exp, struct obd_device *src,
                            struct obd_uuid *cluuid,
                            struct obd_connect_data *ocd);
         int (*o_disconnect)(struct obd_export *exp);
@@ -1089,7 +1153,7 @@ struct obd_ops {
         int (*o_fid_delete)(struct obd_export *exp, const struct lu_fid *fid);
 
         int (*o_statfs)(struct obd_device *obd, struct obd_statfs *osfs,
-                        __u64 max_age);
+                        __u64 max_age, __u32 flags);
         int (*o_statfs_async)(struct obd_device *obd, struct obd_info *oinfo,
                               __u64 max_age, struct ptlrpc_request_set *set);
         int (*o_packmd)(struct obd_export *exp, struct lov_mds_md **disk_tgt,
@@ -1101,7 +1165,7 @@ struct obd_ops {
         int (*o_preallocate)(struct lustre_handle *, obd_count *req,
                              obd_id *ids);
         /* FIXME: add fid capability support for create & destroy! */
-        int (*o_precreate)(struct obd_export *exp, int need_create);
+        int (*o_precreate)(struct obd_export *exp);
         int (*o_create)(struct obd_export *exp,  struct obdo *oa,
                         struct lov_stripe_md **ea, struct obd_trans_info *oti);
         int (*o_destroy)(struct obd_export *exp, struct obdo *oa,
@@ -1127,7 +1191,16 @@ struct obd_ops {
                                  struct lov_oinfo *loi,
                                  cfs_page_t *page, obd_off offset,
                                  struct obd_async_page_ops *ops, void *data,
-                                 void **res);
+                                 void **res, int nocache,
+                                 struct lustre_handle *lockh);
+        int (*o_reget_short_lock)(struct obd_export *exp,
+                                  struct lov_stripe_md *lsm,
+                                  void **res, int rw,
+                                  obd_off start, obd_off end,
+                                  void **cookie);
+        int (*o_release_short_lock)(struct obd_export *exp,
+                                    struct lov_stripe_md *lsm, obd_off end,
+                                    void *cookie, int rw);
         int (*o_queue_async_io)(struct obd_export *exp,
                                 struct lov_stripe_md *lsm,
                                 struct lov_oinfo *loi, void *cookie,
@@ -1198,7 +1271,7 @@ struct obd_ops {
                              int cmd, obd_off *);
 
         /* llog related obd_methods */
-        int (*o_llog_init)(struct obd_device *obd, struct obd_llogs *llog,
+        int (*o_llog_init)(struct obd_device *obd, struct obd_llog_group *grp,
                            struct obd_device *disk_obd, int count,
                            struct llog_catid *logid, struct obd_uuid *uuid);
         int (*o_llog_finish)(struct obd_device *obd, int count);
@@ -1222,6 +1295,17 @@ struct obd_ops {
         int (*o_quotactl)(struct obd_export *, struct obd_quotactl *);
 
         int (*o_ping)(struct obd_export *exp);
+
+        int (*o_register_page_removal_cb)(struct obd_export *exp,
+                                          obd_page_removal_cb_t cb,
+                                          obd_pin_extent_cb pin_cb);
+        int (*o_unregister_page_removal_cb)(struct obd_export *exp,
+                                            obd_page_removal_cb_t cb);
+        int (*o_register_lock_cancel_cb)(struct obd_export *exp,
+                                       obd_lock_cancel_cb cb);
+        int (*o_unregister_lock_cancel_cb)(struct obd_export *exp,
+                                         obd_lock_cancel_cb cb);
+
         /*
          * NOTE: If adding ops, add another LPROCFS_OBD_OP_INIT() line
          * to lprocfs_alloc_obd_stats() in obdclass/lprocfs_status.c.
@@ -1250,8 +1334,9 @@ enum {
 #define MEA_MAGIC_ALL_CHARS      0xb222a11c
 #define MEA_MAGIC_HASH_SEGMENT   0xb222a11b
 
-#define MAX_HASH_SIZE            0x7fffffffUL
-#define MAX_HASH_HIGHEST_BIT     0x10000000
+#define MAX_HASH_SIZE_32         0x7fffffffUL
+#define MAX_HASH_SIZE            0x7fffffffffffffffULL
+#define MAX_HASH_HIGHEST_BIT     0x1000000000000000
 
 struct lustre_md {
         struct mdt_body         *body;
@@ -1292,7 +1377,7 @@ struct md_ops {
                          struct ptlrpc_request **);
         int (*m_getattr_name)(struct obd_export *, const struct lu_fid *,
                               struct obd_capa *, const char *, int, obd_valid,
-                              int, struct ptlrpc_request **);
+                              int, __u32, struct ptlrpc_request **);
         int (*m_intent_lock)(struct obd_export *, struct md_op_data *,
                              void *, int, struct lookup_intent *, int,
                              struct ptlrpc_request **,
@@ -1319,7 +1404,7 @@ struct md_ops {
 
         int (*m_setxattr)(struct obd_export *, const struct lu_fid *,
                           struct obd_capa *, obd_valid, const char *,
-                          const char *, int, int, int,
+                          const char *, int, int, int, __u32,
                           struct ptlrpc_request **);
 
         int (*m_getxattr)(struct obd_export *, const struct lu_fid *,
@@ -1330,7 +1415,7 @@ struct md_ops {
         int (*m_init_ea_size)(struct obd_export *, int, int, int);
 
         int (*m_get_lustre_md)(struct obd_export *, struct ptlrpc_request *,
-                               int, struct obd_export *, struct obd_export *,
+                               struct obd_export *, struct obd_export *,
                                struct lustre_md *);
 
         int (*m_free_lustre_md)(struct obd_export *, struct lustre_md *);
@@ -1354,7 +1439,16 @@ struct md_ops {
                             renew_capa_cb_t cb);
 
         int (*m_get_remote_perm)(struct obd_export *, const struct lu_fid *,
-                                 struct obd_capa *, struct ptlrpc_request **);
+                                 struct obd_capa *, __u32,
+                                 struct ptlrpc_request **);
+
+        int (*m_intent_getattr_async)(struct obd_export *,
+                                      struct md_enqueue_info *,
+                                      struct ldlm_enqueue_info *);
+
+        int (*m_revalidate_lock)(struct obd_export *,
+                                 struct lookup_intent *,
+                                 struct lu_fid *);
 
         /*
          * NOTE: If adding ops, add another LPROCFS_MD_OP_INIT() line to
@@ -1406,15 +1500,18 @@ static inline void obd_transno_commit_cb(struct obd_device *obd, __u64 transno,
                                          int error)
 {
         if (error) {
-                CERROR("%s: transno "LPD64" commit error: %d\n",
+                CERROR("%s: transno "LPU64" commit error: %d\n",
                        obd->obd_name, transno, error);
                 return;
         }
-        CDEBUG(D_HA, "%s: transno "LPD64" committed\n",
-               obd->obd_name, transno);
         if (transno > obd->obd_last_committed) {
+                CDEBUG(D_HA, "%s: transno "LPD64" committed\n",
+                       obd->obd_name, transno);
                 obd->obd_last_committed = transno;
                 ptlrpc_commit_replies (obd);
+        } else {
+                CDEBUG(D_INFO, "%s: transno "LPD64" committed\n",
+                       obd->obd_name, transno);
         }
 }