X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Finclude%2Flu_target.h;h=f2ab0706ed04fe3befb37a0c6f2ed3a0e1903565;hb=5f3e926ac9ff8ad134ad920d0e8545e16395ef3b;hp=114073b766861ef92791b3b60a587a9b0a1ba06e;hpb=4f5830f769f9cc9bacfcdfee9de5962324fb5c81;p=fs%2Flustre-release.git diff --git a/lustre/include/lu_target.h b/lustre/include/lu_target.h index 114073b..f2ab070 100644 --- a/lustre/include/lu_target.h +++ b/lustre/include/lu_target.h @@ -41,6 +41,7 @@ #include #include #include +#include struct lu_target { struct obd_device *lut_obd; @@ -54,11 +55,14 @@ struct lu_target { /* sptlrpc rules */ rwlock_t lut_sptlrpc_lock; struct sptlrpc_rule_set lut_sptlrpc_rset; + spinlock_t lut_flags_lock; int lut_sec_level; unsigned int lut_mds_capa:1, - lut_oss_capa:1; - - /* LAST_RCVD parameters */ + lut_oss_capa:1, + lut_syncjournal:1, + lut_sync_lock_cancel:2, + /* e.g. OST node */ + lut_no_reconstruct:1; /** last_rcvd file */ struct dt_object *lut_last_rcvd; /* transaction callbacks */ @@ -94,11 +98,29 @@ struct tgt_session_info { struct obd_export *tsi_exp; const struct lu_env *tsi_env; struct lu_target *tsi_tgt; + + const struct mdt_body *tsi_mdt_body; + struct ost_body *tsi_ost_body; + struct lu_object *tsi_corpus; + + struct lu_fid tsi_fid; + struct ldlm_res_id tsi_resid; + + /* object affected by VBR, for last_rcvd_update */ + struct dt_object *tsi_vbr_obj; + /* opdata for mdt_reint_open(), has the same value as + * ldlm_reply:lock_policy_res1. The tgt_update_last_rcvd() stores + * this value onto disk for recovery when tgt_txn_stop_cb() is called. + */ + __u64 tsi_opdata; + /* * Additional fail id that can be set by handler. */ int tsi_reply_fail_id; - int tsi_request_fail_id; + bool tsi_preprocessed; + /* request JobID */ + char *tsi_jobid; }; static inline struct tgt_session_info *tgt_ses_info(const struct lu_env *env) @@ -111,6 +133,37 @@ static inline struct tgt_session_info *tgt_ses_info(const struct lu_env *env) return tsi; } +static inline void tgt_vbr_obj_set(const struct lu_env *env, + struct dt_object *obj) +{ + struct tgt_session_info *tsi; + + if (env->le_ses != NULL) { + tsi = tgt_ses_info(env); + tsi->tsi_vbr_obj = obj; + } +} + +static inline void tgt_opdata_set(const struct lu_env *env, __u64 flags) +{ + struct tgt_session_info *tsi; + + if (env->le_ses != NULL) { + tsi = tgt_ses_info(env); + tsi->tsi_opdata |= flags; + } +} + +static inline void tgt_opdata_clear(const struct lu_env *env, __u64 flags) +{ + struct tgt_session_info *tsi; + + if (env->le_ses != NULL) { + tsi = tgt_ses_info(env); + tsi->tsi_opdata &= ~flags; + } +} + /* * Generic unified target support. */ @@ -156,7 +209,9 @@ struct tgt_handler { /* Request version for this opcode */ int th_version; /* Handler function */ - int (*th_act)(struct tgt_session_info *tti); + int (*th_act)(struct tgt_session_info *tsi); + /* Handler function for high priority requests */ + void (*th_hp)(struct tgt_session_info *tsi); /* Request format for this request */ const struct req_format *th_fmt; }; @@ -190,6 +245,7 @@ char *tgt_name(struct lu_target *tgt); void tgt_counter_incr(struct obd_export *exp, int opcode); int tgt_connect_check_sptlrpc(struct ptlrpc_request *req, struct obd_export *exp); +int tgt_adapt_sptlrpc_conf(struct lu_target *tgt, int initial); int tgt_connect(struct tgt_session_info *tsi); int tgt_disconnect(struct tgt_session_info *uti); int tgt_obd_ping(struct tgt_session_info *tsi); @@ -206,12 +262,44 @@ int tgt_llog_prev_block(struct tgt_session_info *tsi); int tgt_sec_ctx_init(struct tgt_session_info *tsi); int tgt_sec_ctx_init_cont(struct tgt_session_info *tsi); int tgt_sec_ctx_fini(struct tgt_session_info *tsi); +int tgt_sendpage(struct tgt_session_info *tsi, struct lu_rdpg *rdpg, int nob); +int tgt_validate_obdo(struct tgt_session_info *tsi, struct obdo *oa); +int tgt_sync(const struct lu_env *env, struct lu_target *tgt, + struct dt_object *obj); + +int tgt_io_thread_init(struct ptlrpc_thread *thread); +void tgt_io_thread_done(struct ptlrpc_thread *thread); + +int tgt_extent_lock(struct ldlm_namespace *ns, struct ldlm_res_id *res_id, + __u64 start, __u64 end, struct lustre_handle *lh, + int mode, __u64 *flags); +void tgt_extent_unlock(struct lustre_handle *lh, ldlm_mode_t mode); +int tgt_brw_lock(struct ldlm_namespace *ns, struct ldlm_res_id *res_id, + struct obd_ioobj *obj, struct niobuf_remote *nb, + struct lustre_handle *lh, int mode); +void tgt_brw_unlock(struct obd_ioobj *obj, struct niobuf_remote *niob, + struct lustre_handle *lh, int mode); +int tgt_brw_read(struct tgt_session_info *tsi); +int tgt_brw_write(struct tgt_session_info *tsi); +int tgt_hpreq_handler(struct ptlrpc_request *req); +void tgt_register_lfsck_start(int (*start)(const struct lu_env *, + struct dt_device *, + struct lfsck_start_param *)); +void tgt_register_lfsck_in_notify(int (*notify)(const struct lu_env *, + struct dt_device *, + struct lfsck_request *)); +void tgt_register_lfsck_query(int (*query)(const struct lu_env *, + struct dt_device *, + struct lfsck_request *)); extern struct tgt_handler tgt_sec_ctx_handlers[]; +extern struct tgt_handler tgt_lfsck_handlers[]; extern struct tgt_handler tgt_obd_handlers[]; extern struct tgt_handler tgt_dlm_handlers[]; extern struct tgt_handler tgt_llog_handlers[]; extern struct tgt_handler tgt_out_handlers[]; +extern struct tgt_handler fld_handlers[]; +extern struct tgt_handler seq_handlers[]; typedef void (*tgt_cb_t)(struct lu_target *lut, __u64 transno, void *data, int err); @@ -220,6 +308,8 @@ struct tgt_commit_cb { void *tgt_cb_data; }; +int tgt_hpreq_handler(struct ptlrpc_request *req); + /* target/tgt_main.c */ void tgt_boot_epoch_update(struct lu_target *lut); int tgt_last_commit_cb_add(struct thandle *th, struct lu_target *lut, @@ -246,9 +336,23 @@ int tgt_server_data_update(const struct lu_env *env, struct lu_target *tg, int sync); int tgt_truncate_last_rcvd(const struct lu_env *env, struct lu_target *tg, loff_t off); -int tgt_last_rcvd_update(const struct lu_env *env, struct lu_target *tgt, - struct dt_object *obj, __u64 opdata, - struct thandle *th, struct ptlrpc_request *req); + +/* target/out_lib.c */ +struct update_request * +out_find_update(struct thandle_update *tu, struct dt_device *dt_dev); +void out_destroy_update_req(struct update_request *update); +struct update_request *out_create_update_req(struct dt_device *dt); +struct update_request *out_find_create_update_loc(struct thandle *th, + struct dt_object *dt); +int out_prep_update_req(const struct lu_env *env, struct obd_import *imp, + const struct update_buf *ubuf, int ubuf_len, + struct ptlrpc_request **reqp); +int out_remote_sync(const struct lu_env *env, struct obd_import *imp, + struct update_request *update, + struct ptlrpc_request **reqp); +int out_insert_update(const struct lu_env *env, struct update_request *update, + int op, const struct lu_fid *fid, int count, + int *lens, const char **bufs); enum { ESERIOUS = 0x0001000 @@ -272,10 +376,22 @@ static inline int is_serious(int rc) return (rc < 0 && -rc & ESERIOUS); } +/** + * Do not return server-side uid/gid to remote client + */ +static inline void tgt_drop_id(struct obd_export *exp, struct obdo *oa) +{ + if (unlikely(exp_connect_rmtclient(exp))) { + oa->o_uid = -1; + oa->o_gid = -1; + oa->o_valid &= ~(OBD_MD_FLUID | OBD_MD_FLGID); + } +} + /* * Unified target generic handers macros and generic functions. */ -#define TGT_RPC_HANDLER(base, flags, opc, fn, fmt, version) \ +#define TGT_RPC_HANDLER_HP(base, flags, opc, fn, hp, fmt, version) \ [opc - base] = { \ .th_name = #opc, \ .th_fail_id = OBD_FAIL_ ## opc ## _NET, \ @@ -283,8 +399,11 @@ static inline int is_serious(int rc) .th_flags = flags, \ .th_act = fn, \ .th_fmt = fmt, \ - .th_version = version \ + .th_version = version, \ + .th_hp = hp, \ } +#define TGT_RPC_HANDLER(base, flags, opc, fn, fmt, version) \ + TGT_RPC_HANDLER_HP(base, flags, opc, fn, NULL, fmt, version) /* MDT Request with a format known in advance */ #define TGT_MDT_HDL(flags, name, fn) \ @@ -295,6 +414,14 @@ static inline int is_serious(int rc) TGT_RPC_HANDLER(MDS_FIRST_OPC, flags, name, fn, NULL, \ LUSTRE_MDS_VERSION) +/* OST Request with a format known in advance */ +#define TGT_OST_HDL(flags, name, fn) \ + TGT_RPC_HANDLER(OST_FIRST_OPC, flags, name, fn, &RQF_ ## name, \ + LUSTRE_OST_VERSION) +#define TGT_OST_HDL_HP(flags, name, fn, hp) \ + TGT_RPC_HANDLER_HP(OST_FIRST_OPC, flags, name, fn, hp, \ + &RQF_ ## name, LUSTRE_OST_VERSION) + /* MGS request with a format known in advance */ #define TGT_MGS_HDL(flags, name, fn) \ TGT_RPC_HANDLER(MGS_FIRST_OPC, flags, name, fn, &RQF_ ## name, \ @@ -350,10 +477,15 @@ static inline int is_serious(int rc) LUSTRE_MDS_VERSION) /* FID Location Database handlers */ -#define TGT_FLD_HDL(flags, name, fn) \ - TGT_RPC_HANDLER(FLD_QUERY, flags, name, fn, &RQF_ ## name, \ +#define TGT_FLD_HDL_VAR(flags, name, fn) \ + TGT_RPC_HANDLER(FLD_QUERY, flags, name, fn, NULL, \ LUSTRE_MDS_VERSION) +/* LFSCK handlers */ +#define TGT_LFSCK_HDL(flags, name, fn) \ + TGT_RPC_HANDLER(LFSCK_FIRST_OPC, flags, name, fn, \ + &RQF_ ## name, LUSTRE_OBD_VERSION) + /* Request with a format known in advance */ #define TGT_UPDATE_HDL(flags, name, fn) \ TGT_RPC_HANDLER(UPDATE_OBJ, flags, name, fn, &RQF_ ## name, \