X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fmdt%2Fmdt_internal.h;h=9ec2f343f11bef799eaf3f30730a56630d19fc1f;hp=fc9a7d38c5d1a9fab3cee7fa3a6423b424523761;hb=a079ade7913b923b795ea5c01df4e69bf1a87691;hpb=0b85782334b5f0c2ef362b35ea672ddc575cbc30 diff --git a/lustre/mdt/mdt_internal.h b/lustre/mdt/mdt_internal.h index fc9a7d3..9ec2f34 100644 --- a/lustre/mdt/mdt_internal.h +++ b/lustre/mdt/mdt_internal.h @@ -27,7 +27,7 @@ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2011, 2013, Intel Corporation. + * Copyright (c) 2011, 2015, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -48,9 +48,8 @@ #ifndef _MDT_INTERNAL_H #define _MDT_INTERNAL_H -#if defined(__KERNEL__) -#include +#include #include #include #include @@ -66,14 +65,6 @@ #include #include -/* check if request's xid is equal to last one or not*/ -static inline int req_xid_is_last(struct ptlrpc_request *req) -{ - struct lsd_client_data *lcd = req->rq_export->exp_target_data.ted_lcd; - return (req->rq_xid == lcd->lcd_last_xid || - req->rq_xid == lcd->lcd_last_close_xid); -} - struct mdt_object; /* file data for open files on MDS */ @@ -185,13 +176,11 @@ struct mdt_device { unsigned int mo_user_xattr:1, mo_acl:1, mo_cos:1, + mo_evict_tgt_nids:1, mo_coordinator:1; } mdt_opts; /* mdt state flags */ unsigned long mdt_state; - /* lock to protect IOepoch */ - spinlock_t mdt_ioepoch_lock; - __u64 mdt_ioepoch; /* transaction callbacks */ struct dt_txn_callback mdt_txn_cb; @@ -204,19 +193,10 @@ struct mdt_device { struct upcall_cache *mdt_identity_cache; - /* 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 */ - mdt_enable_remote_dir:1; + mdt_enable_remote_dir:1, + mdt_skip_lfsck:1; gid_t mdt_enable_remote_dir_gid; /* statfs optimization: we cache a bit */ @@ -236,20 +216,28 @@ struct mdt_device { struct lu_device *mdt_qmt_dev; struct coordinator mdt_coordinator; + + /* inter-MDT connection count */ + atomic_t mdt_mds_mds_conns; + + /* MDT device async commit count, used for debug and sanity test */ + atomic_t mdt_async_commit_count; }; #define MDT_SERVICE_WATCHDOG_FACTOR (2) #define MDT_COS_DEFAULT (0) +enum mdt_object_flags { + /** lov object has been created. */ + MOF_LOV_CREATED = 1 << 0, +}; + struct mdt_object { struct lu_object_header mot_header; struct lu_object mot_obj; - __u64 mot_ioepoch; - __u64 mot_flags; - int mot_ioepoch_count; - int mot_writecount; - /* Lock to protect object's IO epoch. */ - struct mutex mot_ioepoch_mutex; + enum mdt_object_flags mot_flags; + int mot_write_count; + spinlock_t mot_write_lock; /* Lock to protect create_data */ struct mutex mot_lov_mutex; /* Lock to protect lease open. @@ -259,42 +247,22 @@ struct mdt_object { atomic_t mot_open_count; }; -enum mdt_object_flags { - /** SOM attributes are changed. */ - MOF_SOM_CHANGE = (1 << 0), - /** - * The SOM recovery state for mdt object. - * This state is an in-memory equivalent of an absent SOM EA, used - * instead of invalidating SOM EA while IOEpoch is still opened when - * a client eviction occurs or a client fails to obtain SOM attributes. - * It indicates that the last IOEpoch holder will need to obtain SOM - * attributes under [0;EOF] extent lock to flush all the client's - * cached of evicted from MDS clients (but not necessary evicted from - * OST) before taking ost attributes. - */ - MOF_SOM_RECOV = (1 << 1), - /** File has been just created. */ - MOF_SOM_CREATED = (1 << 2), - /** lov object has been created. */ - MOF_LOV_CREATED = (1 << 3), -}; - struct mdt_lock_handle { - /* Lock type, reg for cross-ref use or pdo lock. */ - mdl_type_t mlh_type; + /* Lock type, reg for cross-ref use or pdo lock. */ + mdl_type_t mlh_type; - /* Regular lock */ - struct lustre_handle mlh_reg_lh; - ldlm_mode_t mlh_reg_mode; + /* Regular lock */ + struct lustre_handle mlh_reg_lh; + enum ldlm_mode mlh_reg_mode; - /* Pdirops lock */ - struct lustre_handle mlh_pdo_lh; - ldlm_mode_t mlh_pdo_mode; - unsigned int mlh_pdo_hash; + /* Pdirops lock */ + struct lustre_handle mlh_pdo_lh; + enum ldlm_mode mlh_pdo_mode; + unsigned int mlh_pdo_hash; /* Remote regular lock */ - struct lustre_handle mlh_rreg_lh; - ldlm_mode_t mlh_rreg_mode; + struct lustre_handle mlh_rreg_lh; + enum ldlm_mode mlh_rreg_mode; }; enum { @@ -327,7 +295,7 @@ struct mdt_reint_record { const struct lu_fid *rr_fid2; struct lu_name rr_name; struct lu_name rr_tgt_name; - const void *rr_eadata; + void *rr_eadata; int rr_eadatalen; __u32 rr_flags; }; @@ -424,43 +392,35 @@ struct mdt_thread_info { * They should be initialized explicitly by the user themselves. */ - /* XXX: If something is in a union, make sure they do not conflict */ - - struct lu_fid mti_tmp_fid1; - struct lu_fid mti_tmp_fid2; - ldlm_policy_data_t mti_policy; /* for mdt_object_lock() and - * mdt_rename_lock() */ - struct ldlm_res_id mti_res_id; /* for mdt_object_lock() and - mdt_rename_lock() */ - union { - struct obd_uuid uuid[2]; /* for mdt_seq_init_cli() */ - char ns_name[48]; /* for mdt_init0() */ - struct lustre_cfg_bufs bufs; /* for mdt_stack_fini() */ - struct obd_statfs osfs; /* for mdt_statfs() */ + /* XXX: If something is in a union, make sure they do not conflict */ + struct lu_fid mti_tmp_fid1; + struct lu_fid mti_tmp_fid2; + union ldlm_policy_data mti_policy; /* for mdt_object_lock() */ + struct ldlm_res_id mti_res_id; /* and mdt_rename_lock() */ + union { + struct obd_uuid uuid[2]; /* for mdt_seq_init_cli() */ + char ns_name[48];/* for mdt_init0() */ + struct lustre_cfg_bufs bufs; /* for mdt_stack_fini() */ + struct obd_statfs osfs; /* for mdt_statfs() */ struct { /* for mdt_readpage() */ struct lu_rdpg mti_rdpg; /* for mdt_sendpage() */ struct l_wait_info mti_wait_info; } rdpg; - struct { - struct md_attr attr; - struct md_som_data data; - } som; + struct { + struct md_attr attr; + } hsm; } mti_u; - /* IO epoch related stuff. */ - struct mdt_ioepoch *mti_ioepoch; - __u64 mti_replayepoch; - + struct lustre_handle mti_close_handle; loff_t mti_off; struct lu_buf mti_buf; struct lu_buf mti_big_buf; - struct lustre_capa_key mti_capa_key; /* Ops object filename */ struct lu_name mti_name; - /* per-thread values, can be re-used */ + /* per-thread values, can be re-used, may be vmalloc'd */ void *mti_big_lmm; int mti_big_lmmsize; /* big_lmm buffer was used and must be used in reply */ @@ -468,6 +428,7 @@ struct mdt_thread_info { /* should be enough to fit lustre_mdt_attrs */ char mti_xattr_buf[128]; struct ldlm_enqueue_info mti_einfo; + struct tg_reply_data *mti_reply_data; }; extern struct lu_context_key mdt_thread_key; @@ -597,7 +558,6 @@ static inline struct seq_server_site *mdt_seq_site(struct mdt_device *mdt) static inline void mdt_export_evict(struct obd_export *exp) { class_fail_export(exp); - class_export_put(exp); } /* Here we use LVB_TYPE to check dne client, because it is @@ -612,43 +572,41 @@ static inline bool mdt_is_striped_client(struct obd_export *exp) return exp_connect_flags(exp) & OBD_CONNECT_DIR_STRIPE; } -int mdt_get_disposition(struct ldlm_reply *rep, int flag); +__u64 mdt_get_disposition(struct ldlm_reply *rep, __u64 op_flag); void mdt_set_disposition(struct mdt_thread_info *info, - struct ldlm_reply *rep, int flag); + struct ldlm_reply *rep, __u64 op_flag); void mdt_clear_disposition(struct mdt_thread_info *info, - struct ldlm_reply *rep, int flag); + struct ldlm_reply *rep, __u64 op_flag); -void mdt_lock_pdo_init(struct mdt_lock_handle *lh, - ldlm_mode_t lock_mode, +void mdt_lock_pdo_init(struct mdt_lock_handle *lh, enum ldlm_mode lock_mode, const struct lu_name *lname); -void mdt_lock_reg_init(struct mdt_lock_handle *lh, - ldlm_mode_t lm); +void mdt_lock_reg_init(struct mdt_lock_handle *lh, enum ldlm_mode lm); -int mdt_lock_setup(struct mdt_thread_info *info, - struct mdt_object *o, - struct mdt_lock_handle *lh); +int mdt_lock_setup(struct mdt_thread_info *info, struct mdt_object *mo, + struct mdt_lock_handle *lh); -int mdt_check_resent_lock(struct mdt_thread_info *info, - struct mdt_object *mo, +int mdt_check_resent_lock(struct mdt_thread_info *info, struct mdt_object *mo, struct mdt_lock_handle *lhc); -int mdt_object_lock(struct mdt_thread_info *, - struct mdt_object *, - struct mdt_lock_handle *, - __u64, int); +int mdt_object_lock(struct mdt_thread_info *info, struct mdt_object *mo, + struct mdt_lock_handle *lh, __u64 ibits); -int mdt_object_lock_try(struct mdt_thread_info *, - struct mdt_object *, - struct mdt_lock_handle *, - __u64, int); +int mdt_reint_object_lock(struct mdt_thread_info *info, struct mdt_object *o, + struct mdt_lock_handle *lh, __u64 ibits, + bool cos_incompat); -void mdt_object_unlock(struct mdt_thread_info *, - struct mdt_object *, - struct mdt_lock_handle *, - int decref); +int mdt_object_lock_try(struct mdt_thread_info *info, struct mdt_object *mo, + struct mdt_lock_handle *lh, __u64 ibits); -struct mdt_object *mdt_object_new(const struct lu_env *, +int mdt_reint_object_lock_try(struct mdt_thread_info *info, + struct mdt_object *o, struct mdt_lock_handle *lh, + __u64 ibits, bool cos_incompat); + +void mdt_object_unlock(struct mdt_thread_info *info, struct mdt_object *mo, + struct mdt_lock_handle *lh, int decref); + +struct mdt_object *mdt_object_new(const struct lu_env *env, struct mdt_device *, const struct lu_fid *); struct mdt_object *mdt_object_find(const struct lu_env *, @@ -668,7 +626,7 @@ void mdt_client_compatibility(struct mdt_thread_info *info); int mdt_remote_object_lock(struct mdt_thread_info *mti, struct mdt_object *o, const struct lu_fid *fid, struct lustre_handle *lh, - ldlm_mode_t mode, __u64 ibits); + enum ldlm_mode mode, __u64 ibits, bool nonblock); enum mdt_name_flags { MNF_FIX_ANON = 1, @@ -681,6 +639,10 @@ int mdt_name_unpack(struct req_capsule *pill, int mdt_close_unpack(struct mdt_thread_info *info); int mdt_reint_unpack(struct mdt_thread_info *info, __u32 op); int mdt_reint_rec(struct mdt_thread_info *, struct mdt_lock_handle *); +#ifdef CONFIG_FS_POSIX_ACL +int mdt_pack_acl2body(struct mdt_thread_info *info, struct mdt_body *repbody, + struct mdt_object *o, struct lu_nodemap *nodemap); +#endif void mdt_pack_attr2body(struct mdt_thread_info *info, struct mdt_body *b, const struct lu_attr *attr, const struct lu_fid *fid); @@ -720,17 +682,6 @@ struct mdt_file_data *mdt_handle2mfd(struct mdt_export_data *med, const struct lustre_handle *handle, bool is_replay); -enum { - MDT_IOEPOCH_CLOSED = 0, - MDT_IOEPOCH_OPENED = 1, - MDT_IOEPOCH_GETATTR = 2, -}; - -enum { - MDT_SOM_DISABLE = 0, - 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); @@ -738,9 +689,6 @@ int mdt_big_xattr_get(struct mdt_thread_info *info, struct mdt_object *o, const char *name); int mdt_stripe_get(struct mdt_thread_info *info, struct mdt_object *o, struct md_attr *ma, const char *name); -int mdt_ioepoch_open(struct mdt_thread_info *info, struct mdt_object *o, - int created); -int mdt_object_is_som_enabled(struct mdt_object *mo); int mdt_write_get(struct mdt_object *o); void mdt_write_put(struct mdt_object *o); int mdt_write_read(struct mdt_object *o); @@ -748,11 +696,8 @@ 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 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 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 *); @@ -765,8 +710,10 @@ const struct lu_buf *mdt_buf_const(const struct lu_env *env, void mdt_dump_lmm(int level, const struct lov_mds_md *lmm, __u64 valid); void mdt_dump_lmv(unsigned int level, const union lmv_mds_md *lmv); +bool allow_client_chgrp(struct mdt_thread_info *info, struct lu_ucred *uc); int mdt_check_ucred(struct mdt_thread_info *); int mdt_init_ucred(struct mdt_thread_info *, struct mdt_body *); +int mdt_init_ucred_intent_getattr(struct mdt_thread_info *, struct mdt_body *); int mdt_init_ucred_reint(struct mdt_thread_info *); void mdt_exit_ucred(struct mdt_thread_info *); int mdt_version_get_check(struct mdt_thread_info *, struct mdt_object *, int); @@ -786,6 +733,8 @@ int mdt_remote_blocking_ast(struct ldlm_lock *lock, struct ldlm_lock_desc *desc, int mdt_links_read(struct mdt_thread_info *info, struct mdt_object *mdt_obj, struct linkea_data *ldata); +int mdt_close_internal(struct mdt_thread_info *info, struct ptlrpc_request *req, + struct mdt_body *repbody); /* mdt_idmap.c */ int mdt_init_idmap(struct tgt_session_info *tsi); void mdt_cleanup_idmap(struct mdt_export_data *); @@ -834,6 +783,9 @@ __u32 mdt_identity_get_perm(struct md_identity *, __u32, lnet_nid_t); int mdt_pack_remote_perm(struct mdt_thread_info *, struct mdt_object *, void *); +/* mdt/mdt_recovery.c */ +__u64 mdt_req_from_lrd(struct ptlrpc_request *req, struct tg_reply_data *trd); + /* mdt/mdt_hsm.c */ int mdt_hsm_state_get(struct tgt_session_info *tsi); int mdt_hsm_state_set(struct tgt_session_info *tsi); @@ -855,9 +807,6 @@ int mdt_agent_record_add(const struct lu_env *env, struct mdt_device *mdt, int mdt_agent_record_update(const struct lu_env *env, struct mdt_device *mdt, __u64 *cookies, int cookies_count, enum agent_req_status status); -int mdt_agent_llog_update_rec(const struct lu_env *env, struct mdt_device *mdt, - struct llog_handle *llh, - struct llog_agent_req_rec *larr); /* mdt/mdt_hsm_cdt_agent.c */ extern const struct file_operations mdt_hsm_agent_fops; @@ -907,6 +856,8 @@ int mdt_cdt_remove_request(struct coordinator *cdt, __u64 cookie); /* mdt/mdt_coordinator.c */ void mdt_hsm_dump_hal(int level, const char *prefix, struct hsm_action_list *hal); +struct cdt_restore_handle *mdt_hsm_restore_hdl_find(struct coordinator *cdt, + const struct lu_fid *fid); /* coordinator management */ int mdt_hsm_cdt_init(struct mdt_device *mdt); int mdt_hsm_cdt_start(struct mdt_device *mdt); @@ -915,12 +866,13 @@ int mdt_hsm_cdt_fini(struct mdt_device *mdt); int mdt_hsm_cdt_wakeup(struct mdt_device *mdt); /* coordinator control /proc interface */ -ssize_t mdt_hsm_cdt_control_seq_write(struct file *file, const char *buffer, - size_t count, loff_t *off); +ssize_t mdt_hsm_cdt_control_seq_write(struct file *file, + const char __user *buffer, + size_t count, loff_t *off); int mdt_hsm_cdt_control_seq_show(struct seq_file *m, void *data); int hsm_cdt_procfs_init(struct mdt_device *mdt); void hsm_cdt_procfs_fini(struct mdt_device *mdt); -struct lprocfs_seq_vars *hsm_cdt_get_proc_vars(void); +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, @@ -935,20 +887,23 @@ int mdt_hsm_update_request_state(struct mdt_thread_info *mti, struct hsm_progress_kernel *pgs, const int update_record); +int mdt_close_swap_layouts(struct mdt_thread_info *info, + struct mdt_object *o, struct md_attr *ma); + 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) { - if (OBD_FAIL_CHECK_ORSET(id, OBD_FAIL_ONCE)) { - CERROR(LUSTRE_MDT_NAME": cfs_fail_loc=%x, fail write ops\n", - id); - return dd->dd_ops->dt_ro(env, dd); - /* We set FAIL_ONCE because we never "un-fail" a device */ - } - - return 0; + if (OBD_FAIL_CHECK_ORSET(id, OBD_FAIL_ONCE)) { + CERROR(LUSTRE_MDT_NAME": cfs_fail_loc=%x, fail write ops\n", + id); + return dt_ro(env, dd); + /* We set FAIL_ONCE because we never "un-fail" a device */ + } + + return 0; } static inline struct mdt_export_data *mdt_req2med(struct ptlrpc_request *req) @@ -967,18 +922,27 @@ static inline int mdt_check_resent(struct mdt_thread_info *info, mdt_reconstruct_t reconstruct, struct mdt_lock_handle *lhc) { - struct ptlrpc_request *req = mdt_info_req(info); - ENTRY; - - if (lustre_msg_get_flags(req->rq_reqmsg) & MSG_RESENT) { - if (req_xid_is_last(req)) { - reconstruct(info, lhc); - RETURN(1); - } - DEBUG_REQ(D_HA, req, "no reply for RESENT req (have "LPD64")", - req->rq_export->exp_target_data.ted_lcd->lcd_last_xid); - } - RETURN(0); + struct ptlrpc_request *req = mdt_info_req(info); + int rc = 0; + ENTRY; + + if (lustre_msg_get_flags(req->rq_reqmsg) & MSG_RESENT) { + OBD_ALLOC_PTR(info->mti_reply_data); + if (info->mti_reply_data == NULL) + RETURN(-ENOMEM); + + if (req_can_reconstruct(req, info->mti_reply_data)) { + reconstruct(info, lhc); + rc = 1; + } else { + DEBUG_REQ(D_HA, req, + "no reply data found for RESENT req"); + rc = 0; + } + OBD_FREE_PTR(info->mti_reply_data); + info->mti_reply_data = NULL; + } + RETURN(rc); } struct lu_ucred *mdt_ucred(const struct mdt_thread_info *info); @@ -993,43 +957,46 @@ int mdt_blocking_ast(struct ldlm_lock*, struct ldlm_lock_desc*, void*, int); /* Issues dlm lock on passed @ns, @f stores it lock handle into @lh. */ static inline int mdt_fid_lock(struct ldlm_namespace *ns, - struct lustre_handle *lh, - ldlm_mode_t mode, - ldlm_policy_data_t *policy, - const struct ldlm_res_id *res_id, + struct lustre_handle *lh, enum ldlm_mode mode, + union ldlm_policy_data *policy, + const struct ldlm_res_id *res_id, __u64 flags, const __u64 *client_cookie) { - int rc; + int rc; - LASSERT(ns != NULL); - LASSERT(lh != NULL); + LASSERT(ns != NULL); + LASSERT(lh != NULL); - rc = ldlm_cli_enqueue_local(ns, res_id, LDLM_IBITS, policy, - mode, &flags, mdt_blocking_ast, - ldlm_completion_ast, NULL, NULL, 0, + rc = ldlm_cli_enqueue_local(ns, res_id, LDLM_IBITS, policy, + mode, &flags, mdt_blocking_ast, + ldlm_completion_ast, NULL, NULL, 0, LVB_T_NONE, client_cookie, lh); - return rc == ELDLM_OK ? 0 : -EIO; + return rc == ELDLM_OK ? 0 : -EIO; } -static inline void mdt_fid_unlock(struct lustre_handle *lh, - ldlm_mode_t mode) +static inline void mdt_fid_unlock(struct lustre_handle *lh, enum ldlm_mode mode) { - ldlm_lock_decref(lh, mode); + ldlm_lock_decref(lh, mode); +} + +static inline bool mdt_slc_is_enabled(struct mdt_device *mdt) +{ + return mdt->mdt_lut.lut_sync_lock_cancel == BLOCKING_SYNC_ON_CANCEL; } extern mdl_mode_t mdt_mdl_lock_modes[]; -extern ldlm_mode_t mdt_dlm_lock_modes[]; +extern enum ldlm_mode mdt_dlm_lock_modes[]; -static inline mdl_mode_t mdt_dlm_mode2mdl_mode(ldlm_mode_t mode) +static inline mdl_mode_t mdt_dlm_mode2mdl_mode(enum ldlm_mode mode) { - LASSERT(IS_PO2(mode)); - return mdt_mdl_lock_modes[mode]; + LASSERT(IS_PO2(mode)); + return mdt_mdl_lock_modes[mode]; } -static inline ldlm_mode_t mdt_mdl_mode2dlm_mode(mdl_mode_t mode) +static inline enum ldlm_mode mdt_mdl_mode2dlm_mode(mdl_mode_t mode) { - LASSERT(IS_PO2(mode)); - return mdt_dlm_lock_modes[mode]; + LASSERT(IS_PO2(mode)); + return mdt_dlm_lock_modes[mode]; } /* mdt_lvb.c */ @@ -1071,15 +1038,6 @@ void mdt_rename_counter_tally(struct mdt_thread_info *info, struct ptlrpc_request *req, struct mdt_object *src, struct mdt_object *tgt); -/* Capability */ -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); -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) { return mdt->mdt_lu_dev.ld_obd; @@ -1095,5 +1053,15 @@ static inline char *mdt_obd_name(struct mdt_device *mdt) int mds_mod_init(void); void mds_mod_exit(void); -#endif /* __KERNEL__ */ -#endif /* _MDT_H */ +static inline char *mdt_req_get_jobid(struct ptlrpc_request *req) +{ + struct obd_export *exp = req->rq_export; + char *jobid = NULL; + + if (exp_connect_flags(exp) & OBD_CONNECT_JOBSTATS) + jobid = lustre_msg_get_jobid(req->rq_reqmsg); + + return jobid; +} + +#endif /* _MDT_INTERNAL_H */