X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fosp%2Fosp_internal.h;h=e75c2468d5db5590d7fd20d639d628405daba24c;hp=e572552bd1f95b898373571ddbd5f181544f38e4;hb=04e1d0cb95e1ad1288676c276efd98f6786a58d7;hpb=65d814c242d03659ec5cc8542f1e1cfa5f7e2588 diff --git a/lustre/osp/osp_internal.h b/lustre/osp/osp_internal.h index e572552..e75c246 100644 --- a/lustre/osp/osp_internal.h +++ b/lustre/osp/osp_internal.h @@ -42,9 +42,28 @@ #define _OSP_INTERNAL_H #include +#include #include #include +/* + * Infrastructure to support tracking of last committed llog record + */ +struct osp_id_tracker { + cfs_spinlock_t otr_lock; + __u32 otr_next_id; + __u32 otr_committed_id; + /* callback is register once per diskfs -- that's the whole point */ + struct dt_txn_callback otr_tx_cb; + /* single node can run many clusters */ + cfs_list_t otr_wakeup_list; + cfs_list_t otr_list; + /* underlying shared device */ + struct dt_device *otr_dev; + /* how many users of this tracker */ + cfs_atomic_t otr_refcount; +}; + struct osp_device { struct dt_device opd_dt_dev; /* corresponded OST index */ @@ -53,8 +72,12 @@ struct osp_device { struct obd_export *opd_storage_exp; struct dt_device *opd_storage; struct dt_object *opd_last_used_file; - /* protected by opd_pre_lock */ + + /* stored persistently in LE format, updated directly to/from disk + * and required le64_to_cpu() conversion before use. + * Protected by opd_pre_lock */ volatile obd_id opd_last_used_id; + obd_id opd_gap_start; int opd_gap_count; /* connection to OST */ @@ -76,6 +99,76 @@ struct osp_device { * reported via ->ldo_recovery_complete() */ int opd_recovery_completed; + /* + * Precreation pool + */ + cfs_spinlock_t opd_pre_lock; + /* last id assigned in creation */ + __u64 opd_pre_used_id; + /* last created id OST reported, next-created - available id's */ + __u64 opd_pre_last_created; + /* how many ids are reserved in declare, we shouldn't block in create */ + __u64 opd_pre_reserved; + /* dedicate precreate thread */ + struct ptlrpc_thread opd_pre_thread; + /* thread waits for signals about pool going empty */ + cfs_waitq_t opd_pre_waitq; + /* consumers (who needs new ids) wait here */ + cfs_waitq_t opd_pre_user_waitq; + /* current precreation status: working, failed, stopping? */ + int opd_pre_status; + /* how many to precreate next time */ + int opd_pre_grow_count; + int opd_pre_min_grow_count; + int opd_pre_max_grow_count; + /* whether to grow precreation window next time or not */ + int opd_pre_grow_slow; + + /* + * OST synchronization + */ + cfs_spinlock_t opd_syn_lock; + /* unique generation, to recognize start of new records in the llog */ + struct llog_gen opd_syn_generation; + /* number of changes to sync, used to wake up sync thread */ + unsigned long opd_syn_changes; + /* processing of changes from previous mount is done? */ + int opd_syn_prev_done; + /* found records */ + struct ptlrpc_thread opd_syn_thread; + cfs_waitq_t opd_syn_waitq; + /* list of remotely committed rpc */ + cfs_list_t opd_syn_committed_there; + /* number of changes being under sync */ + int opd_syn_sync_in_progress; + /* number of RPCs in flight - flow control */ + int opd_syn_rpc_in_flight; + int opd_syn_max_rpc_in_flight; + /* number of RPC in processing (including non-committed by OST) */ + int opd_syn_rpc_in_progress; + int opd_syn_max_rpc_in_progress; + /* osd api's commit cb control structure */ + struct dt_txn_callback opd_syn_txn_cb; + /* last used change number -- semantically similar to transno */ + unsigned long opd_syn_last_used_id; + /* last committed change number -- semantically similar to + * last_committed */ + unsigned long opd_syn_last_committed_id; + /* last processed (taken from llog) id */ + unsigned long opd_syn_last_processed_id; + struct osp_id_tracker *opd_syn_tracker; + cfs_list_t opd_syn_ontrack; + + /* + * statfs related fields: OSP maintains it on its own + */ + struct obd_statfs opd_statfs; + cfs_time_t opd_statfs_fresh_till; + cfs_timer_t opd_statfs_timer; + int opd_statfs_update_in_progress; + /* how often to update statfs data */ + int opd_statfs_maxage; + cfs_proc_dir_entry_t *opd_symlink; }; @@ -85,17 +178,28 @@ extern cfs_mem_cache_t *osp_object_kmem; struct osp_object { struct lu_object_header opo_header; struct dt_object opo_obj; - int opo_reserved; + int opo_reserved:1, + opo_new:1; }; extern struct lu_object_operations osp_lu_obj_ops; +extern const struct dt_device_operations osp_dt_ops; struct osp_thread_info { struct lu_buf osi_lb; struct lu_fid osi_fid; struct lu_attr osi_attr; + struct ost_id osi_oi; obd_id osi_id; loff_t osi_off; + union { + struct llog_rec_hdr osi_hdr; + struct llog_unlink64_rec osi_unlink; + struct llog_setattr64_rec osi_setattr; + struct llog_gen_rec osi_gen; + }; + struct llog_cookie osi_cookie; + struct llog_catid osi_cid; }; static inline void osp_objid_buf_prep(struct osp_thread_info *osi, @@ -190,7 +294,32 @@ static inline struct dt_object *osp_object_child(struct osp_object *o) /* osp_dev.c */ void osp_update_last_id(struct osp_device *d, obd_id objid); +/* osp_precreate.c */ +int osp_init_precreate(struct osp_device *d); +int osp_precreate_reserve(const struct lu_env *env, struct osp_device *d); +__u64 osp_precreate_get_id(struct osp_device *d); +void osp_precreate_fini(struct osp_device *d); +int osp_object_truncate(const struct lu_env *env, struct dt_object *dt, __u64); +void osp_pre_update_status(struct osp_device *d, int rc); +void osp_statfs_need_now(struct osp_device *d); + /* lproc_osp.c */ void lprocfs_osp_init_vars(struct lprocfs_static_vars *lvars); +/* osp_sync.c */ +int osp_sync_declare_add(const struct lu_env *env, struct osp_object *o, + llog_op_type type, struct thandle *th); +int osp_sync_add(const struct lu_env *env, struct osp_object *o, + llog_op_type type, struct thandle *th, + const struct lu_attr *attr); +int osp_sync_init(const struct lu_env *env, struct osp_device *d); +int osp_sync_fini(struct osp_device *d); +void __osp_sync_check_for_work(struct osp_device *d); + +/* osp_ost.c */ +int osp_init_for_ost(const struct lu_env *env, struct osp_device *m, + struct lu_device_type *ldt, struct lustre_cfg *cfg); +int osp_disconnect(struct osp_device *d); +int osp_fini_for_ost(struct osp_device *osp); + #endif