Whamcloud - gitweb
LU-7623 mdt: Match up prototype and definition of mdt_hsm_cdt_control_seq_write
[fs/lustre-release.git] / lustre / mdt / mdt_internal.h
index d0deb78..d6256fd 100644 (file)
@@ -27,7 +27,7 @@
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2011, 2014, Intel Corporation.
+ * Copyright (c) 2011, 2015, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
 #include <lustre_quota.h>
 #include <lustre_linkea.h>
 
-/* check if request's xid is equal to last one or not*/
-static inline int req_xid_is_last(struct ptlrpc_request *req)
-{
-        struct lsd_client_data *lcd = req->rq_export->exp_target_data.ted_lcd;
-        return (req->rq_xid == lcd->lcd_last_xid ||
-                req->rq_xid == lcd->lcd_last_close_xid);
-}
-
 struct mdt_object;
 
 /* file data for open files on MDS */
@@ -184,6 +176,7 @@ struct mdt_device {
                unsigned int       mo_user_xattr:1,
                                   mo_acl:1,
                                   mo_cos:1,
+                                  mo_evict_tgt_nids:1,
                                   mo_coordinator:1;
        } mdt_opts;
         /* mdt state flags */
@@ -200,18 +193,10 @@ struct mdt_device {
 
         struct upcall_cache        *mdt_identity_cache;
 
-       /* capability keys */
-       unsigned long              mdt_capa_timeout;
-       __u32                      mdt_capa_alg;
-       struct dt_object          *mdt_ck_obj;
-       unsigned long              mdt_ck_timeout;
-       unsigned long              mdt_ck_expiry;
-       struct timer_list          mdt_ck_timer;
-       struct ptlrpc_thread       mdt_ck_thread;
-       struct lustre_capa_key     mdt_capa_keys[2];
        unsigned int               mdt_capa_conf:1,
                                   /* Enable remote dir on non-MDT0 */
-                                  mdt_enable_remote_dir:1;
+                                  mdt_enable_remote_dir:1,
+                                  mdt_skip_lfsck:1;
 
        gid_t                      mdt_enable_remote_dir_gid;
        /* statfs optimization: we cache a bit  */
@@ -231,6 +216,12 @@ struct mdt_device {
        struct lu_device          *mdt_qmt_dev;
 
        struct coordinator         mdt_coordinator;
+
+       /* inter-MDT connection count */
+       atomic_t                   mdt_mds_mds_conns;
+
+       /* MDT device async commit count, used for debug and sanity test */
+       atomic_t                   mdt_async_commit_count;
 };
 
 #define MDT_SERVICE_WATCHDOG_FACTOR    (2)
@@ -257,21 +248,21 @@ struct mdt_object {
 };
 
 struct mdt_lock_handle {
-        /* Lock type, reg for cross-ref use or pdo lock. */
-        mdl_type_t              mlh_type;
+       /* Lock type, reg for cross-ref use or pdo lock. */
+       mdl_type_t              mlh_type;
 
-        /* Regular lock */
-        struct lustre_handle    mlh_reg_lh;
-        ldlm_mode_t             mlh_reg_mode;
+       /* Regular lock */
+       struct lustre_handle    mlh_reg_lh;
+       enum ldlm_mode          mlh_reg_mode;
 
-        /* Pdirops lock */
-        struct lustre_handle    mlh_pdo_lh;
-        ldlm_mode_t             mlh_pdo_mode;
-        unsigned int            mlh_pdo_hash;
+       /* Pdirops lock */
+       struct lustre_handle    mlh_pdo_lh;
+       enum ldlm_mode          mlh_pdo_mode;
+       unsigned int            mlh_pdo_hash;
 
        /* Remote regular lock */
-       struct lustre_handle    mlh_rreg_lh;
-       ldlm_mode_t          mlh_rreg_mode;
+       struct lustre_handle    mlh_rreg_lh;
+       enum ldlm_mode          mlh_rreg_mode;
 };
 
 enum {
@@ -401,19 +392,16 @@ struct mdt_thread_info {
          * They should be initialized explicitly by the user themselves.
          */
 
-         /* XXX: If something is in a union, make sure they do not conflict */
-
-        struct lu_fid              mti_tmp_fid1;
-        struct lu_fid              mti_tmp_fid2;
-        ldlm_policy_data_t         mti_policy;    /* for mdt_object_lock() and
-                                                   * mdt_rename_lock() */
-        struct ldlm_res_id         mti_res_id;    /* for mdt_object_lock() and
-                                                     mdt_rename_lock()   */
-        union {
-                struct obd_uuid    uuid[2];       /* for mdt_seq_init_cli()  */
-                char               ns_name[48];   /* for mdt_init0()         */
-                struct lustre_cfg_bufs bufs;      /* for mdt_stack_fini()    */
-               struct obd_statfs  osfs;          /* for mdt_statfs()        */
+       /* XXX: If something is in a union, make sure they do not conflict */
+       struct lu_fid                   mti_tmp_fid1;
+       struct lu_fid                   mti_tmp_fid2;
+       union ldlm_policy_data          mti_policy; /* for mdt_object_lock() */
+       struct ldlm_res_id              mti_res_id; /* and mdt_rename_lock() */
+       union {
+               struct obd_uuid         uuid[2];    /* for mdt_seq_init_cli() */
+               char                    ns_name[48];/* for mdt_init0()        */
+               struct lustre_cfg_bufs  bufs;       /* for mdt_stack_fini()   */
+               struct obd_statfs       osfs;       /* for mdt_statfs()       */
                 struct {
                         /* for mdt_readpage()      */
                         struct lu_rdpg     mti_rdpg;
@@ -429,11 +417,10 @@ struct mdt_thread_info {
        loff_t                     mti_off;
        struct lu_buf              mti_buf;
        struct lu_buf              mti_big_buf;
-       struct lustre_capa_key     mti_capa_key;
 
         /* Ops object filename */
         struct lu_name             mti_name;
-       /* per-thread values, can be re-used */
+       /* per-thread values, can be re-used, may be vmalloc'd */
        void                      *mti_big_lmm;
        int                        mti_big_lmmsize;
        /* big_lmm buffer was used and must be used in reply */
@@ -441,6 +428,7 @@ struct mdt_thread_info {
        /* should be enough to fit lustre_mdt_attrs */
        char                       mti_xattr_buf[128];
        struct ldlm_enqueue_info   mti_einfo;
+       struct tg_reply_data      *mti_reply_data;
 };
 
 extern struct lu_context_key mdt_thread_key;
@@ -584,43 +572,41 @@ static inline bool mdt_is_striped_client(struct obd_export *exp)
        return exp_connect_flags(exp) & OBD_CONNECT_DIR_STRIPE;
 }
 
-int mdt_get_disposition(struct ldlm_reply *rep, int flag);
+__u64 mdt_get_disposition(struct ldlm_reply *rep, __u64 op_flag);
 void mdt_set_disposition(struct mdt_thread_info *info,
-                        struct ldlm_reply *rep, int flag);
+                        struct ldlm_reply *rep, __u64 op_flag);
 void mdt_clear_disposition(struct mdt_thread_info *info,
-                        struct ldlm_reply *rep, int flag);
+                          struct ldlm_reply *rep, __u64 op_flag);
 
-void mdt_lock_pdo_init(struct mdt_lock_handle *lh,
-                      ldlm_mode_t lock_mode,
+void mdt_lock_pdo_init(struct mdt_lock_handle *lh, enum ldlm_mode lock_mode,
                       const struct lu_name *lname);
 
-void mdt_lock_reg_init(struct mdt_lock_handle *lh,
-                       ldlm_mode_t lm);
+void mdt_lock_reg_init(struct mdt_lock_handle *lh, enum ldlm_mode lm);
 
-int mdt_lock_setup(struct mdt_thread_info *info,
-                   struct mdt_object *o,
-                   struct mdt_lock_handle *lh);
+int mdt_lock_setup(struct mdt_thread_info *info, struct mdt_object *mo,
+                  struct mdt_lock_handle *lh);
 
-int mdt_check_resent_lock(struct mdt_thread_info *info,
-                         struct mdt_object *mo,
+int mdt_check_resent_lock(struct mdt_thread_info *info, struct mdt_object *mo,
                          struct mdt_lock_handle *lhc);
 
-int mdt_object_lock(struct mdt_thread_info *,
-                    struct mdt_object *,
-                    struct mdt_lock_handle *,
-                    __u64, int);
+int mdt_object_lock(struct mdt_thread_info *info, struct mdt_object *mo,
+                   struct mdt_lock_handle *lh, __u64 ibits);
+
+int mdt_reint_object_lock(struct mdt_thread_info *info, struct mdt_object *o,
+                         struct mdt_lock_handle *lh, __u64 ibits,
+                         bool cos_incompat);
 
-int mdt_object_lock_try(struct mdt_thread_info *,
-                       struct mdt_object *,
-                       struct mdt_lock_handle *,
-                       __u64, int);
+int mdt_object_lock_try(struct mdt_thread_info *info, struct mdt_object *mo,
+                       struct mdt_lock_handle *lh, __u64 ibits);
 
-void mdt_object_unlock(struct mdt_thread_info *,
-                       struct mdt_object *,
-                       struct mdt_lock_handle *,
-                       int decref);
+int mdt_reint_object_lock_try(struct mdt_thread_info *info,
+                             struct mdt_object *o, struct mdt_lock_handle *lh,
+                             __u64 ibits, bool cos_incompat);
 
-struct mdt_object *mdt_object_new(const struct lu_env *,
+void mdt_object_unlock(struct mdt_thread_info *info, struct mdt_object *mo,
+                      struct mdt_lock_handle *lh, int decref);
+
+struct mdt_object *mdt_object_new(const struct lu_env *env,
                                  struct mdt_device *,
                                  const struct lu_fid *);
 struct mdt_object *mdt_object_find(const struct lu_env *,
@@ -640,7 +626,7 @@ void mdt_client_compatibility(struct mdt_thread_info *info);
 int mdt_remote_object_lock(struct mdt_thread_info *mti,
                           struct mdt_object *o, const struct lu_fid *fid,
                           struct lustre_handle *lh,
-                          ldlm_mode_t mode, __u64 ibits);
+                          enum ldlm_mode mode, __u64 ibits, bool nonblock);
 
 enum mdt_name_flags {
        MNF_FIX_ANON = 1,
@@ -727,6 +713,7 @@ void mdt_dump_lmv(unsigned int level, const union lmv_mds_md *lmv);
 bool allow_client_chgrp(struct mdt_thread_info *info, struct lu_ucred *uc);
 int mdt_check_ucred(struct mdt_thread_info *);
 int mdt_init_ucred(struct mdt_thread_info *, struct mdt_body *);
+int mdt_init_ucred_intent_getattr(struct mdt_thread_info *, struct mdt_body *);
 int mdt_init_ucred_reint(struct mdt_thread_info *);
 void mdt_exit_ucred(struct mdt_thread_info *);
 int mdt_version_get_check(struct mdt_thread_info *, struct mdt_object *, int);
@@ -746,6 +733,8 @@ int mdt_remote_blocking_ast(struct ldlm_lock *lock, struct ldlm_lock_desc *desc,
 int mdt_links_read(struct mdt_thread_info *info,
                   struct mdt_object *mdt_obj,
                   struct linkea_data *ldata);
+int mdt_close_internal(struct mdt_thread_info *info, struct ptlrpc_request *req,
+                      struct mdt_body *repbody);
 /* mdt_idmap.c */
 int mdt_init_idmap(struct tgt_session_info *tsi);
 void mdt_cleanup_idmap(struct mdt_export_data *);
@@ -795,7 +784,7 @@ __u32 mdt_identity_get_perm(struct md_identity *, __u32, lnet_nid_t);
 int mdt_pack_remote_perm(struct mdt_thread_info *, struct mdt_object *, void *);
 
 /* mdt/mdt_recovery.c */
-void mdt_req_from_lcd(struct ptlrpc_request *req, struct lsd_client_data *lcd);
+__u64 mdt_req_from_lrd(struct ptlrpc_request *req, struct tg_reply_data *trd);
 
 /* mdt/mdt_hsm.c */
 int mdt_hsm_state_get(struct tgt_session_info *tsi);
@@ -878,8 +867,9 @@ int mdt_hsm_cdt_fini(struct mdt_device *mdt);
 int mdt_hsm_cdt_wakeup(struct mdt_device *mdt);
 
 /* coordinator control /proc interface */
-ssize_t mdt_hsm_cdt_control_seq_write(struct file *file, const char *buffer,
-                                       size_t count, loff_t *off);
+ssize_t mdt_hsm_cdt_control_seq_write(struct file *file,
+                                     const char __user *buffer,
+                                     size_t count, loff_t *off);
 int mdt_hsm_cdt_control_seq_show(struct seq_file *m, void *data);
 int hsm_cdt_procfs_init(struct mdt_device *mdt);
 void hsm_cdt_procfs_fini(struct mdt_device *mdt);
@@ -898,6 +888,9 @@ int mdt_hsm_update_request_state(struct mdt_thread_info *mti,
                                 struct hsm_progress_kernel *pgs,
                                 const int update_record);
 
+int mdt_close_swap_layouts(struct mdt_thread_info *info,
+                          struct mdt_object *o, struct md_attr *ma);
+
 extern struct lu_context_key       mdt_thread_key;
 
 /* debug issues helper starts here*/
@@ -930,18 +923,27 @@ static inline int mdt_check_resent(struct mdt_thread_info *info,
                                    mdt_reconstruct_t reconstruct,
                                    struct mdt_lock_handle *lhc)
 {
-        struct ptlrpc_request *req = mdt_info_req(info);
-        ENTRY;
-
-        if (lustre_msg_get_flags(req->rq_reqmsg) & MSG_RESENT) {
-                if (req_xid_is_last(req)) {
-                        reconstruct(info, lhc);
-                        RETURN(1);
-                }
-                DEBUG_REQ(D_HA, req, "no reply for RESENT req (have "LPD64")",
-                          req->rq_export->exp_target_data.ted_lcd->lcd_last_xid);
-        }
-        RETURN(0);
+       struct ptlrpc_request *req = mdt_info_req(info);
+       int rc = 0;
+       ENTRY;
+
+       if (lustre_msg_get_flags(req->rq_reqmsg) & MSG_RESENT) {
+               OBD_ALLOC_PTR(info->mti_reply_data);
+               if (info->mti_reply_data == NULL)
+                       RETURN(-ENOMEM);
+
+               if (req_can_reconstruct(req, info->mti_reply_data)) {
+                       reconstruct(info, lhc);
+                       rc = 1;
+               } else {
+                       DEBUG_REQ(D_HA, req,
+                                 "no reply data found for RESENT req");
+                       rc = 0;
+               }
+               OBD_FREE_PTR(info->mti_reply_data);
+               info->mti_reply_data = NULL;
+       }
+       RETURN(rc);
 }
 
 struct lu_ucred *mdt_ucred(const struct mdt_thread_info *info);
@@ -956,43 +958,46 @@ int mdt_blocking_ast(struct ldlm_lock*, struct ldlm_lock_desc*, void*, int);
 
 /* Issues dlm lock on passed @ns, @f stores it lock handle into @lh. */
 static inline int mdt_fid_lock(struct ldlm_namespace *ns,
-                               struct lustre_handle *lh,
-                               ldlm_mode_t mode,
-                               ldlm_policy_data_t *policy,
-                               const struct ldlm_res_id *res_id,
+                              struct lustre_handle *lh, enum ldlm_mode mode,
+                              union ldlm_policy_data *policy,
+                              const struct ldlm_res_id *res_id,
                               __u64 flags, const __u64 *client_cookie)
 {
-        int rc;
+       int rc;
 
-        LASSERT(ns != NULL);
-        LASSERT(lh != NULL);
+       LASSERT(ns != NULL);
+       LASSERT(lh != NULL);
 
-        rc = ldlm_cli_enqueue_local(ns, res_id, LDLM_IBITS, policy,
-                                    mode, &flags, mdt_blocking_ast,
-                                    ldlm_completion_ast, NULL, NULL, 0,
+       rc = ldlm_cli_enqueue_local(ns, res_id, LDLM_IBITS, policy,
+                                   mode, &flags, mdt_blocking_ast,
+                                   ldlm_completion_ast, NULL, NULL, 0,
                                    LVB_T_NONE, client_cookie, lh);
-        return rc == ELDLM_OK ? 0 : -EIO;
+       return rc == ELDLM_OK ? 0 : -EIO;
 }
 
-static inline void mdt_fid_unlock(struct lustre_handle *lh,
-                                  ldlm_mode_t mode)
+static inline void mdt_fid_unlock(struct lustre_handle *lh, enum ldlm_mode mode)
 {
-        ldlm_lock_decref(lh, mode);
+       ldlm_lock_decref(lh, mode);
+}
+
+static inline bool mdt_slc_is_enabled(struct mdt_device *mdt)
+{
+       return mdt->mdt_lut.lut_sync_lock_cancel == BLOCKING_SYNC_ON_CANCEL;
 }
 
 extern mdl_mode_t mdt_mdl_lock_modes[];
-extern ldlm_mode_t mdt_dlm_lock_modes[];
+extern enum ldlm_mode mdt_dlm_lock_modes[];
 
-static inline mdl_mode_t mdt_dlm_mode2mdl_mode(ldlm_mode_t mode)
+static inline mdl_mode_t mdt_dlm_mode2mdl_mode(enum ldlm_mode mode)
 {
-        LASSERT(IS_PO2(mode));
-        return mdt_mdl_lock_modes[mode];
+       LASSERT(IS_PO2(mode));
+       return mdt_mdl_lock_modes[mode];
 }
 
-static inline ldlm_mode_t mdt_mdl_mode2dlm_mode(mdl_mode_t mode)
+static inline enum ldlm_mode mdt_mdl_mode2dlm_mode(mdl_mode_t mode)
 {
-        LASSERT(IS_PO2(mode));
-        return mdt_dlm_lock_modes[mode];
+       LASSERT(IS_PO2(mode));
+       return mdt_dlm_lock_modes[mode];
 }
 
 /* mdt_lvb.c */
@@ -1034,15 +1039,6 @@ void mdt_rename_counter_tally(struct mdt_thread_info *info,
                              struct ptlrpc_request *req,
                              struct mdt_object *src, struct mdt_object *tgt);
 
-/* Capability */
-int mdt_ck_thread_start(struct mdt_device *mdt);
-void mdt_ck_thread_stop(struct mdt_device *mdt);
-void mdt_ck_timer_callback(unsigned long castmeharder);
-int mdt_capa_keys_init(const struct lu_env *env, struct mdt_device *mdt);
-void mdt_set_capainfo(struct mdt_thread_info *info, int offset,
-                     const struct lu_fid *fid, struct lustre_capa *capa);
-void mdt_dump_capainfo(struct mdt_thread_info *info);
-
 static inline struct obd_device *mdt2obd_dev(const struct mdt_device *mdt)
 {
        return mdt->mdt_lu_dev.ld_obd;