Whamcloud - gitweb
LU-2739 mdt: Deny non-DNE client to access remote directory
[fs/lustre-release.git] / lustre / mdt / mdt_internal.h
index b990ba9..664940c 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;
@@ -119,17 +119,17 @@ struct mdt_device {
        struct obd_export         *mdt_bottom_exp;
         /** target device */
         struct lu_target           mdt_lut;
-        /*
-         * Options bit-fields.
-         */
-        struct {
-                signed int         mo_user_xattr :1,
-                                   mo_acl        :1,
-                                   mo_compat_resname:1,
-                                   mo_mds_capa   :1,
-                                   mo_oss_capa   :1,
-                                   mo_cos        :1;
-        } mdt_opts;
+       /*
+        * Options bit-fields.
+        */
+       struct {
+               unsigned int       mo_user_xattr:1,
+                                  mo_acl:1,
+                                  mo_compat_resname:1,
+                                  mo_mds_capa:1,
+                                  mo_oss_capa:1,
+                                  mo_cos:1;
+       } mdt_opts;
         /* mdt state flags */
         unsigned long              mdt_state;
         /* lock to protect IOepoch */
@@ -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;
@@ -187,11 +186,11 @@ struct mdt_device {
        struct lu_device          *mdt_qmt_dev;
 };
 
-#define MDT_SERVICE_WATCHDOG_FACTOR     (2)
-#define MDT_ROCOMPAT_SUPP       (OBD_ROCOMPAT_LOVOBJID)
-#define MDT_INCOMPAT_SUPP       (OBD_INCOMPAT_MDT | OBD_INCOMPAT_COMMON_LR | \
-                                 OBD_INCOMPAT_FID | OBD_INCOMPAT_IAM_DIR | \
-                                 OBD_INCOMPAT_LMM_VER | OBD_INCOMPAT_MULTI_OI)
+#define MDT_SERVICE_WATCHDOG_FACTOR    (2)
+#define MDT_ROCOMPAT_SUPP      (OBD_ROCOMPAT_LOVOBJID)
+#define MDT_INCOMPAT_SUPP      (OBD_INCOMPAT_MDT | OBD_INCOMPAT_COMMON_LR | \
+                               OBD_INCOMPAT_FID | OBD_INCOMPAT_IAM_DIR | \
+                               OBD_INCOMPAT_LMM_VER | OBD_INCOMPAT_MULTI_OI)
 #define MDT_COS_DEFAULT         (0)
 
 struct mdt_object {
@@ -239,12 +238,17 @@ struct mdt_lock_handle {
         struct lustre_handle    mlh_pdo_lh;
         ldlm_mode_t             mlh_pdo_mode;
         unsigned int            mlh_pdo_hash;
+
+       /* Remote regular lock */
+       struct lustre_handle    mlh_rreg_lh;
+       ldlm_mode_t          mlh_rreg_mode;
 };
 
 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 +279,60 @@ 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;
+               struct {
+                       struct ost_body     *body;
+               } destroy;
+       } 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 +452,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 +479,63 @@ 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
+ * grouped into several slices - struct mdt_opc_slice,
+ * and stored in an array - mdt_handlers[].
+ */
+struct mdt_handler {
+       /* The name of this handler. */
+       const char *mh_name;
+       /* Fail id for this handler, checked at the beginning of this handler*/
+       int      mh_fail_id;
+       /* Operation code for this handler */
+       __u32       mh_opc;
+       /* flags are listed in enum mdt_handler_flags below. */
+       __u32       mh_flags;
+       /* The actual handler function to execute. */
+       int (*mh_act)(struct mdt_thread_info *info);
+       /* Request format for this request. */
+       const struct req_format *mh_fmt;
+};
+
+enum mdt_handler_flags {
+       /*
+        * struct mdt_body is passed in the incoming message, and object
+        * identified by this fid exists on disk.
+        *
+        * "habeo corpus" == "I have a body"
+        */
+       HABEO_CORPUS = (1 << 0),
+       /*
+        * struct ldlm_request is passed in the incoming message.
+        *
+        * "habeo clavis" == "I have a key"
+        */
+       HABEO_CLAVIS = (1 << 1),
+       /*
+        * this request has fixed reply format, so that reply message can be
+        * packed by generic code.
+        *
+        * "habeo refero" == "I have a reply"
+        */
+       HABEO_REFERO = (1 << 2),
+       /*
+        * this request will modify something, so check whether the filesystem
+        * is readonly or not, then return -EROFS to client asap if necessary.
+        *
+        * "mutabor" == "I shall modify"
+        */
+       MUTABOR      = (1 << 3)
+};
+
+struct mdt_opc_slice {
+       __u32                   mos_opc_start;
+       int                     mos_opc_end;
+       struct mdt_handler      *mos_hs;
 };
 
 static inline const struct md_device_operations *
@@ -441,8 +564,8 @@ static inline int req_is_replay(struct ptlrpc_request *req)
 
 static inline __u64 mdt_conn_flags(struct mdt_thread_info *info)
 {
-        LASSERT(info->mti_exp);
-        return info->mti_exp->exp_connect_flags;
+       LASSERT(info->mti_exp);
+       return exp_connect_flags(info->mti_exp);
 }
 
 static inline void mdt_object_get(const struct lu_env *env,
@@ -466,6 +589,11 @@ static inline int mdt_object_exists(const struct mdt_object *o)
         return lu_object_exists(&o->mot_obj.mo_lu);
 }
 
+static inline int mdt_object_remote(const struct mdt_object *o)
+{
+       return lu_object_remote(&o->mot_obj.mo_lu);
+}
+
 static inline const struct lu_fid *mdt_object_fid(const struct mdt_object *o)
 {
         return lu_object_fid(&o->mot_obj.mo_lu);
@@ -481,9 +609,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)
@@ -492,6 +620,13 @@ static inline void mdt_export_evict(struct obd_export *exp)
         class_export_put(exp);
 }
 
+/* Here we use LVB_TYPE to check dne client, because it is
+ * also landed on 2.4. */
+static inline int mdt_is_dne_client(struct obd_export *exp)
+{
+       return !!(exp_connect_flags(exp) & OBD_CONNECT_LVB_TYPE);
+}
+
 int mdt_get_disposition(struct ldlm_reply *rep, int flag);
 void mdt_set_disposition(struct mdt_thread_info *info,
                         struct ldlm_reply *rep, int flag);
@@ -514,6 +649,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 *,
@@ -536,6 +676,9 @@ void mdt_object_unlock_put(struct mdt_thread_info *,
 
 void mdt_client_compatibility(struct mdt_thread_info *info);
 
+int mdt_remote_object_lock(struct mdt_thread_info *mti,
+                          struct mdt_object *o, struct lustre_handle *lh,
+                          ldlm_mode_t mode, __u64 ibits);
 int mdt_close_unpack(struct mdt_thread_info *info);
 int mdt_reint_unpack(struct mdt_thread_info *info, __u32 op);
 int mdt_reint_rec(struct mdt_thread_info *, struct mdt_lock_handle *);
@@ -604,6 +747,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 *,
@@ -624,7 +769,52 @@ int mdt_version_get_check(struct mdt_thread_info *, struct mdt_object *, int);
 void mdt_version_get_save(struct mdt_thread_info *, struct mdt_object *, int);
 int mdt_version_get_check_save(struct mdt_thread_info *, struct mdt_object *,
                                int);
-
+int mdt_handle_common(struct ptlrpc_request *req,
+                     struct mdt_opc_slice *supported);
+int mdt_connect(struct mdt_thread_info *info);
+int mdt_disconnect(struct mdt_thread_info *info);
+int mdt_set_info(struct mdt_thread_info *info);
+int mdt_get_info(struct mdt_thread_info *info);
+int mdt_getstatus(struct mdt_thread_info *info);
+int mdt_getattr(struct mdt_thread_info *info);
+int mdt_getattr_name(struct mdt_thread_info *info);
+int mdt_statfs(struct mdt_thread_info *info);
+int mdt_reint(struct mdt_thread_info *info);
+int mdt_sync(struct mdt_thread_info *info);
+int mdt_is_subdir(struct mdt_thread_info *info);
+int mdt_obd_ping(struct mdt_thread_info *info);
+int mdt_obd_log_cancel(struct mdt_thread_info *info);
+int mdt_obd_qc_callback(struct mdt_thread_info *info);
+int mdt_enqueue(struct mdt_thread_info *info);
+int mdt_convert(struct mdt_thread_info *info);
+int mdt_bl_callback(struct mdt_thread_info *info);
+int mdt_cp_callback(struct mdt_thread_info *info);
+int mdt_llog_create(struct mdt_thread_info *info);
+int mdt_llog_destroy(struct mdt_thread_info *info);
+int mdt_llog_read_header(struct mdt_thread_info *info);
+int mdt_llog_next_block(struct mdt_thread_info *info);
+int mdt_llog_prev_block(struct mdt_thread_info *info);
+int mdt_sec_ctx_handle(struct mdt_thread_info *info);
+int mdt_readpage(struct mdt_thread_info *info);
+int mdt_obd_idx_read(struct mdt_thread_info *info);
+
+extern struct mdt_opc_slice mdt_regular_handlers[];
+extern struct mdt_opc_slice mdt_seq_handlers[];
+extern struct mdt_opc_slice mdt_fld_handlers[];
+
+int mdt_quotacheck(struct mdt_thread_info *info);
+int mdt_quotactl(struct mdt_thread_info *info);
+int mdt_quota_dqacq(struct mdt_thread_info *info);
+int mdt_swap_layouts(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 *);
@@ -669,6 +859,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,
@@ -818,16 +1017,14 @@ enum {
 void mdt_counter_incr(struct ptlrpc_request *req, int opcode);
 void mdt_stats_counter_init(struct lprocfs_stats *stats);
 void lprocfs_mdt_init_vars(struct lprocfs_static_vars *lvars);
+void lprocfs_mds_init_vars(struct lprocfs_static_vars *lvars);
 int mdt_procfs_init(struct mdt_device *mdt, const char *name);
-int mdt_procfs_fini(struct mdt_device *mdt);
+void mdt_procfs_fini(struct mdt_device *mdt);
 void mdt_rename_counter_tally(struct mdt_thread_info *info,
                              struct mdt_device *mdt,
                              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);
@@ -835,20 +1032,20 @@ void mdt_ck_timer_callback(unsigned long castmeharder);
 int mdt_capa_keys_init(const struct lu_env *env, struct mdt_device *mdt);
 
 static inline void mdt_set_capainfo(struct mdt_thread_info *info, int offset,
-                                    const struct lu_fid *fid,
-                                    struct lustre_capa *capa)
+                                   const struct lu_fid *fid,
+                                   struct lustre_capa *capa)
 {
-        struct md_capainfo *ci;
+       struct md_capainfo *ci;
 
        LASSERT(offset >= 0 && offset < MD_CAPAINFO_MAX);
-        if (!info->mti_mdt->mdt_opts.mo_mds_capa ||
-            !(info->mti_exp->exp_connect_flags & OBD_CONNECT_MDS_CAPA))
-                return;
-
-        ci = md_capainfo(info->mti_env);
-        LASSERT(ci);
-        ci->mc_fid[offset]  = *fid;
-        ci->mc_capa[offset] = capa;
+       if (!info->mti_mdt->mdt_opts.mo_mds_capa ||
+           !(exp_connect_flags(info->mti_exp) & OBD_CONNECT_MDS_CAPA))
+               return;
+
+       ci = md_capainfo(info->mti_env);
+       LASSERT(ci);
+       ci->mc_fid[offset]  = *fid;
+       ci->mc_capa[offset] = capa;
 }
 
 static inline void mdt_dump_capainfo(struct mdt_thread_info *info)
@@ -877,5 +1074,58 @@ static inline struct obd_device *mdt2obd_dev(const struct mdt_device *mdt)
 {
         return mdt->mdt_md_dev.md_lu_dev.ld_obd;
 }
+
+extern const struct lu_device_operations mdt_lu_ops;
+
+static inline int lu_device_is_mdt(struct lu_device *d)
+{
+       return ergo(d != NULL && d->ld_ops != NULL, d->ld_ops == &mdt_lu_ops);
+}
+
+static inline struct mdt_device *lu2mdt_dev(struct lu_device *d)
+{
+       LASSERTF(lu_device_is_mdt(d), "It is %s instead of MDT %p %p\n",
+                d->ld_type->ldt_name, d->ld_ops, &mdt_lu_ops);
+       return container_of0(d, struct mdt_device, mdt_md_dev.md_lu_dev);
+}
+
+static inline char *mdt_obd_name(struct mdt_device *mdt)
+{
+       return mdt->mdt_md_dev.md_lu_dev.ld_obd->obd_name;
+}
+
+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 */