Whamcloud - gitweb
LU-6245 libcfs: replace IS_PO2 with is_power_of_2 in server code
[fs/lustre-release.git] / lustre / mdt / mdt_internal.h
index 824021e..7b90b58 100644 (file)
  *
  * You should have received a copy of the GNU General Public License
  * version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
+ * http://www.gnu.org/licenses/gpl-2.0.html
  *
  * GPL HEADER END
  */
@@ -27,7 +23,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, 2016, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -109,7 +105,8 @@ enum cdt_states { CDT_STOPPED = 0,
  * cdt_request_lock
  */
 struct coordinator {
-       struct ptlrpc_thread     cdt_thread;         /**< coordinator thread */
+       wait_queue_head_t        cdt_waitq;          /**< cdt wait queue */
+       unsigned int             cdt_flags;          /**< cdt event flags */
        struct lu_env            cdt_env;            /**< coordinator lustre
                                                      * env */
        struct lu_context        cdt_session;        /** session for lu_ucred */
@@ -176,6 +173,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 */
@@ -194,13 +192,17 @@ struct mdt_device {
 
        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;
+
+       /* lock for osfs and md_root */
+       spinlock_t                 mdt_lock;
+
        /* statfs optimization: we cache a bit  */
        struct obd_statfs          mdt_osfs;
        __u64                      mdt_osfs_age;
-       spinlock_t                 mdt_osfs_lock;
 
         /* root squash */
        struct root_squash_info    mdt_squash;
@@ -214,20 +216,25 @@ 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;
+
+       struct mdt_object         *mdt_md_root;
 };
 
 #define MDT_SERVICE_WATCHDOG_FACTOR    (2)
 #define MDT_COS_DEFAULT         (0)
 
-enum mdt_object_flags {
-       /** lov object has been created. */
-       MOF_LOV_CREATED         = 1 << 0,
-};
-
 struct mdt_object {
        struct lu_object_header mot_header;
        struct lu_object        mot_obj;
-       enum mdt_object_flags   mot_flags;
+       unsigned int            mot_lov_created:1,  /* lov object created */
+                               mot_cache_attr:1;   /* enable remote object
+                                                    * attribute cache */
        int                     mot_write_count;
        spinlock_t              mot_write_lock;
         /* Lock to protect create_data */
@@ -240,21 +247,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 {
@@ -384,19 +391,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;
@@ -415,7 +419,7 @@ struct mdt_thread_info {
 
         /* 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 */
@@ -573,10 +577,10 @@ void mdt_set_disposition(struct mdt_thread_info *info,
 void mdt_clear_disposition(struct mdt_thread_info *info,
                           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 *mo,
                   struct mdt_lock_handle *lh);
@@ -587,9 +591,17 @@ int mdt_check_resent_lock(struct mdt_thread_info *info, struct mdt_object *mo,
 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 *info, struct mdt_object *mo,
                        struct mdt_lock_handle *lh, __u64 ibits);
 
+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);
+
 void mdt_object_unlock(struct mdt_thread_info *info, struct mdt_object *mo,
                       struct mdt_lock_handle *lh, int decref);
 
@@ -613,7 +625,8 @@ 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, bool nonblock);
+                          enum ldlm_mode mode, __u64 ibits, bool nonblock,
+                          bool cache);
 
 enum mdt_name_flags {
        MNF_FIX_ANON = 1,
@@ -722,17 +735,6 @@ int mdt_links_read(struct mdt_thread_info *info,
                   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 *);
-int mdt_handle_idmap(struct tgt_session_info *tsi);
-int ptlrpc_user_desc_do_idmap(struct ptlrpc_request *,
-                              struct ptlrpc_user_desc *);
-void mdt_body_reverse_idmap(struct mdt_thread_info *,
-                            struct mdt_body *);
-int mdt_remote_perm_reverse_idmap(struct ptlrpc_request *,
-                                  struct mdt_remote_perm *);
-int mdt_fix_attr_ucred(struct mdt_thread_info *, __u32);
 
 static inline struct mdt_device *mdt_dev(struct lu_device *d)
 {
@@ -755,6 +757,12 @@ static inline struct dt_object *mdt_obj2dt(struct mdt_object *mo)
        return lu2dt(lo);
 }
 
+static inline bool agent_req_in_final_state(enum agent_req_status ars)
+{
+       return ((ars == ARS_SUCCEED) || (ars == ARS_FAILED) ||
+               (ars == ARS_CANCELED));
+}
+
 /* mdt/mdt_identity.c */
 #define MDT_IDENTITY_UPCALL_PATH        "/usr/sbin/l_getidentity"
 
@@ -766,9 +774,7 @@ void mdt_identity_put(struct upcall_cache *, struct md_identity *);
 
 void mdt_flush_identity(struct upcall_cache *, int);
 
-__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 *);
+__u32 mdt_identity_get_perm(struct md_identity *, lnet_nid_t);
 
 /* mdt/mdt_recovery.c */
 __u64 mdt_req_from_lrd(struct ptlrpc_request *req, struct tg_reply_data *trd);
@@ -794,9 +800,6 @@ int mdt_agent_record_add(const struct lu_env *env, struct mdt_device *mdt,
 int mdt_agent_record_update(const struct lu_env *env,
                            struct mdt_device *mdt, __u64 *cookies,
                            int cookies_count, enum agent_req_status status);
-int mdt_agent_llog_update_rec(const struct lu_env *env, struct mdt_device *mdt,
-                             struct llog_handle *llh,
-                             struct llog_agent_req_rec *larr);
 
 /* mdt/mdt_hsm_cdt_agent.c */
 extern const struct file_operations mdt_hsm_agent_fops;
@@ -819,7 +822,7 @@ int mdt_hsm_coordinator_update(struct mdt_thread_info *mti,
                               struct hsm_progress_kernel *pgs);
 /* mdt/mdt_hsm_cdt_client.c */
 int mdt_hsm_add_actions(struct mdt_thread_info *info,
-                       struct hsm_action_list *hal, __u64 *compound_id);
+                       struct hsm_action_list *hal);
 int mdt_hsm_get_actions(struct mdt_thread_info *mti,
                        struct hsm_action_list *hal);
 int mdt_hsm_get_running(struct mdt_thread_info *mti,
@@ -846,16 +849,18 @@ int mdt_cdt_remove_request(struct coordinator *cdt, __u64 cookie);
 /* mdt/mdt_coordinator.c */
 void mdt_hsm_dump_hal(int level, const char *prefix,
                      struct hsm_action_list *hal);
+struct cdt_restore_handle *mdt_hsm_restore_hdl_find(struct coordinator *cdt,
+                                               const struct lu_fid *fid);
 /* coordinator management */
 int mdt_hsm_cdt_init(struct mdt_device *mdt);
-int mdt_hsm_cdt_start(struct mdt_device *mdt);
 int mdt_hsm_cdt_stop(struct mdt_device *mdt);
 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);
@@ -883,14 +888,14 @@ extern struct lu_context_key       mdt_thread_key;
 static inline int mdt_fail_write(const struct lu_env *env,
                                  struct dt_device *dd, int id)
 {
-        if (OBD_FAIL_CHECK_ORSET(id, OBD_FAIL_ONCE)) {
-                CERROR(LUSTRE_MDT_NAME": cfs_fail_loc=%x, fail write ops\n",
-                       id);
-                return dd->dd_ops->dt_ro(env, dd);
-                /* We set FAIL_ONCE because we never "un-fail" a device */
-        }
-
-        return 0;
+       if (OBD_FAIL_CHECK_ORSET(id, OBD_FAIL_ONCE)) {
+               CERROR(LUSTRE_MDT_NAME": cfs_fail_loc=%x, fail write ops\n",
+                      id);
+               return dt_ro(env, dd);
+               /* We set FAIL_ONCE because we never "un-fail" a device */
+       }
+
+       return 0;
 }
 
 static inline struct mdt_export_data *mdt_req2med(struct ptlrpc_request *req)
@@ -944,43 +949,48 @@ 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[];
+
+/* LCK_MINMODE which is zero returns false for is_power_of_2 */
 
-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(mode == LCK_MINMODE || is_power_of_2(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(mode == MDL_MINMODE || is_power_of_2(mode));
+       return mdt_dlm_lock_modes[mode];
 }
 
 /* mdt_lvb.c */