* 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/
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;
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;
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;
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
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.
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. */
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
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)
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 *,
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 *,
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 *);
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,
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);
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 */