X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fmdt%2Fmdt_internal.h;h=7db09e8b851fac6db019ff1108fe3182ddee261a;hb=93dec71f65a4bbb170a35b04c60b8620b73ae4b1;hp=e8b5830ec63b94c2c5626f2f6168e892192ec6b2;hpb=e53d1c18ea9f8c08d55d573e8f0993e582c44c20;p=fs%2Flustre-release.git diff --git a/lustre/mdt/mdt_internal.h b/lustre/mdt/mdt_internal.h index e8b5830..7db09e8 100644 --- a/lustre/mdt/mdt_internal.h +++ b/lustre/mdt/mdt_internal.h @@ -50,7 +50,6 @@ #if defined(__KERNEL__) -#include #include #include #include @@ -59,7 +58,6 @@ #include #include #include -#include #include #include #include @@ -86,15 +84,17 @@ struct mdt_file_data { 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[] */ -#define CDT_DEFAULT_POLICY 0x0000000000000000ULL +#define CDT_DEFAULT_POLICY CDT_NORETRY_ACTION enum cdt_states { CDT_STOPPED = 0, CDT_INIT, @@ -110,33 +110,34 @@ enum cdt_states { CDT_STOPPED = 0, * cdt_request_lock */ struct coordinator { - struct ptlrpc_thread *cdt_thread; /**< coordinator thread */ + 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 */ - cfs_atomic_t cdt_compound_id; /**< compound id counter */ + atomic_t cdt_compound_id; /**< compound id counter */ __u64 cdt_last_cookie; /**< last cookie allocated */ - struct semaphore cdt_counter_lock; /**< protect request - * counter */ - struct semaphore cdt_llog_lock; /**< protect llog access */ + 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 semaphore cdt_restore_lock; /**< protect restore 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 */ + __u32 cdt_archive_id; /** archive id used when + * none are specified */ __u64 cdt_max_request; /**< max count of started * requests */ - __u64 cdt_request_count; /**< current count of + atomic_t cdt_request_count; /**< current count of * started requests */ - cfs_list_t cdt_requests; /**< list of started + struct list_head cdt_requests; /**< list of started * requests */ - cfs_list_t cdt_agents; /**< list of register + struct list_head cdt_agents; /**< list of register * agents */ - cfs_list_t cdt_restore_hdl; /**< list of restore lock + struct list_head cdt_restore_hdl; /**< list of restore lock * handles */ }; @@ -256,8 +257,6 @@ struct mdt_object { 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 { @@ -299,13 +298,13 @@ struct mdt_lock_handle { }; enum { - MDT_LH_PARENT, /* parent lockh */ - MDT_LH_CHILD, /* child lockh */ - MDT_LH_OLD, /* old lockh for rename */ + 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_LOCAL, /* local lock never return to client */ + MDT_LH_NEW, /* new lockh for rename */ + MDT_LH_RMT, /* used for return lh to caller */ + MDT_LH_LOCAL, /* local lock never return to client */ MDT_LH_NR }; @@ -413,6 +412,9 @@ struct mdt_thread_info { struct mdt_device *mti_mdt; const struct lu_env *mti_env; + /* XXX: temporary flag to have healthy mti during OUT calls + * 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 @@ -577,7 +579,7 @@ struct cdt_req_progress { struct cdt_agent_req { cfs_list_t car_request_list; /**< to chain all the req. */ - cfs_atomic_t car_refcount; /**< reference counter */ + atomic_t car_refcount; /**< reference counter */ __u64 car_compound_id; /**< compound id */ __u64 car_flags; /**< request original flags */ struct obd_uuid car_uuid; /**< agent doing the req. */ @@ -589,6 +591,7 @@ struct cdt_agent_req { struct cdt_req_progress car_progress; /**< track data mvt * progress */ }; +extern struct kmem_cache *mdt_hsm_car_kmem; struct hsm_agent { cfs_list_t ha_list; /**< to chain the agents */ @@ -596,10 +599,10 @@ struct hsm_agent { __u32 *ha_archive_id; /**< archive id */ int ha_archive_cnt; /**< number of archive entries * 0 means any archive */ - cfs_atomic_t ha_requests; /**< current request count */ - cfs_atomic_t ha_success; /**< number of successful + atomic_t ha_requests; /**< current request count */ + atomic_t ha_success; /**< number of successful * actions */ - cfs_atomic_t ha_failure; /**< number of failed actions */ + atomic_t ha_failure; /**< number of failed actions */ }; struct cdt_restore_handle { @@ -608,6 +611,7 @@ struct cdt_restore_handle { struct ldlm_extent crh_extent; /**< extent of the restore */ struct mdt_lock_handle crh_lh; /**< lock handle */ }; +extern struct kmem_cache *mdt_hsm_cdt_kmem; /** restore handle slab cache */ static inline const struct md_device_operations * mdt_child_ops(struct mdt_device * m) @@ -627,12 +631,6 @@ static inline struct ptlrpc_request *mdt_info_req(struct mdt_thread_info *info) return info->mti_pill ? info->mti_pill->rc_req : NULL; } -static inline int req_is_replay(struct ptlrpc_request *req) -{ - LASSERT(req->rq_reqmsg); - return !!(lustre_msg_get_flags(req->rq_reqmsg) & MSG_REPLAY); -} - static inline __u64 mdt_conn_flags(struct mdt_thread_info *info) { LASSERT(info->mti_exp); @@ -864,6 +862,10 @@ 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[]; @@ -878,7 +880,7 @@ 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); + const struct md_hsm *mh); struct mdt_handler *mdt_handler_find(__u32 opc, struct mdt_opc_slice *supported); @@ -936,7 +938,8 @@ int mdt_hsm_ct_unregister(struct mdt_thread_info *info); int mdt_hsm_request(struct mdt_thread_info *info); /* mdt/mdt_hsm_cdt_actions.c */ extern const struct file_operations mdt_agent_actions_fops; -void dump_llog_agent_req_rec(char *prefix, struct llog_agent_req_rec *larr); +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, llog_cb_t cb, void *data); int mdt_agent_record_add(const struct lu_env *env, struct mdt_device *mdt, @@ -977,7 +980,6 @@ int mdt_hsm_get_running(struct mdt_thread_info *mti, struct hsm_action_list *hal); 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; void dump_requests(char *prefix, struct coordinator *cdt); @@ -987,75 +989,42 @@ struct cdt_agent_req *mdt_cdt_alloc_request(__u64 compound_id, __u32 archive_id, void mdt_cdt_free_request(struct cdt_agent_req *car); int mdt_cdt_add_request(struct coordinator *cdt, struct cdt_agent_req *new_car); struct cdt_agent_req *mdt_cdt_find_request(struct coordinator *cdt, - __u64 cookie, + const __u64 cookie, const struct lu_fid *fid); void mdt_cdt_get_work_done(struct cdt_agent_req *car, __u64 *done_sz); void mdt_cdt_get_request(struct cdt_agent_req *car); void mdt_cdt_put_request(struct cdt_agent_req *car); struct cdt_agent_req *mdt_cdt_update_request(struct coordinator *cdt, - struct hsm_progress_kernel *pgs); + const struct hsm_progress_kernel *pgs); int mdt_cdt_remove_request(struct coordinator *cdt, __u64 cookie); - -/* fake functions, will be remove with patch LU-3343 */ -static inline struct mdt_object *mdt_hsm_get_md_hsm(struct mdt_thread_info *mti, - struct lu_fid *fid, - struct md_hsm *hsm, - struct mdt_lock_handle *lh) -{ - return ERR_PTR(-EINVAL); -} -static inline bool mdt_hsm_is_action_compat(struct hsm_action_item *hai, - int hal_an, __u64 rq_flags, - struct md_hsm *hsm) -{ - return false; -} -static inline int mdt_hsm_cdt_init(struct mdt_device *mdt) -{ - struct coordinator *cdt = &mdt->mdt_coordinator; - - /* minimal init before final patch landing */ - sema_init(&cdt->cdt_llog_lock, 1); - init_rwsem(&cdt->cdt_agent_lock); - init_rwsem(&cdt->cdt_request_lock); - sema_init(&cdt->cdt_restore_lock, 1); - - CFS_INIT_LIST_HEAD(&cdt->cdt_requests); - CFS_INIT_LIST_HEAD(&cdt->cdt_agents); - CFS_INIT_LIST_HEAD(&cdt->cdt_restore_hdl); - - cdt->cdt_state = CDT_STOPPED; - return 0; -} -static inline int mdt_hsm_cdt_start(struct mdt_device *mdt) -{ - return 0; -} -static inline int mdt_hsm_cdt_stop(struct mdt_device *mdt) -{ - return 0; -} -static inline int mdt_hsm_cdt_fini(struct mdt_device *mdt) -{ - return 0; -} -static inline int mdt_hsm_cdt_wakeup(struct mdt_device *mdt) -{ - return 0; -} -static inline int mdt_hsm_add_hal(struct mdt_thread_info *mti, - struct hsm_action_list *hal, - const struct obd_uuid *uuid) -{ - return 0; -} -static inline int mdt_hsm_update_request_state(struct mdt_thread_info *mti, - struct hsm_progress_kernel *pgs, - bool update_record) -{ - return 0; -} -/* end of fake functions */ +/* mdt/mdt_coordinator.c */ +void mdt_hsm_dump_hal(int level, const char *prefix, + struct hsm_action_list *hal); +/* 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 */ +int lprocfs_wr_hsm_cdt_control(struct file *file, const char *buffer, + unsigned long count, void *data); +int lprocfs_rd_hsm_cdt_control(char *page, char **start, off_t off, + int count, int *eof, void *data); +/* md_hsm helpers */ +struct mdt_object *mdt_hsm_get_md_hsm(struct mdt_thread_info *mti, + const struct lu_fid *fid, + struct md_hsm *hsm); +/* actions/request helpers */ +int mdt_hsm_add_hal(struct mdt_thread_info *mti, + struct hsm_action_list *hal, struct obd_uuid *uuid); +bool mdt_hsm_is_action_compat(const struct hsm_action_item *hai, + const int hal_an, const __u64 rq_flags, + const struct md_hsm *hsm); +int mdt_hsm_update_request_state(struct mdt_thread_info *mti, + struct hsm_progress_kernel *pgs, + const int update_record); extern struct lu_context_key mdt_thread_key; /* debug issues helper starts here*/ @@ -1218,45 +1187,9 @@ int mdt_ck_thread_start(struct mdt_device *mdt); void mdt_ck_thread_stop(struct mdt_device *mdt); 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) -{ - struct md_capainfo *ci; - - LASSERT(offset >= 0 && offset < MD_CAPAINFO_MAX); - 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) -{ - struct md_capainfo *ci = md_capainfo(info->mti_env); - int i; - - if (!ci) - return; - for (i = 0; i < MD_CAPAINFO_MAX; i++) { - if (!ci->mc_capa[i]) { - CERROR("no capa for index %d "DFID"\n", - i, PFID(&ci->mc_fid[i])); - continue; - } - if (ci->mc_capa[i] == BYPASS_CAPA) { - CERROR("bypass for index %d "DFID"\n", - i, PFID(&ci->mc_fid[i])); - continue; - } - DEBUG_CAPA(D_ERROR, ci->mc_capa[i], "index %d", i); - } -} +void mdt_set_capainfo(struct mdt_thread_info *info, int offset, + const struct lu_fid *fid, struct lustre_capa *capa); +void mdt_dump_capainfo(struct mdt_thread_info *info); static inline struct obd_device *mdt2obd_dev(const struct mdt_device *mdt) { @@ -1285,37 +1218,5 @@ 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__) - -#define out_tx_destroy(info, obj, th, reply, idx) \ - __out_tx_destroy(info, obj, th, reply, idx, __FILE__, __LINE__) - #endif /* __KERNEL__ */ #endif /* _MDT_H */