X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;ds=sidebyside;f=lustre%2Fmdt%2Fmdt_internal.h;h=89d89ace08f2ff72028c7ab8d491cb02a4993aa1;hb=dded1e7283d66ebf673901caed90588a58096086;hp=2e163b935cb4a2395717b0b99280f8371017b759;hpb=42e786f742fa3d13f7d6b66afaba63e77707015c;p=fs%2Flustre-release.git diff --git a/lustre/mdt/mdt_internal.h b/lustre/mdt/mdt_internal.h index 2e163b9..89d89ac 100644 --- a/lustre/mdt/mdt_internal.h +++ b/lustre/mdt/mdt_internal.h @@ -15,11 +15,7 @@ * * You should have received a copy of the GNU General Public License * version 2 along with this program; If not, see - * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. + * http://www.gnu.org/licenses/gpl-2.0.html * * GPL HEADER END */ @@ -27,7 +23,7 @@ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2011, 2015, Intel Corporation. + * Copyright (c) 2011, 2016, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -48,7 +44,8 @@ #ifndef _MDT_INTERNAL_H #define _MDT_INTERNAL_H - +#include +#include #include #include #include @@ -109,7 +106,8 @@ enum cdt_states { CDT_STOPPED = 0, * cdt_request_lock */ struct coordinator { - struct ptlrpc_thread cdt_thread; /**< coordinator thread */ + wait_queue_head_t cdt_waitq; /**< cdt wait queue */ + unsigned int cdt_flags; /**< cdt event flags */ struct lu_env cdt_env; /**< coordinator lustre * env */ struct lu_context cdt_session; /** session for lu_ucred */ @@ -138,8 +136,11 @@ struct coordinator { * requests */ atomic_t cdt_request_count; /**< current count of * started requests */ - struct list_head cdt_requests; /**< list of started - * requests */ + /* started requests (struct cdt_agent_req:car_cookie_hash) + * indexed by cookie */ + struct cfs_hash *cdt_request_cookie_hash; + /* started requests (struct cdt_agent_req:car_request_list) */ + struct list_head cdt_request_list; struct list_head cdt_agents; /**< list of register * agents */ struct list_head cdt_restore_hdl; /**< list of restore lock @@ -195,13 +196,17 @@ struct mdt_device { unsigned int mdt_capa_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; + + /* lock for osfs and md_root */ + spinlock_t mdt_lock; + /* statfs optimization: we cache a bit */ struct obd_statfs mdt_osfs; __u64 mdt_osfs_age; - spinlock_t mdt_osfs_lock; /* root squash */ struct root_squash_info mdt_squash; @@ -215,20 +220,25 @@ 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; + + struct mdt_object *mdt_md_root; }; #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; - enum mdt_object_flags mot_flags; + unsigned int mot_lov_created:1, /* lov object created */ + mot_cache_attr:1; /* enable remote object + * attribute cache */ int mot_write_count; spinlock_t mot_write_lock; /* Lock to protect create_data */ @@ -413,7 +423,7 @@ struct mdt_thread_info { /* 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 */ @@ -448,6 +458,7 @@ struct cdt_req_progress { }; struct cdt_agent_req { + struct hlist_node car_cookie_hash; /**< find req by cookie */ struct list_head car_request_list; /**< to chain all the req. */ atomic_t car_refcount; /**< reference counter */ __u64 car_compound_id; /**< compound id */ @@ -585,9 +596,17 @@ int mdt_check_resent_lock(struct mdt_thread_info *info, struct mdt_object *mo, int mdt_object_lock(struct mdt_thread_info *info, struct mdt_object *mo, struct mdt_lock_handle *lh, __u64 ibits); +int mdt_reint_object_lock(struct mdt_thread_info *info, struct mdt_object *o, + struct mdt_lock_handle *lh, __u64 ibits, + bool cos_incompat); + int mdt_object_lock_try(struct mdt_thread_info *info, struct mdt_object *mo, struct mdt_lock_handle *lh, __u64 ibits); +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); @@ -611,7 +630,8 @@ 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, - enum ldlm_mode mode, __u64 ibits, bool nonblock); + enum ldlm_mode mode, __u64 ibits, bool nonblock, + bool cache); enum mdt_name_flags { MNF_FIX_ANON = 1, @@ -623,6 +643,7 @@ int mdt_name_unpack(struct req_capsule *pill, enum mdt_name_flags flags); int mdt_close_unpack(struct mdt_thread_info *info); int mdt_reint_unpack(struct mdt_thread_info *info, __u32 op); +void mdt_fix_lov_magic(struct mdt_thread_info *info, void *eadata); 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, @@ -720,17 +741,6 @@ int mdt_links_read(struct mdt_thread_info *info, 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 *); -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 *, - struct mdt_body *); -int mdt_remote_perm_reverse_idmap(struct ptlrpc_request *, - struct mdt_remote_perm *); -int mdt_fix_attr_ucred(struct mdt_thread_info *, __u32); static inline struct mdt_device *mdt_dev(struct lu_device *d) { @@ -753,6 +763,12 @@ static inline struct dt_object *mdt_obj2dt(struct mdt_object *mo) return lu2dt(lo); } +static inline bool agent_req_in_final_state(enum agent_req_status ars) +{ + return ((ars == ARS_SUCCEED) || (ars == ARS_FAILED) || + (ars == ARS_CANCELED)); +} + /* mdt/mdt_identity.c */ #define MDT_IDENTITY_UPCALL_PATH "/usr/sbin/l_getidentity" @@ -764,9 +780,7 @@ void mdt_identity_put(struct upcall_cache *, struct md_identity *); void mdt_flush_identity(struct upcall_cache *, int); -__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 *); +__u32 mdt_identity_get_perm(struct md_identity *, lnet_nid_t); /* mdt/mdt_recovery.c */ __u64 mdt_req_from_lrd(struct ptlrpc_request *req, struct tg_reply_data *trd); @@ -792,9 +806,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; @@ -817,14 +828,13 @@ int mdt_hsm_coordinator_update(struct mdt_thread_info *mti, struct hsm_progress_kernel *pgs); /* mdt/mdt_hsm_cdt_client.c */ int mdt_hsm_add_actions(struct mdt_thread_info *info, - struct hsm_action_list *hal, __u64 *compound_id); -int mdt_hsm_get_actions(struct mdt_thread_info *mti, struct hsm_action_list *hal); -int mdt_hsm_get_running(struct mdt_thread_info *mti, +int mdt_hsm_get_actions(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 struct cfs_hash_ops cdt_request_cookie_hash_ops; 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, @@ -832,9 +842,7 @@ struct cdt_agent_req *mdt_cdt_alloc_request(__u64 compound_id, __u32 archive_id, struct hsm_action_item *hai); 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, - const __u64 cookie, - const struct lu_fid *fid); +struct cdt_agent_req *mdt_cdt_find_request(struct coordinator *cdt, u64 cookie); 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); @@ -844,16 +852,18 @@ 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); 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 */ -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); @@ -881,14 +891,14 @@ extern struct lu_context_key mdt_thread_key; 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) @@ -901,6 +911,14 @@ static inline struct mdt_device *mdt_exp2dev(struct obd_export *exp) return mdt_dev(exp->exp_obd->obd_lu_dev); } +static inline bool mdt_rdonly(struct obd_export *exp) +{ + if (exp_connect_flags(exp) & OBD_CONNECT_RDONLY || + mdt_exp2dev(exp)->mdt_bottom->dd_rdonly) + return true; + return false; +} + typedef void (*mdt_reconstruct_t)(struct mdt_thread_info *mti, struct mdt_lock_handle *lhc); static inline int mdt_check_resent(struct mdt_thread_info *info, @@ -964,18 +982,25 @@ static inline void mdt_fid_unlock(struct lustre_handle *lh, enum ldlm_mode 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 enum ldlm_mode mdt_dlm_lock_modes[]; +/* LCK_MINMODE which is zero returns false for is_power_of_2 */ + static inline mdl_mode_t mdt_dlm_mode2mdl_mode(enum ldlm_mode mode) { - LASSERT(IS_PO2(mode)); + LASSERT(mode == LCK_MINMODE || is_power_of_2(mode)); return mdt_mdl_lock_modes[mode]; } static inline enum ldlm_mode mdt_mdl_mode2dlm_mode(mdl_mode_t mode) { - LASSERT(IS_PO2(mode)); + LASSERT(mode == MDL_MINMODE || is_power_of_2(mode)); return mdt_dlm_lock_modes[mode]; }