X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fosp%2Fosp_internal.h;h=aa28014090baf06a8f88b663153b1c7dfd208838;hp=1557a65459954a6cffbe06cdf7377f99918166b5;hb=3ca197b4aa3b2fc11da9a946db597e73a62fe149;hpb=e089a515efae3391709b997be889ebe0f3306e9d diff --git a/lustre/osp/osp_internal.h b/lustre/osp/osp_internal.h index 1557a65..aa28014 100644 --- a/lustre/osp/osp_internal.h +++ b/lustre/osp/osp_internal.h @@ -46,6 +46,8 @@ #include #include #include +#include +#include /* * Infrastructure to support tracking of last committed llog record @@ -65,6 +67,32 @@ struct osp_id_tracker { cfs_atomic_t otr_refcount; }; +struct osp_precreate { + /* + * Precreation pool + */ + spinlock_t osp_pre_lock; + + /* last fid to assign in creation */ + struct lu_fid osp_pre_used_fid; + /* last created id OST reported, next-created - available id's */ + struct lu_fid osp_pre_last_created_fid; + /* how many ids are reserved in declare, we shouldn't block in create */ + __u64 osp_pre_reserved; + /* consumers (who needs new ids) wait here */ + wait_queue_head_t osp_pre_user_waitq; + /* current precreation status: working, failed, stopping? */ + int osp_pre_status; + /* how many to precreate next time */ + int osp_pre_grow_count; + int osp_pre_min_grow_count; + int osp_pre_max_grow_count; + /* whether to grow precreation window next time or not */ + int osp_pre_grow_slow; + /* cleaning up orphans or recreating missing objects */ + int osp_pre_recovering; +}; + struct osp_device { struct dt_device opd_dt_dev; /* corresponded OST index */ @@ -94,44 +122,23 @@ struct osp_device { cfs_proc_dir_entry_t *opd_proc_entry; struct lprocfs_stats *opd_stats; /* connection status. */ - int opd_new_connection; - int opd_got_disconnected; - int opd_imp_connected; - int opd_imp_active; - unsigned int opd_imp_seen_connected:1, + unsigned int opd_new_connection:1, + opd_got_disconnected:1, + opd_imp_connected:1, + opd_imp_active:1, + opd_imp_seen_connected:1, opd_connect_mdt:1; /* whether local recovery is completed: * reported via ->ldo_recovery_complete() */ int opd_recovery_completed; - /* - * Precreation pool - */ - spinlock_t opd_pre_lock; - - /* last fid to assign in creation */ - struct lu_fid opd_pre_used_fid; - /* last created id OST reported, next-created - available id's */ - struct lu_fid opd_pre_last_created_fid; - /* how many ids are reserved in declare, we shouldn't block in create */ - __u64 opd_pre_reserved; + /* precreate structure for OSP */ + struct osp_precreate *opd_pre; /* dedicate precreate thread */ struct ptlrpc_thread opd_pre_thread; /* thread waits for signals about pool going empty */ wait_queue_head_t opd_pre_waitq; - /* consumers (who needs new ids) wait here */ - wait_queue_head_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; - /* cleaning up orphans or recreating missing objects */ - int opd_pre_recovering; /* * OST synchronization @@ -173,32 +180,78 @@ struct osp_device { */ struct obd_statfs opd_statfs; cfs_time_t opd_statfs_fresh_till; - cfs_timer_t opd_statfs_timer; + struct timer_list 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; + + /* If the caller wants to do some idempotent async operations on + * remote server, it can append the async remote requests on the + * osp_device::opd_async_requests via declare() functions, these + * requests can be packed together and sent to the remote server + * via single OUT RPC later. */ + struct dt_update_request *opd_async_requests; + /* Protect current operations on opd_async_requests. */ + struct mutex opd_async_requests_mutex; + struct semaphore opd_async_fc_sem; }; +#define opd_pre_lock opd_pre->osp_pre_lock +#define opd_pre_used_fid opd_pre->osp_pre_used_fid +#define opd_pre_last_created_fid opd_pre->osp_pre_last_created_fid +#define opd_pre_reserved opd_pre->osp_pre_reserved +#define opd_pre_user_waitq opd_pre->osp_pre_user_waitq +#define opd_pre_status opd_pre->osp_pre_status +#define opd_pre_grow_count opd_pre->osp_pre_grow_count +#define opd_pre_min_grow_count opd_pre->osp_pre_min_grow_count +#define opd_pre_max_grow_count opd_pre->osp_pre_max_grow_count +#define opd_pre_grow_slow opd_pre->osp_pre_grow_slow +#define opd_pre_recovering opd_pre->osp_pre_recovering + extern struct kmem_cache *osp_object_kmem; +/* The first part of oxe_buf is xattr name, and is '\0' terminated. + * The left part is for value, binary mode. */ +struct osp_xattr_entry { + struct list_head oxe_list; + atomic_t oxe_ref; + void *oxe_value; + int oxe_buflen; + int oxe_namelen; + int oxe_vallen; + unsigned int oxe_exist:1, + oxe_ready:1; + char oxe_buf[0]; +}; + +struct osp_object_attr { + struct lu_attr ooa_attr; + struct list_head ooa_xattr_list; +}; + /* this is a top object */ struct osp_object { struct lu_object_header opo_header; struct dt_object opo_obj; unsigned int opo_reserved:1, opo_new:1, - opo_empty:1; + opo_empty:1, + opo_non_exist:1; /* read/write lock for md osp object */ struct rw_semaphore opo_sem; const struct lu_env *opo_owner; + struct osp_object_attr *opo_ooa; + /* Protect opo_ooa. */ + spinlock_t opo_lock; }; extern struct lu_object_operations osp_lu_obj_ops; extern const struct dt_device_operations osp_dt_ops; extern struct dt_object_operations osp_md_obj_ops; +extern struct dt_body_operations osp_md_body_ops; struct osp_thread_info { struct lu_buf osi_lb; @@ -222,6 +275,13 @@ struct osp_thread_info { struct obdo osi_obdo; }; +/* The transaction only include the updates on the remote node, and + * no local updates at all */ +static inline bool is_only_remote_trans(struct thandle *th) +{ + return th->th_dev != NULL && th->th_dev->dd_ops == &osp_dt_ops; +} + static inline void osp_objid_buf_prep(struct lu_buf *buf, loff_t *off, __u32 *id, int index) { @@ -325,6 +385,11 @@ static inline struct dt_object *osp_object_child(struct osp_object *o) struct dt_object, do_lu); } +static inline struct seq_server_site *osp_seq_site(struct osp_device *osp) +{ + return osp->opd_dt_dev.dd_lu_dev.ld_site->ld_seq_site; +} + #define osp_init_rpc_lock(lck) mdc_init_rpc_lock(lck) #define osp_get_rpc_lock(lck, it) mdc_get_rpc_lock(lck, it) #define osp_put_rpc_lock(lck, it) mdc_put_rpc_lock(lck, it) @@ -387,14 +452,68 @@ static inline int osp_is_fid_client(struct osp_device *osp) return imp->imp_connect_data.ocd_connect_flags & OBD_CONNECT_FID; } +typedef int (*osp_async_update_interpterer_t)(const struct lu_env *env, + struct object_update_reply *reply, + struct ptlrpc_request *req, + struct osp_object *obj, + void *data, int index, int rc); + /* osp_dev.c */ void osp_update_last_id(struct osp_device *d, obd_id objid); extern struct llog_operations osp_mds_ost_orig_logops; -/* osp_md_object.c */ +/* osp_trans.c */ +struct dt_update_request * +osp_find_or_create_async_update_request(struct osp_device *osp); +int osp_insert_async_update(const struct lu_env *env, + struct dt_update_request *update, int op, + struct osp_object *obj, int count, + int *lens, const char **bufs, void *data, + osp_async_update_interpterer_t interpterer); +int osp_unplug_async_update(const struct lu_env *env, + struct osp_device *osp, + struct dt_update_request *update); +struct thandle *osp_trans_create(const struct lu_env *env, + struct dt_device *d); int osp_trans_start(const struct lu_env *env, struct dt_device *dt, struct thandle *th); -int osp_trans_stop(const struct lu_env *env, struct thandle *th); + +/* osp_object.c */ +int osp_attr_get(const struct lu_env *env, struct dt_object *dt, + struct lu_attr *attr, struct lustre_capa *capa); +int osp_xattr_get(const struct lu_env *env, struct dt_object *dt, + struct lu_buf *buf, const char *name, + struct lustre_capa *capa); +int osp_declare_xattr_set(const struct lu_env *env, struct dt_object *dt, + const struct lu_buf *buf, const char *name, + int flag, struct thandle *th); +int osp_xattr_set(const struct lu_env *env, struct dt_object *dt, + const struct lu_buf *buf, const char *name, int fl, + struct thandle *th, struct lustre_capa *capa); +int osp_declare_object_destroy(const struct lu_env *env, + struct dt_object *dt, struct thandle *th); +int osp_object_destroy(const struct lu_env *env, struct dt_object *dt, + struct thandle *th); + +int osp_trans_stop(const struct lu_env *env, struct dt_device *dt, + struct thandle *th); + +/* osp_md_object.c */ +int osp_md_declare_object_create(const struct lu_env *env, + struct dt_object *dt, + struct lu_attr *attr, + struct dt_allocation_hint *hint, + struct dt_object_format *dof, + struct thandle *th); +int osp_md_object_create(const struct lu_env *env, struct dt_object *dt, + struct lu_attr *attr, struct dt_allocation_hint *hint, + struct dt_object_format *dof, struct thandle *th); +int osp_md_declare_attr_set(const struct lu_env *env, struct dt_object *dt, + const struct lu_attr *attr, struct thandle *th); +int osp_md_attr_set(const struct lu_env *env, struct dt_object *dt, + const struct lu_attr *attr, struct thandle *th, + struct lustre_capa *capa); + /* osp_precreate.c */ int osp_init_precreate(struct osp_device *d); int osp_precreate_reserve(const struct lu_env *env, struct osp_device *d); @@ -408,6 +527,7 @@ void osp_statfs_need_now(struct osp_device *d); int osp_reset_last_used(const struct lu_env *env, struct osp_device *osp); int osp_write_last_oid_seq_files(struct lu_env *env, struct osp_device *osp, struct lu_fid *fid, int sync); +int osp_init_pre_fid(struct osp_device *osp); /* lproc_osp.c */ void lprocfs_osp_init_vars(struct lprocfs_static_vars *lvars);