Whamcloud - gitweb
LU-1187 mdt: Only create remote dir on MDT0
[fs/lustre-release.git] / lustre / mdt / mdt_internal.h
index b3e5a34..44a5d68 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, 2012, Whamcloud, Inc.
+ * Copyright (c) 2011, 2013, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -99,10 +99,10 @@ struct mdt_file_data {
 struct mdt_device {
         /* super-class */
         struct md_device           mdt_md_dev;
-       struct md_site             mdt_mite;
+       struct seq_server_site     mdt_seq_site;
         struct ptlrpc_service     *mdt_regular_service;
         struct ptlrpc_service     *mdt_readpage_service;
-        struct ptlrpc_service     *mdt_xmds_service;
+       struct ptlrpc_service     *mdt_out_service;
         struct ptlrpc_service     *mdt_setattr_service;
         struct ptlrpc_service     *mdt_mdsc_service;
         struct ptlrpc_service     *mdt_mdss_service;
@@ -159,8 +159,9 @@ struct mdt_device {
         cfs_timer_t                mdt_ck_timer;
         struct ptlrpc_thread       mdt_ck_thread;
         struct lustre_capa_key     mdt_capa_keys[2];
-        unsigned int               mdt_capa_conf:1,
-                                   mdt_som_conf:1;
+       unsigned int               mdt_capa_conf:1,
+                                  mdt_som_conf:1,
+                                  mdt_enable_remote_dir:1;
 
        /* statfs optimization: we cache a bit  */
        struct obd_statfs          mdt_osfs;
@@ -175,8 +176,6 @@ struct mdt_device {
         int                        mdt_nosquash_strlen;
        struct rw_semaphore        mdt_squash_sem;
 
-        cfs_proc_dir_entry_t      *mdt_proc_entry;
-        struct lprocfs_stats      *mdt_stats;
         int                        mdt_sec_level;
         struct rename_stats        mdt_rename_stats;
        struct lu_fid              mdt_md_root_fid;
@@ -245,6 +244,7 @@ enum {
         MDT_LH_PARENT, /* parent lockh */
         MDT_LH_CHILD,  /* child lockh */
         MDT_LH_OLD,    /* old lockh for rename */
+       MDT_LH_LAYOUT = MDT_LH_OLD, /* layout lock */
         MDT_LH_NEW,    /* new lockh for rename */
         MDT_LH_RMT,    /* used for return lh to caller */
         MDT_LH_NR
@@ -275,6 +275,57 @@ enum mdt_reint_flag {
         MRF_OPEN_TRUNC = 1 << 0,
 };
 
+struct mdt_thread_info;
+struct tx_arg;
+typedef int (*tx_exec_func_t)(struct mdt_thread_info *, struct thandle *,
+                             struct tx_arg *);
+
+struct tx_arg {
+       tx_exec_func_t          exec_fn;
+       tx_exec_func_t          undo_fn;
+       struct dt_object        *object;
+       char                    *file;
+       int                     line;
+       struct update_reply     *reply;
+       int                     index;
+       union {
+               struct {
+                       const struct dt_rec     *rec;
+                       const struct dt_key     *key;
+               } insert;
+               struct {
+               } ref;
+               struct {
+                       struct lu_attr  attr;
+               } attr_set;
+               struct {
+                       struct lu_buf   buf;
+                       const char      *name;
+                       int             flags;
+                       __u32           csum;
+               } xattr_set;
+               struct {
+                       struct lu_attr                  attr;
+                       struct dt_allocation_hint       hint;
+                       struct dt_object_format         dof;
+                       struct lu_fid                   fid;
+               } create;
+               struct {
+                       struct lu_buf   buf;
+                       loff_t          pos;
+               } write;
+       } u;
+};
+
+#define TX_MAX_OPS       10
+struct thandle_exec_args {
+       struct thandle          *ta_handle;
+       struct dt_device        *ta_dev;
+       int                     ta_err;
+       struct tx_arg           ta_args[TX_MAX_OPS];
+       int                     ta_argno;   /* used args */
+};
+
 /*
  * Common data shared by mdt-level handlers. This is allocated per-thread to
  * reduce stack consumption.
@@ -394,6 +445,14 @@ struct mdt_thread_info {
                         struct md_attr attr;
                         struct md_som_data data;
                 } som;
+               struct {
+                       struct dt_object_format mti_update_dof;
+                       struct update_reply     *mti_update_reply;
+                       struct update           *mti_update;
+                       int                     mti_update_reply_index;
+                       struct obdo             mti_obdo;
+                       struct dt_object        *mti_dt_object;
+               } update;
         } mti_u;
 
         /* IO epoch related stuff. */
@@ -413,6 +472,8 @@ struct mdt_thread_info {
        int                        mti_big_lmm_used;
        /* should be enough to fit lustre_mdt_attrs */
        char                       mti_xattr_buf[128];
+       struct thandle_exec_args   mti_handle;
+       struct ldlm_enqueue_info   mti_einfo;
 };
 
 /* ptlrpc request handler for MDT. All handlers are
@@ -536,9 +597,9 @@ static inline struct lu_site *mdt_lu_site(const struct mdt_device *mdt)
         return mdt->mdt_md_dev.md_lu_dev.ld_site;
 }
 
-static inline struct md_site *mdt_md_site(struct mdt_device *mdt)
+static inline struct seq_server_site *mdt_seq_site(struct mdt_device *mdt)
 {
-       return &mdt->mdt_mite;
+       return &mdt->mdt_seq_site;
 }
 
 static inline void mdt_export_evict(struct obd_export *exp)
@@ -569,6 +630,11 @@ int mdt_object_lock(struct mdt_thread_info *,
                     struct mdt_lock_handle *,
                     __u64, int);
 
+int mdt_object_lock_try(struct mdt_thread_info *,
+                       struct mdt_object *,
+                       struct mdt_lock_handle *,
+                       __u64, int);
+
 void mdt_object_unlock(struct mdt_thread_info *,
                        struct mdt_object *,
                        struct mdt_lock_handle *,
@@ -659,6 +725,8 @@ void mdt_mfd_free(struct mdt_file_data *mfd);
 int mdt_close(struct mdt_thread_info *info);
 int mdt_attr_set(struct mdt_thread_info *info, struct mdt_object *mo,
                  struct md_attr *ma, int flags);
+int mdt_add_dirty_flag(struct mdt_thread_info *info, struct mdt_object *mo,
+                       struct md_attr *ma);
 int mdt_done_writing(struct mdt_thread_info *info);
 int mdt_fix_reply(struct mdt_thread_info *info);
 int mdt_handle_last_unlink(struct mdt_thread_info *, struct mdt_object *,
@@ -719,6 +787,11 @@ int mdt_quota_dqacq(struct mdt_thread_info *info);
 extern struct lprocfs_vars lprocfs_mds_module_vars[];
 extern struct lprocfs_vars lprocfs_mds_obd_vars[];
 
+int mdt_hsm_attr_set(struct mdt_thread_info *info, struct mdt_object *obj,
+                    struct md_hsm *mh);
+
+struct mdt_handler *mdt_handler_find(__u32 opc,
+                                    struct mdt_opc_slice *supported);
 /* mdt_idmap.c */
 int mdt_init_sec_level(struct mdt_thread_info *);
 int mdt_init_idmap(struct mdt_thread_info *);
@@ -763,6 +836,15 @@ __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_hsm.c */
+int mdt_hsm_state_get(struct mdt_thread_info *info);
+int mdt_hsm_state_set(struct mdt_thread_info *info);
+int mdt_hsm_action(struct mdt_thread_info *info);
+int mdt_hsm_progress(struct mdt_thread_info *info);
+int mdt_hsm_ct_register(struct mdt_thread_info *info);
+int mdt_hsm_ct_unregister(struct mdt_thread_info *info);
+int mdt_hsm_request(struct mdt_thread_info *info);
+
 extern struct lu_context_key       mdt_thread_key;
 /* debug issues helper starts here*/
 static inline int mdt_fail_write(const struct lu_env *env,
@@ -920,9 +1002,6 @@ void mdt_rename_counter_tally(struct mdt_thread_info *info,
                              struct ptlrpc_request *req,
                              struct mdt_object *src, struct mdt_object *tgt);
 
-void mdt_time_start(const struct mdt_thread_info *info);
-void mdt_time_end(const struct mdt_thread_info *info, int idx);
-
 /* Capability */
 int mdt_ck_thread_start(struct mdt_device *mdt);
 void mdt_ck_thread_stop(struct mdt_device *mdt);
@@ -995,5 +1074,35 @@ static inline char *mdt_obd_name(struct mdt_device *mdt)
 int mds_mod_init(void);
 void mds_mod_exit(void);
 
+/* Update handlers */
+int out_handle(struct mdt_thread_info *info);
+
+#define out_tx_create(info, obj, attr, fid, dof, th, reply, idx) \
+       __out_tx_create(info, obj, attr, fid, dof, th, reply, idx, \
+                       __FILE__, __LINE__)
+
+#define out_tx_attr_set(info, obj, attr, th, reply, idx) \
+       __out_tx_attr_set(info, obj, attr, th, reply, idx, \
+                         __FILE__, __LINE__)
+
+#define out_tx_xattr_set(info, obj, buf, name, fl, th, reply, idx)     \
+       __out_tx_xattr_set(info, obj, buf, name, fl, th, reply, idx,    \
+                          __FILE__, __LINE__)
+
+#define out_tx_ref_add(info, obj, th, reply, idx) \
+       __out_tx_ref_add(info, obj, th, reply, idx, __FILE__, __LINE__)
+
+#define out_tx_ref_del(info, obj, th, reply, idx) \
+       __out_tx_ref_del(info, obj, th, reply, idx, __FILE__, __LINE__)
+
+#define out_tx_index_insert(info, obj, th, name, fid, reply, idx) \
+       __out_tx_index_insert(info, obj, th, name, fid, reply, idx, \
+                             __FILE__, __LINE__)
+
+#define out_tx_index_delete(info, obj, th, name, reply, idx) \
+       __out_tx_index_delete(info, obj, th, name, reply, idx, \
+                             __FILE__, __LINE__)
+
+
 #endif /* __KERNEL__ */
 #endif /* _MDT_H */