X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Finclude%2Flu_target.h;h=d9da1a44d15bb3de5d06dec4337e0199a18cfada;hb=ec37d78caf6cbd8118cfe1ff012c828950356e7a;hp=66e6f769f918cb02654341c0f693c0faac1492a6;hpb=93a6346f8b73f68cb5bc02a3c826ac0e5b4c236e;p=fs%2Flustre-release.git diff --git a/lustre/include/lu_target.h b/lustre/include/lu_target.h index 66e6f76..d9da1a4 100644 --- a/lustre/include/lu_target.h +++ b/lustre/include/lu_target.h @@ -39,7 +39,9 @@ #include #include +#include #include +#include struct lu_target { struct obd_device *lut_obd; @@ -53,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 */ @@ -93,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) @@ -110,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. */ @@ -155,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; }; @@ -177,12 +233,19 @@ static inline __u64 tgt_conn_flags(struct tgt_session_info *tsi) return exp_connect_flags(tsi->tsi_exp); } +static inline int req_is_replay(struct ptlrpc_request *req) +{ + LASSERT(req->rq_reqmsg); + return !!(lustre_msg_get_flags(req->rq_reqmsg) & MSG_REPLAY); +} + /* target/tgt_handler.c */ int tgt_request_handle(struct ptlrpc_request *req); 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); @@ -199,6 +262,42 @@ 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, __u64 start, __u64 end); + +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_in_notify(int (*notify)(const struct lu_env *, + struct dt_device *, + struct lfsck_request *, + struct thandle *)); +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); @@ -207,6 +306,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, @@ -229,8 +330,10 @@ int tgt_client_data_write(const struct lu_env *env, struct lu_target *tg, int tgt_server_data_read(const struct lu_env *env, struct lu_target *tg); int tgt_server_data_write(const struct lu_env *env, struct lu_target *tg, struct thandle *th); -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_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); enum { ESERIOUS = 0x0001000 @@ -254,10 +357,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, \ @@ -265,49 +380,96 @@ 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) \ + TGT_RPC_HANDLER(MDS_FIRST_OPC, flags, name, fn, &RQF_ ## name, \ + LUSTRE_MDS_VERSION) +/* Request with a format we do not yet know */ +#define TGT_MDT_HDL_VAR(flags, name, fn) \ + 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,\ - LUSTRE_MGS_VERSION) + TGT_RPC_HANDLER(MGS_FIRST_OPC, flags, name, fn, &RQF_ ## name, \ + LUSTRE_MGS_VERSION) #define TGT_MGS_HDL_VAR(flags, name, fn) \ - TGT_RPC_HANDLER(MGS_FIRST_OPC, flags, name, fn, NULL, \ - LUSTRE_MGS_VERSION) + TGT_RPC_HANDLER(MGS_FIRST_OPC, flags, name, fn, NULL, \ + LUSTRE_MGS_VERSION) /* * OBD handler macros and generic functions. */ #define TGT_OBD_HDL(flags, name, fn) \ - TGT_RPC_HANDLER(OBD_FIRST_OPC, flags, name, fn, &RQF_ ## name,\ - LUSTRE_OBD_VERSION) + TGT_RPC_HANDLER(OBD_FIRST_OPC, flags, name, fn, &RQF_ ## name, \ + LUSTRE_OBD_VERSION) +#define TGT_OBD_HDL_VAR(flags, name, fn) \ + TGT_RPC_HANDLER(OBD_FIRST_OPC, flags, name, fn, NULL, \ + LUSTRE_OBD_VERSION) /* * DLM handler macros and generic functions. */ #define TGT_DLM_HDL_VAR(flags, name, fn) \ - TGT_RPC_HANDLER(LDLM_FIRST_OPC, flags, name, fn, NULL, \ - LUSTRE_DLM_VERSION) + TGT_RPC_HANDLER(LDLM_FIRST_OPC, flags, name, fn, NULL, \ + LUSTRE_DLM_VERSION) #define TGT_DLM_HDL(flags, name, fn) \ - TGT_RPC_HANDLER(LDLM_FIRST_OPC, flags, name, fn, &RQF_ ## name,\ - LUSTRE_DLM_VERSION) + TGT_RPC_HANDLER(LDLM_FIRST_OPC, flags, name, fn, &RQF_ ## name, \ + LUSTRE_DLM_VERSION) /* * LLOG handler macros and generic functions. */ #define TGT_LLOG_HDL_VAR(flags, name, fn) \ - TGT_RPC_HANDLER(LLOG_FIRST_OPC, flags, name, fn, NULL, \ - LUSTRE_LOG_VERSION) + TGT_RPC_HANDLER(LLOG_FIRST_OPC, flags, name, fn, NULL, \ + LUSTRE_LOG_VERSION) #define TGT_LLOG_HDL(flags, name, fn) \ - TGT_RPC_HANDLER(LLOG_FIRST_OPC, flags, name, fn, &RQF_ ## name,\ - LUSTRE_LOG_VERSION) + TGT_RPC_HANDLER(LLOG_FIRST_OPC, flags, name, fn, &RQF_ ## name, \ + LUSTRE_LOG_VERSION) /* * Sec context handler macros and generic functions. */ #define TGT_SEC_HDL_VAR(flags, name, fn) \ - TGT_RPC_HANDLER(SEC_FIRST_OPC, flags, name, fn, NULL, \ - LUSTRE_OBD_VERSION) + TGT_RPC_HANDLER(SEC_FIRST_OPC, flags, name, fn, NULL, \ + LUSTRE_OBD_VERSION) + +#define TGT_QUOTA_HDL(flags, name, fn) \ + TGT_RPC_HANDLER(QUOTA_DQACQ, flags, name, fn, &RQF_ ## name, \ + LUSTRE_MDS_VERSION) + +/* Sequence service handlers */ +#define TGT_SEQ_HDL(flags, name, fn) \ + TGT_RPC_HANDLER(SEQ_QUERY, flags, name, fn, &RQF_ ## name, \ + LUSTRE_MDS_VERSION) + +/* FID Location Database handlers */ +#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(OUT_UPDATE, flags, name, fn, &RQF_ ## name, \ + LUSTRE_MDS_VERSION) #endif /* __LUSTRE_LU_TARGET_H */