X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Finclude%2Fobd.h;h=e69ac779527987802d9aebc9f82fcaadb343c83a;hb=e90f40d9546a276c674220038432765794f7fc6e;hp=56d89184097269e1be75b5ca3647a0f5c1f99c31;hpb=8c82ab5cd92ee70a4cda2fe6437861e56f3fe3d5;p=fs%2Flustre-release.git diff --git a/lustre/include/obd.h b/lustre/include/obd.h index 56d8918..e69ac77 100644 --- a/lustre/include/obd.h +++ b/lustre/include/obd.h @@ -34,6 +34,10 @@ #include #include #include +#include + +#include + #define MAX_OBD_DEVICES 8192 @@ -48,7 +52,7 @@ struct loi_oap_pages { struct osc_async_rc { int ar_rc; int ar_force_sync; - int ar_min_xid; + __u64 ar_min_xid; }; struct lov_oinfo { /* per-stripe data structure */ @@ -65,7 +69,7 @@ struct lov_oinfo { /* per-stripe data structure */ struct list_head loi_write_item; struct list_head loi_read_item; - unsigned loi_kms_valid:1; + unsigned long loi_kms_valid:1; __u64 loi_kms; /* known minimum size */ struct ost_lvb loi_lvb; struct osc_async_rc loi_ar; @@ -101,7 +105,7 @@ struct lov_array_info { struct lov_stripe_md { spinlock_t lsm_lock; - void *lsm_lock_owner; /* debugging */ + pid_t lsm_lock_owner; /* debugging */ struct { /* Public members. */ @@ -132,31 +136,18 @@ struct obd_info; typedef int (*obd_enqueue_update_f)(struct obd_info *oinfo, int rc); -/* obd_enqueue parameters common for all levels (lov, osc). */ -struct obd_enqueue_info { - /* Flags used while lock handling. */ - int ei_flags; - /* Type of the lock being enqueued. */ - __u32 ei_type; - /* Mode of the lock being enqueued. */ - __u32 ei_mode; - /* Different callbacks for lock handling (blocking, completion, - glimpse */ - void *ei_cb_bl; - void *ei_cb_cp; - void *ei_cb_gl; - /* Data to be passed into callbacks. */ - void *ei_cbdata; - /* Request set for OSC async requests. */ - struct ptlrpc_request_set *ei_rqset; -}; - /* obd info for a particular level (lov, osc). */ struct obd_info { /* Lock policy. It keeps an extent which is specific for a particular * OSC. (e.g. lov_prep_enqueue_set initialises extent of the policy, * and osc_enqueue passes it into ldlm_lock_match & ldlm_cli_enqueue. */ ldlm_policy_data_t oi_policy; + /* Flags used for set request specific flags: + - while lock handling, the flags obtained on the enqueue + request are set here. + - while stats, the flags used for control delay/resend. + */ + int oi_flags; /* Lock handle specific for every OSC lock. */ struct lustre_handle *oi_lockh; /* lsm data specific for every OSC. */ @@ -250,7 +241,7 @@ struct oig_callback_context { * callees of this method are encouraged to abort their state * in the oig. This may be called multiple times. */ void (*occ_interrupted)(struct oig_callback_context *occ); - unsigned int interrupted:1; + unsigned long interrupted:1; }; /* Individual type definitions */ @@ -264,31 +255,30 @@ struct obd_device_target { struct lustre_quota_ctxt obt_qctxt; }; +typedef void (*obd_pin_extent_cb)(void *data); +typedef int (*obd_page_removal_cb_t)(void *data, int discard); +typedef int (*obd_lock_cancel_cb)(struct ldlm_lock *,struct ldlm_lock_desc *, + void *, int); + /* llog contexts */ enum llog_ctxt_id { LLOG_CONFIG_ORIG_CTXT = 0, - LLOG_CONFIG_REPL_CTXT = 1, - LLOG_MDS_OST_ORIG_CTXT = 2, - LLOG_MDS_OST_REPL_CTXT = 3, - LLOG_SIZE_ORIG_CTXT = 4, - LLOG_SIZE_REPL_CTXT = 5, - LLOG_MD_ORIG_CTXT = 6, - LLOG_MD_REPL_CTXT = 7, - LLOG_RD1_ORIG_CTXT = 8, - LLOG_RD1_REPL_CTXT = 9, - LLOG_TEST_ORIG_CTXT = 10, - LLOG_TEST_REPL_CTXT = 11, - LLOG_LOVEA_ORIG_CTXT = 12, - LLOG_LOVEA_REPL_CTXT = 13, + LLOG_CONFIG_REPL_CTXT, + LLOG_MDS_OST_ORIG_CTXT, + LLOG_MDS_OST_REPL_CTXT, + LLOG_SIZE_ORIG_CTXT, + LLOG_SIZE_REPL_CTXT, + LLOG_RD1_ORIG_CTXT, + LLOG_RD1_REPL_CTXT, + LLOG_TEST_ORIG_CTXT, + LLOG_TEST_REPL_CTXT, + LLOG_LOVEA_ORIG_CTXT, + LLOG_LOVEA_REPL_CTXT, LLOG_MAX_CTXTS }; #define FILTER_SUBDIR_COUNT 32 /* set to zero for no subdirs */ -#define FILTER_GROUP_LLOG 1 -#define FILTER_GROUP_ECHO 2 -#define FILTER_GROUP_MDS0 3 - struct filter_subdirs { cfs_dentry_t *dentry[FILTER_SUBDIR_COUNT]; }; @@ -299,17 +289,6 @@ struct filter_ext { __u64 fe_end; }; -struct obd_llogs { - struct llog_ctxt *llog_ctxt[LLOG_MAX_CTXTS]; -}; - -struct filter_group_llog { - struct list_head list; - int group; - struct obd_llogs *llogs; - struct obd_export *exp; -}; - struct filter_obd { /* NB this field MUST be first */ struct obd_device_target fo_obt; @@ -382,22 +361,30 @@ struct filter_obd { int fo_fmd_max_num; /* per exp filter_mod_data */ int fo_fmd_max_age; /* jiffies to fmd expiry */ + /* sptlrpc stuff */ + rwlock_t fo_sptlrpc_lock; + struct sptlrpc_rule_set fo_sptlrpc_rset; + /* capability related */ unsigned int fo_fl_oss_capa; struct list_head fo_capa_keys; struct hlist_head *fo_capa_hash; + + void *fo_lcm; }; #define OSC_MAX_RIF_DEFAULT 8 #define OSC_MAX_RIF_MAX 256 #define OSC_MAX_DIRTY_DEFAULT (OSC_MAX_RIF_DEFAULT * 4) #define OSC_MAX_DIRTY_MB_MAX 2048 /* arbitrary, but < MAX_LONG bytes */ +#define OSC_DEFAULT_RESENDS 10 #define MDC_MAX_RIF_DEFAULT 8 #define MDC_MAX_RIF_MAX 512 struct mdc_rpc_lock; struct obd_import; +struct lustre_cache; struct client_obd { struct semaphore cl_sem; struct obd_uuid cl_target_uuid; @@ -410,7 +397,8 @@ struct client_obd { int cl_max_mds_cookiesize; /* security configuration */ - struct sec_flavor_config cl_sec_conf; + struct sptlrpc_rule_set cl_sptlrpc_rset; + enum lustre_sec_part cl_sec_part; //struct llog_canceld_ctxt *cl_llcd; /* it's included by obd_llog_ctxt */ void *cl_llcd_offset; @@ -458,6 +446,10 @@ struct client_obd { struct obd_histogram cl_read_offset_hist; struct obd_histogram cl_write_offset_hist; + /* number of in flight destroy rpcs is limited to max_rpcs_in_flight */ + atomic_t cl_destroy_in_flight; + cfs_waitq_t cl_destroy_waitq; + struct mdc_rpc_lock *cl_rpc_lock; struct mdc_rpc_lock *cl_setattr_lock; struct mdc_rpc_lock *cl_close_lock; @@ -470,9 +462,13 @@ struct client_obd { atomic_t cl_mgc_refcount; struct obd_export *cl_mgc_mgsexp; - /* Flags section */ - unsigned int cl_checksum:1; /* debug checksums */ - + /* checksumming for data sent over the network */ + unsigned int cl_checksum:1; /* 0 = disabled, 1 = enabled */ + /* supported checksum types that are worked out at connect time */ + __u32 cl_supp_cksum_types; + /* checksum algorithm to be used */ + cksum_type_t cl_cksum_type; + /* also protected by the poorly named _loi_list_lock lock above */ struct osc_async_rc cl_ar; @@ -481,6 +477,12 @@ struct client_obd { /* sequence manager */ struct lu_client_seq *cl_seq; + + atomic_t cl_resends; /* resend count */ + + /* Cache of triples */ + struct lustre_cache *cl_cache; + obd_lock_cancel_cb cl_ext_lock_cancel_cb; }; #define obd2cli_tgt(obd) ((char *)(obd)->u.cli.cl_target_uuid.uuid) @@ -497,15 +499,6 @@ struct mgs_obd { cfs_proc_dir_entry_t *mgs_proc_live; }; -/* hah, upper limit 64 should be enough */ -#define N_NOSQUASH_NIDS 64 -struct rootsquash_info { - uid_t rsi_uid; - gid_t rsi_gid; - int rsi_n_nosquash_nids; - lnet_nid_t rsi_nosquash_nids[N_NOSQUASH_NIDS]; -}; - struct mds_obd { /* NB this field MUST be first */ struct obd_device_target mds_obt; @@ -529,19 +522,23 @@ struct mds_obd { cfs_dentry_t *mds_logs_dir; cfs_dentry_t *mds_objects_dir; struct llog_handle *mds_cfg_llh; -// struct llog_handle *mds_catalog; struct obd_device *mds_osc_obd; /* XXX lov_obd */ struct obd_uuid mds_lov_uuid; char *mds_profile; struct obd_export *mds_osc_exp; /* XXX lov_exp */ struct lov_desc mds_lov_desc; __u32 mds_id; - obd_id *mds_lov_objids; - int mds_lov_objids_size; - __u32 mds_lov_objids_in_file; - unsigned int mds_lov_objids_dirty:1; - int mds_lov_nextid_set; + + /* mark pages dirty for write. */ + bitmap_t *mds_lov_page_dirty; + /* array for store pages with obd_id */ + void **mds_lov_page_array; + /* file for store objid */ struct file *mds_lov_objid_filp; + __u32 mds_lov_objid_count; + __u32 mds_lov_objid_lastpage; + __u32 mds_lov_objid_lastidx; + struct file *mds_health_check_filp; unsigned long *mds_client_bitmap; // struct upcall_cache *mds_group_hash; @@ -549,21 +546,37 @@ struct mds_obd { struct lustre_quota_info mds_quota_info; struct semaphore mds_qonoff_sem; struct semaphore mds_health_sem; - unsigned long mds_lov_objids_valid:1, - mds_fl_user_xattr:1, - mds_fl_acl:1; - + unsigned long mds_fl_user_xattr:1, + mds_fl_acl:1, + mds_evict_ost_nids:1, + mds_fl_cfglog:1, + mds_fl_synced:1; struct upcall_cache *mds_identity_cache; - struct upcall_cache *mds_rmtacl_cache; - - /* root squash */ - struct rootsquash_info *mds_rootsquash_info; /* for capability keys update */ struct lustre_capa_key *mds_capa_keys; }; +/* lov objid */ +extern __u32 mds_max_ost_index; + +#define MDS_LOV_ALLOC_SIZE (CFS_PAGE_SIZE) + +#define OBJID_PER_PAGE() (MDS_LOV_ALLOC_SIZE / sizeof(obd_id)) + +#define MDS_LOV_OBJID_PAGES_COUNT (mds_max_ost_index/OBJID_PER_PAGE()) + +extern int mds_lov_init_objids(struct obd_device *obd); +extern void mds_lov_destroy_objids(struct obd_device *obd); + +struct obd_id_info { + __u32 idx; + obd_id *data; +}; + +/* */ + struct echo_obd { struct obdo eo_oa; spinlock_t eo_lock; @@ -611,7 +624,7 @@ struct lov_qos { __u32 *lq_rr_array; /* round-robin optimized list */ unsigned int lq_rr_size; /* rr array size */ unsigned int lq_prio_free; /* priority for free space */ - unsigned int lq_dirty:1, /* recalc qos data */ + unsigned long lq_dirty:1, /* recalc qos data */ lq_dirty_rr:1, /* recalc round-robin list */ lq_same_space:1,/* the ost's all have approx. the same space avail */ @@ -624,7 +637,7 @@ struct lov_tgt_desc { struct ltd_qos ltd_qos; /* qos info per target */ __u32 ltd_gen; __u32 ltd_index; /* index in lov_obd->tgts */ - unsigned int ltd_active:1,/* is this target up for requests */ + unsigned long ltd_active:1,/* is this target up for requests */ ltd_activate:1,/* should this target be activated */ ltd_reap:1; /* should this target be deleted */ }; @@ -644,6 +657,9 @@ struct lov_obd { __u32 lov_offset_idx; /* aliasing for start_idx */ int lov_start_count;/* reseed counter */ int lov_connects; + obd_page_removal_cb_t lov_page_removal_cb; + obd_pin_extent_cb lov_page_pin_cb; + obd_lock_cancel_cb lov_lock_cancel_cb; }; struct lmv_tgt_desc { @@ -725,7 +741,6 @@ struct niobuf_local { struct obd_trans_info { __u64 oti_transno; __u64 oti_xid; - __u64 *oti_objid; /* Only used on the server side for tracking acks. */ struct oti_req_ack_lock { struct lustre_handle lock; @@ -746,17 +761,18 @@ static inline void oti_init(struct obd_trans_info *oti, { if (oti == NULL) return; - memset(oti, 0, sizeof *oti); + memset(oti, 0, sizeof(*oti)); if (req == NULL) return; oti->oti_xid = req->rq_xid; - if (req->rq_repmsg && req->rq_reqmsg != 0) + if (req->rq_repmsg != NULL) oti->oti_transno = lustre_msg_get_transno(req->rq_repmsg); oti->oti_thread_id = req->rq_svc_thread ? req->rq_svc_thread->t_id : -1; - oti->oti_conn_cnt = lustre_msg_get_conn_cnt(req->rq_reqmsg); + if (req->rq_reqmsg != NULL) + oti->oti_conn_cnt = lustre_msg_get_conn_cnt(req->rq_reqmsg); } static inline void oti_alloc_cookies(struct obd_trans_info *oti,int num_cookies) @@ -806,6 +822,12 @@ enum obd_notify_event { OBD_NOTIFY_CONFIG }; +/* bit-mask flags for config events */ +enum config_flags { + CONFIG_LOG = 0x1, /* finished processing config log */ + CONFIG_SYNC = 0x2 /* mdt synced 1 ost */ +}; + /* * Data structure used to pass obd_notify()-event to non-obd listeners (llite * and liblustre being main examples). @@ -824,6 +846,23 @@ struct target_recovery_data { struct completion trd_finishing; }; +#define OBD_LLOG_GROUP 0 + +enum filter_groups { + FILTER_GROUP_LLOG = 1, + FILTER_GROUP_ECHO, + FILTER_GROUP_MDS0 +}; + +struct obd_llog_group { + struct list_head olg_list; + int olg_group; + struct llog_ctxt *olg_ctxts[LLOG_MAX_CTXTS]; + cfs_waitq_t olg_waitq; + spinlock_t olg_lock; + struct obd_export *olg_exp; +}; + /* corresponds to one of the obd's */ #define MAX_OBD_NAME 128 #define OBD_DEVICE_MAGIC 0XAB5CD6EF @@ -838,24 +877,34 @@ struct obd_device { struct lu_device *obd_lu_dev; int obd_minor; - unsigned int obd_attached:1, /* finished attach */ - obd_set_up:1, /* finished setup */ - obd_recovering:1, /* there are recoverable clients */ - obd_abort_recovery:1,/* somebody ioctl'ed us to abort */ - obd_replayable:1, /* recovery is enabled; inform clients */ - obd_no_transno:1, /* no committed-transno notification */ - obd_no_recov:1, /* fail instead of retry messages */ - obd_req_replaying:1, /* replaying requests */ - obd_stopping:1, /* started cleanup */ - obd_starting:1, /* started setup */ - obd_force:1, /* cleanup with > 0 obd refcount */ - obd_fail:1, /* cleanup with failover */ - obd_async_recov:1, /* allow asyncronous orphan cleanup */ - obd_no_conn:1; /* deny new connections */ - atomic_t obd_refcount; + unsigned long obd_attached:1, /* finished attach */ + obd_set_up:1, /* finished setup */ + obd_recovering:1, /* there are recoverable clients */ + obd_abort_recovery:1,/* somebody ioctl'ed us to abort */ + obd_replayable:1, /* recovery is enabled; inform clients */ + obd_no_transno:1, /* no committed-transno notification */ + obd_no_recov:1, /* fail instead of retry messages */ + obd_req_replaying:1, /* replaying requests */ + obd_stopping:1, /* started cleanup */ + obd_starting:1, /* started setup */ + obd_force:1, /* cleanup with > 0 obd refcount */ + obd_fail:1, /* cleanup with failover */ + obd_async_recov:1, /* allow asyncronous orphan cleanup */ + obd_no_conn:1, /* deny new connections */ + obd_inactive:1; /* device active/inactive + * (for /proc/status only!!) */ + /* uuid-export hash body */ + struct lustre_class_hash_body *obd_uuid_hash_body; + /* nid-export hash body */ + struct lustre_class_hash_body *obd_nid_hash_body; + /* nid stats body */ + struct lustre_class_hash_body *obd_nid_stats_hash_body; + struct list_head obd_nid_stats; + atomic_t obd_refcount; cfs_waitq_t obd_refcount_waitq; struct list_head obd_exports; int obd_num_exports; + spinlock_t obd_nid_lock; struct ldlm_namespace *obd_namespace; struct ptlrpc_client obd_ldlm_client; /* XXX OST/MDS only */ /* a spinlock is OK for what we do now, may need a semaphore later */ @@ -867,7 +916,7 @@ struct obd_device { struct obd_statfs obd_osfs; /* locked by obd_osfs_lock */ __u64 obd_osfs_age; struct lvfs_run_ctxt obd_lvfs_ctxt; - struct llog_ctxt *obd_llog_ctxt[LLOG_MAX_CTXTS]; + struct obd_llog_group obd_olg; /* default llog group */ struct obd_device *obd_observer; struct obd_notify_upcall obd_upcall; struct obd_export *obd_self_export; @@ -890,8 +939,9 @@ struct obd_device { struct list_head obd_uncommitted_replies; spinlock_t obd_uncommitted_replies_lock; cfs_timer_t obd_recovery_timer; - time_t obd_recovery_start; - time_t obd_recovery_end; + time_t obd_recovery_start; /* seconds */ + time_t obd_recovery_end; /* seconds */ + time_t obd_recovery_max_time; /* seconds, bz13079 */ /* new recovery stuff from CMD2 */ struct target_recovery_data obd_recovery_data; @@ -923,10 +973,18 @@ struct obd_device { struct lprocfs_stats *md_stats; cfs_proc_dir_entry_t *obd_proc_entry; - cfs_proc_dir_entry_t *obd_proc_exports; + cfs_proc_dir_entry_t *obd_proc_exports_entry; cfs_proc_dir_entry_t *obd_svc_procroot; struct lprocfs_stats *obd_svc_stats; - struct semaphore obd_proc_exp_sem; + atomic_t obd_evict_inprogress; + cfs_waitq_t obd_evict_inprogress_waitq; + + /** + * Ldlm pool part. Save last calculated SLV and Limit. + */ + rwlock_t obd_pool_lock; + int obd_pool_limit; + __u64 obd_pool_slv; }; #define OBD_OPT_FORCE 0x0001 @@ -960,9 +1018,26 @@ enum obd_cleanup_stage { #define KEY_CONN_DATA "conn_data" #define KEY_MAX_EASIZE "max_easize" #define KEY_REVIMP_UPD "revimp_update" +#define KEY_LOV_IDX "lov_idx" +#define KEY_LAST_ID "last_id" +#define KEY_LOCK_TO_STRIPE "lock_to_stripe" +#define KEY_BLOCKSIZE "blocksize" +#define KEY_BLOCKSIZE_BITS "blocksize_bits" struct lu_context; +static inline int it_to_lock_mode(struct lookup_intent *it) +{ + /* CREAT needs to be tested before open (both could be set) */ + if (it->it_op & IT_CREAT) + return LCK_CW; + else if (it->it_op & (IT_READDIR | IT_GETATTR | IT_OPEN | IT_LOOKUP)) + return LCK_CR; + + LASSERTF(0, "Invalid it_op: %d\n", it->it_op); + return -EINVAL; +} + struct md_op_data { struct lu_fid op_fid1; /* operation fid1 (usualy parent) */ struct lu_fid op_fid2; /* operation fid2 (usualy child) */ @@ -1006,6 +1081,22 @@ struct md_op_data { __u32 op_opc; }; +struct md_enqueue_info; +/* metadata stat-ahead */ +typedef int (* md_enqueue_cb_t)(struct ptlrpc_request *req, + struct md_enqueue_info *minfo, + int rc); + +struct md_enqueue_info { + struct md_op_data mi_data; + struct lookup_intent mi_it; + struct lustre_handle mi_lockh; + struct dentry *mi_dentry; + md_enqueue_cb_t mi_cb; + unsigned int mi_generation; + void *mi_cbdata; +}; + struct obd_ops { struct module *o_owner; int (*o_iocontrol)(unsigned int cmd, struct obd_export *exp, int len, @@ -1033,8 +1124,10 @@ struct obd_ops { * asked for. If @ocd == NULL, use default parameters. */ int (*o_connect)(const struct lu_env *env, struct lustre_handle *conn, struct obd_device *src, - struct obd_uuid *cluuid, struct obd_connect_data *ocd); - int (*o_reconnect)(struct obd_export *exp, struct obd_device *src, + struct obd_uuid *cluuid, struct obd_connect_data *ocd, + void *localdata); + int (*o_reconnect)(const struct lu_env *env, + struct obd_export *exp, struct obd_device *src, struct obd_uuid *cluuid, struct obd_connect_data *ocd); int (*o_disconnect)(struct obd_export *exp); @@ -1054,7 +1147,7 @@ struct obd_ops { int (*o_fid_delete)(struct obd_export *exp, const struct lu_fid *fid); int (*o_statfs)(struct obd_device *obd, struct obd_statfs *osfs, - __u64 max_age); + __u64 max_age, __u32 flags); int (*o_statfs_async)(struct obd_device *obd, struct obd_info *oinfo, __u64 max_age, struct ptlrpc_request_set *set); int (*o_packmd)(struct obd_export *exp, struct lov_mds_md **disk_tgt, @@ -1066,6 +1159,7 @@ struct obd_ops { int (*o_preallocate)(struct lustre_handle *, obd_count *req, obd_id *ids); /* FIXME: add fid capability support for create & destroy! */ + int (*o_precreate)(struct obd_export *exp); int (*o_create)(struct obd_export *exp, struct obdo *oa, struct lov_stripe_md **ea, struct obd_trans_info *oti); int (*o_destroy)(struct obd_export *exp, struct obdo *oa, @@ -1091,7 +1185,8 @@ struct obd_ops { struct lov_oinfo *loi, cfs_page_t *page, obd_off offset, struct obd_async_page_ops *ops, void *data, - void **res); + void **res, int nocache, + struct lustre_handle *lockh); int (*o_queue_async_io)(struct obd_export *exp, struct lov_stripe_md *lsm, struct lov_oinfo *loi, void *cookie, @@ -1143,7 +1238,8 @@ struct obd_ops { int niocount, struct niobuf_local *local, struct obd_trans_info *oti, int rc); int (*o_enqueue)(struct obd_export *, struct obd_info *oinfo, - struct obd_enqueue_info *einfo); + struct ldlm_enqueue_info *einfo, + struct ptlrpc_request_set *rqset); int (*o_match)(struct obd_export *, struct lov_stripe_md *, __u32 type, ldlm_policy_data_t *, __u32 mode, int *flags, void *data, struct lustre_handle *lockh); @@ -1161,7 +1257,7 @@ struct obd_ops { int cmd, obd_off *); /* llog related obd_methods */ - int (*o_llog_init)(struct obd_device *obd, struct obd_llogs *llog, + int (*o_llog_init)(struct obd_device *obd, int group, struct obd_device *disk_obd, int count, struct llog_catid *logid, struct obd_uuid *uuid); int (*o_llog_finish)(struct obd_device *obd, int count); @@ -1185,6 +1281,17 @@ struct obd_ops { int (*o_quotactl)(struct obd_export *, struct obd_quotactl *); int (*o_ping)(struct obd_export *exp); + + int (*o_register_page_removal_cb)(struct obd_export *exp, + obd_page_removal_cb_t cb, + obd_pin_extent_cb pin_cb); + int (*o_unregister_page_removal_cb)(struct obd_export *exp, + obd_page_removal_cb_t cb); + int (*o_register_lock_cancel_cb)(struct obd_export *exp, + obd_lock_cancel_cb cb); + int (*o_unregister_lock_cancel_cb)(struct obd_export *exp, + obd_lock_cancel_cb cb); + /* * NOTE: If adding ops, add another LPROCFS_OBD_OP_INIT() line * to lprocfs_alloc_obd_stats() in obdclass/lprocfs_status.c. @@ -1213,8 +1320,9 @@ enum { #define MEA_MAGIC_ALL_CHARS 0xb222a11c #define MEA_MAGIC_HASH_SEGMENT 0xb222a11b -#define MAX_HASH_SIZE 0x7fffffffUL -#define MAX_HASH_HIGHEST_BIT 0x10000000 +#define MAX_HASH_SIZE_32 0x7fffffffUL +#define MAX_HASH_SIZE 0x7fffffffffffffffULL +#define MAX_HASH_HIGHEST_BIT 0x1000000000000000 struct lustre_md { struct mdt_body *body; @@ -1228,28 +1336,34 @@ struct lustre_md { struct obd_capa *oss_capa; }; +struct md_open_data { + struct obd_client_handle *mod_och; + struct list_head mod_replay_list; +}; + +struct lookup_intent; + struct md_ops { int (*m_getstatus)(struct obd_export *, struct lu_fid *, struct obd_capa **); int (*m_change_cbdata)(struct obd_export *, const struct lu_fid *, ldlm_iterator_t, void *); int (*m_close)(struct obd_export *, struct md_op_data *, - struct obd_client_handle *, struct ptlrpc_request **); + struct md_open_data *, struct ptlrpc_request **); int (*m_create)(struct obd_export *, struct md_op_data *, const void *, int, int, __u32, __u32, __u32, __u64, struct ptlrpc_request **); int (*m_done_writing)(struct obd_export *, struct md_op_data *, - struct obd_client_handle *); - int (*m_enqueue)(struct obd_export *, int, struct lookup_intent *, - int, struct md_op_data *, struct lustre_handle *, - void *, int, ldlm_completion_callback, - ldlm_blocking_callback, void *, int); + struct md_open_data *); + int (*m_enqueue)(struct obd_export *, struct ldlm_enqueue_info *, + struct lookup_intent *, struct md_op_data *, + struct lustre_handle *, void *, int, int); int (*m_getattr)(struct obd_export *, const struct lu_fid *, struct obd_capa *, obd_valid, int, struct ptlrpc_request **); int (*m_getattr_name)(struct obd_export *, const struct lu_fid *, struct obd_capa *, const char *, int, obd_valid, - int, struct ptlrpc_request **); + int, __u32, struct ptlrpc_request **); int (*m_intent_lock)(struct obd_export *, struct md_op_data *, void *, int, struct lookup_intent *, int, struct ptlrpc_request **, @@ -1263,7 +1377,8 @@ struct md_ops { const struct lu_fid *, struct ptlrpc_request **); int (*m_setattr)(struct obd_export *, struct md_op_data *, void *, - int , void *, int, struct ptlrpc_request **); + int , void *, int, struct ptlrpc_request **, + struct md_open_data **mod); int (*m_sync)(struct obd_export *, const struct lu_fid *, struct obd_capa *, struct ptlrpc_request **); int (*m_readpage)(struct obd_export *, const struct lu_fid *, @@ -1275,7 +1390,7 @@ struct md_ops { int (*m_setxattr)(struct obd_export *, const struct lu_fid *, struct obd_capa *, obd_valid, const char *, - const char *, int, int, int, + const char *, int, int, int, __u32, struct ptlrpc_request **); int (*m_getxattr)(struct obd_export *, const struct lu_fid *, @@ -1286,7 +1401,7 @@ struct md_ops { int (*m_init_ea_size)(struct obd_export *, int, int, int); int (*m_get_lustre_md)(struct obd_export *, struct ptlrpc_request *, - int, struct obd_export *, struct obd_export *, + struct obd_export *, struct obd_export *, struct lustre_md *); int (*m_free_lustre_md)(struct obd_export *, struct lustre_md *); @@ -1298,9 +1413,10 @@ struct md_ops { struct obd_client_handle *); int (*m_set_lock_data)(struct obd_export *, __u64 *, void *); - int (*m_lock_match)(struct obd_export *, int, const struct lu_fid *, - ldlm_type_t, ldlm_policy_data_t *, ldlm_mode_t, - struct lustre_handle *); + ldlm_mode_t (*m_lock_match)(struct obd_export *, int, + const struct lu_fid *, ldlm_type_t, + ldlm_policy_data_t *, ldlm_mode_t, + struct lustre_handle *); int (*m_cancel_unused)(struct obd_export *, const struct lu_fid *, ldlm_policy_data_t *, ldlm_mode_t, int flags, @@ -1309,7 +1425,16 @@ struct md_ops { renew_capa_cb_t cb); int (*m_get_remote_perm)(struct obd_export *, const struct lu_fid *, - struct obd_capa *, struct ptlrpc_request **); + struct obd_capa *, __u32, + struct ptlrpc_request **); + + int (*m_intent_getattr_async)(struct obd_export *, + struct md_enqueue_info *, + struct ldlm_enqueue_info *); + + int (*m_revalidate_lock)(struct obd_export *, + struct lookup_intent *, + struct lu_fid *); /* * NOTE: If adding ops, add another LPROCFS_MD_OP_INIT() line to @@ -1361,11 +1486,11 @@ static inline void obd_transno_commit_cb(struct obd_device *obd, __u64 transno, int error) { if (error) { - CERROR("%s: transno "LPD64" commit error: %d\n", + CERROR("%s: transno "LPU64" commit error: %d\n", obd->obd_name, transno, error); return; } - CDEBUG(D_HA, "%s: transno "LPD64" committed\n", + CDEBUG(D_HA, "%s: transno "LPU64" committed\n", obd->obd_name, transno); if (transno > obd->obd_last_committed) { obd->obd_last_committed = transno;