struct mdt_object *mfd_object; /* point to opened object */
};
-#define CDT_NONBLOCKING_RESTORE 0x0000000000000001ULL
-#define CDT_NORETRY_ACTION 0x0000000000000002ULL
-#define CDT_POLICY_MASK CDT_NONBLOCKING_RESTORE | \
- CDT_NORETRY_ACTION
+#define CDT_NONBLOCKING_RESTORE (1ULL << 0)
+#define CDT_NORETRY_ACTION (1ULL << 1)
+#define CDT_POLICY_LAST CDT_NORETRY_ACTION
+#define CDT_POLICY_SHIFT_COUNT 2
+#define CDT_POLICY_ALL (CDT_NONBLOCKING_RESTORE | \
+ CDT_NORETRY_ACTION)
/* when adding a new policy, do not forget to update
* lustre/mdt/mdt_coordinator.c::hsm_policy_names[]
* cdt_request_lock
*/
struct coordinator {
- struct ptlrpc_thread cdt_thread; /**< coordinator thread */
- struct lu_env cdt_env; /**< coordinator lustre
- * env */
- struct lu_context cdt_session; /** session for lu_ucred */
- struct proc_dir_entry *cdt_proc_dir; /**< cdt /proc directory */
- __u64 cdt_policy; /**< flags to defined
- * policy */
- enum cdt_states cdt_state; /**< state */
- atomic_t cdt_compound_id; /**< compound id counter */
- __u64 cdt_last_cookie; /**< last cookie allocated */
- struct mutex cdt_llog_lock; /**< protect llog access */
- struct rw_semaphore cdt_agent_lock; /**< protect agent list */
- struct rw_semaphore cdt_request_lock; /**< protect request list */
- struct mutex cdt_restore_lock; /**< protect restore list */
- cfs_time_t cdt_loop_period; /**< llog scan period */
- cfs_time_t cdt_delay; /**< request grace delay */
- cfs_time_t cdt_timeout; /**< request timeout */
- __u64 cdt_max_request; /**< max count of started
- * requests */
- atomic_t cdt_request_count; /**< current count of
- * started requests */
- struct list_head cdt_requests; /**< list of started
- * requests */
- struct list_head cdt_agents; /**< list of register
- * agents */
- struct list_head cdt_restore_hdl; /**< list of restore lock
- * handles */
+ struct ptlrpc_thread cdt_thread; /**< coordinator thread */
+ struct lu_env cdt_env; /**< coordinator lustre
+ * env */
+ struct lu_context cdt_session; /** session for lu_ucred */
+ struct proc_dir_entry *cdt_proc_dir; /**< cdt /proc directory */
+ __u64 cdt_policy; /**< policy flags */
+ enum cdt_states cdt_state; /**< state */
+ atomic_t cdt_compound_id; /**< compound id
+ * counter */
+ __u64 cdt_last_cookie; /**< last cookie
+ * allocated */
+ struct mutex cdt_llog_lock; /**< protect llog
+ * access */
+ struct rw_semaphore cdt_agent_lock; /**< protect agent list */
+ struct rw_semaphore cdt_request_lock; /**< protect request
+ * list */
+ struct mutex cdt_restore_lock; /**< protect restore
+ * list */
+ cfs_time_t cdt_loop_period; /**< llog scan period */
+ cfs_time_t cdt_grace_delay; /**< request grace
+ * delay */
+ cfs_time_t cdt_active_req_timeout; /**< request timeout */
+ __u32 cdt_default_archive_id; /**< archive id used
+ * when none are
+ * specified */
+ __u64 cdt_max_requests; /**< max count of started
+ * requests */
+ atomic_t cdt_request_count; /**< current count of
+ * started requests */
+ struct list_head cdt_requests; /**< list of started
+ * requests */
+ struct list_head cdt_agents; /**< list of register
+ * agents */
+ struct list_head cdt_restore_hdl; /**< list of restore lock
+ * handles */
+ /* Bitmasks indexed by the HSMA_XXX constants. */
+ __u64 cdt_user_request_mask;
+ __u64 cdt_group_request_mask;
+ __u64 cdt_other_request_mask;
};
/* mdt state flag bits */
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,
mo_coordinator:1;
} mdt_opts;
struct upcall_cache *mdt_identity_cache;
- /* sptlrpc rules */
- rwlock_t mdt_sptlrpc_lock;
- struct sptlrpc_rule_set mdt_sptlrpc_rset;
-
- /* 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;
- cfs_timer_t mdt_ck_timer;
- struct ptlrpc_thread mdt_ck_thread;
- struct lustre_capa_key mdt_capa_keys[2];
+ /* 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,
mdt_som_conf:1,
/* Enable remote dir on non-MDT0 */
int mdt_nosquash_strlen;
struct rw_semaphore mdt_squash_sem;
- int mdt_sec_level;
struct rename_stats mdt_rename_stats;
struct lu_fid mdt_md_root_fid;
struct rw_semaphore mot_open_sem;
atomic_t mot_lease_count;
atomic_t mot_open_count;
- /* A lock to protect EA data from racing setxattr and getxattrall */
- struct rw_semaphore mot_xattr_sem;
};
enum mdt_object_flags {
* to be removed upon moving MDT to the unified target code */
bool mti_txn_compat;
- /*
- * Additional fail id that can be set by handler. Passed to
- * target_send_reply().
- */
- int mti_fail_id;
-
/* transaction number of current request */
__u64 mti_transno;
struct ldlm_enqueue_info mti_einfo;
};
+extern struct lu_context_key mdt_thread_key;
+
+static inline struct mdt_thread_info *mdt_th_info(const struct lu_env *env)
+{
+ struct mdt_thread_info *mti;
+
+ lu_env_refill((void *)env);
+ mti = lu_context_key_get(&env->le_ctx, &mdt_thread_key);
+ LASSERT(mti);
+ return mti;
+}
+
/* ptlrpc request handler for MDT. All handlers are
* grouped into several slices - struct mdt_opc_slice,
* and stored in an array - mdt_handlers[].
struct obd_export *exp,
void *client_nid);
-int mdt_pin(struct mdt_thread_info* info);
-
int mdt_lock_new_child(struct mdt_thread_info *info,
struct mdt_object *o,
struct mdt_lock_handle *child_lockh);
MDT_SOM_ENABLE = 1,
};
+int mdt_get_info(struct tgt_session_info *tsi);
int mdt_attr_get_complex(struct mdt_thread_info *info,
struct mdt_object *o, struct md_attr *ma);
int mdt_ioepoch_open(struct mdt_thread_info *info, struct mdt_object *o,
struct mdt_file_data *mdt_mfd_new(const struct mdt_export_data *med);
int mdt_mfd_close(struct mdt_thread_info *info, struct mdt_file_data *mfd);
void mdt_mfd_free(struct mdt_file_data *mfd);
-int mdt_close(struct mdt_thread_info *info);
+int mdt_close(struct tgt_session_info *tsi);
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_done_writing(struct tgt_session_info *tsi);
int mdt_fix_reply(struct mdt_thread_info *info);
int mdt_handle_last_unlink(struct mdt_thread_info *, struct mdt_object *,
const struct md_attr *);
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);
-int mdt_tgt_connect(struct tgt_session_info *tsi);
void mdt_thread_info_init(struct ptlrpc_request *req,
struct mdt_thread_info *mti);
void mdt_thread_info_fini(struct mdt_thread_info *mti);
-
-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);
+struct mdt_thread_info *tsi2mdt_info(struct tgt_session_info *tsi);
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,
const 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_init_idmap(struct tgt_session_info *tsi);
void mdt_cleanup_idmap(struct mdt_export_data *);
-int mdt_handle_idmap(struct mdt_thread_info *);
+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 *,
return container_of0(d, struct mdt_device, mdt_lu_dev);
}
+static inline struct mdt_object *mdt_obj(struct lu_object *o)
+{
+ return container_of0(o, struct mdt_object, mot_obj);
+}
+
static inline struct dt_object *mdt_obj2dt(struct mdt_object *mo)
{
struct lu_object *lo;
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);
+int mdt_hsm_state_get(struct tgt_session_info *tsi);
+int mdt_hsm_state_set(struct tgt_session_info *tsi);
+int mdt_hsm_action(struct tgt_session_info *tsi);
+int mdt_hsm_progress(struct tgt_session_info *tsi);
+int mdt_hsm_ct_register(struct tgt_session_info *tsi);
+int mdt_hsm_ct_unregister(struct tgt_session_info *tsi);
+int mdt_hsm_request(struct tgt_session_info *tsi);
+
/* mdt/mdt_hsm_cdt_actions.c */
-extern const struct file_operations mdt_agent_actions_fops;
+extern const struct file_operations mdt_hsm_actions_fops;
void dump_llog_agent_req_rec(const char *prefix,
const struct llog_agent_req_rec *larr);
int cdt_llog_process(const struct lu_env *env, struct mdt_device *mdt,
bool mdt_hsm_restore_is_running(struct mdt_thread_info *mti,
const struct lu_fid *fid);
/* mdt/mdt_hsm_cdt_requests.c */
-extern const struct file_operations mdt_hsm_request_fops;
+extern const struct file_operations mdt_hsm_active_requests_fops;
void dump_requests(char *prefix, struct coordinator *cdt);
struct cdt_agent_req *mdt_cdt_alloc_request(__u64 compound_id, __u32 archive_id,
__u64 flags, struct obd_uuid *uuid,
unsigned long count, void *data);
int lprocfs_rd_hsm_cdt_control(char *page, char **start, off_t off,
int count, int *eof, void *data);
+int hsm_cdt_procfs_init(struct mdt_device *mdt);
+void hsm_cdt_procfs_fini(struct mdt_device *mdt);
+struct lprocfs_vars *hsm_cdt_get_proc_vars(void);
/* md_hsm helpers */
struct mdt_object *mdt_hsm_get_md_hsm(struct mdt_thread_info *mti,
const struct lu_fid *fid,
const int update_record);
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 dt_device *dd, int id)
static inline struct mdt_export_data *mdt_req2med(struct ptlrpc_request *req)
{
- return &req->rq_export->exp_mdt_data;
+ return &req->rq_export->exp_mdt_data;
+}
+
+static inline struct mdt_device *mdt_exp2dev(struct obd_export *exp)
+{
+ return mdt_dev(exp->exp_obd->obd_lu_dev);
}
typedef void (*mdt_reconstruct_t)(struct mdt_thread_info *mti,
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_lu_dev);
-}
-
static inline char *mdt_obd_name(struct mdt_device *mdt)
{
return mdt->mdt_lu_dev.ld_obd->obd_name;