X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Finclude%2Fdt_object.h;h=cdd321a9ad2b165e1244d63e7da42c87fd4f830f;hp=fb81d4b6683c540ccdfa85db82feb6656e463a01;hb=ccadcfd3940040465a59a13367f0d79a823625bd;hpb=2f41b688058532248e69ff0194c27616f4dfb6d5 diff --git a/lustre/include/dt_object.h b/lustre/include/dt_object.h index fb81d4b..cdd321a 100644 --- a/lustre/include/dt_object.h +++ b/lustre/include/dt_object.h @@ -49,7 +49,7 @@ * @{ */ - +#include /* * super-class definitions. */ @@ -80,7 +80,6 @@ struct dt_device_param { unsigned ddp_block_shift; mntopt_t ddp_mntopts; unsigned ddp_max_ea_size; - void *ddp_mnt; /* XXX: old code can retrieve mnt -bzzz */ int ddp_mount_type; unsigned long long ddp_maxbytes; /* percentage of available space to reserve for grant error margin */ @@ -131,11 +130,11 @@ struct dt_device_operations { */ int (*dt_trans_start)(const struct lu_env *env, struct dt_device *dev, struct thandle *th); - /** - * Finish previously started transaction. - */ - int (*dt_trans_stop)(const struct lu_env *env, - struct thandle *th); + /** + * Finish previously started transaction. + */ + int (*dt_trans_stop)(const struct lu_env *env, struct dt_device *dev, + struct thandle *th); /** * Add commit callback to the transaction. */ @@ -230,8 +229,10 @@ extern const struct dt_index_features dt_quota_slv_features; * It can contain any allocation hint in the future. */ struct dt_allocation_hint { - struct dt_object *dah_parent; - __u32 dah_mode; + struct dt_object *dah_parent; + const void *dah_eadata; + int dah_eadata_len; + __u32 dah_mode; }; /** @@ -301,6 +302,9 @@ struct dt_object_operations { * lu_object_operations, but that would break existing symmetry. */ + int (*do_declare_attr_get)(const struct lu_env *env, + struct dt_object *dt, + struct lustre_capa *capa); /** * Return standard attributes. * @@ -323,6 +327,13 @@ struct dt_object_operations { const struct lu_attr *attr, struct thandle *handle, struct lustre_capa *capa); + + int (*do_declare_xattr_get)(const struct lu_env *env, + struct dt_object *dt, + struct lu_buf *buf, + const char *name, + struct lustre_capa *capa); + /** * Return a value of an extended attribute. * @@ -375,11 +386,11 @@ struct dt_object_operations { * (2) The type of child is in \a child_mode. * (3) The result hint is stored in \a ah; */ - void (*do_ah_init)(const struct lu_env *env, - struct dt_allocation_hint *ah, - struct dt_object *parent, + void (*do_ah_init)(const struct lu_env *env, + struct dt_allocation_hint *ah, + struct dt_object *parent, struct dt_object *child, - cfs_umode_t child_mode); + umode_t child_mode); /** * Create new object on this device. * @@ -622,6 +633,7 @@ struct dt_index_operations { enum dt_otable_it_valid { DOIV_ERROR_HANDLE = 0x0001, + DOIV_DRYRUN = 0x0002, }; enum dt_otable_it_flags { @@ -633,6 +645,9 @@ enum dt_otable_it_flags { /* There is up layer component uses the iteration. */ DOIF_OUTUSED = 0x0004, + + /* Check only without repairing. */ + DOIF_DRYRUN = 0x0008, }; /* otable based iteration needs to use the common DT interation APIs. @@ -656,6 +671,7 @@ struct dt_device { * single-threaded start-up shut-down procedures. */ cfs_list_t dd_txn_callbacks; + unsigned int dd_record_fid_accessed:1; }; int dt_device_init(struct dt_device *dev, struct lu_device_type *t); @@ -687,12 +703,12 @@ struct local_oid_storage { cfs_list_t los_list; /* how many handle's reference this los has */ - cfs_atomic_t los_refcount; + atomic_t los_refcount; struct dt_device *los_dev; struct dt_object *los_obj; /* data used to generate new fids */ - struct mutex los_id_lock; + struct mutex los_id_lock; __u64 los_seq; __u32 los_last_oid; }; @@ -729,6 +745,19 @@ static inline struct dt_object *lu2dt_obj(struct lu_object *o) return container_of0(o, struct dt_object, do_lu); } +struct thandle_update { + /* In DNE, one transaction can be disassembled into + * updates on several different MDTs, and these updates + * will be attached to tu_remote_update_list per target. + * Only single thread will access the list, no need lock + */ + struct list_head tu_remote_update_list; + + /* sent after or before local transaction */ + unsigned int tu_sent_after_local_trans:1, + tu_only_remote_trans:1; +}; + /** * This is the general purpose transaction handle. * 1. Transaction Life Cycle @@ -747,6 +776,10 @@ struct thandle { /** the dt device on which the transactions are executed */ struct dt_device *th_dev; + atomic_t th_refc; + /* the size of transaction */ + int th_alloc_size; + /** context for this transaction, tag is LCT_TX_HANDLE */ struct lu_context th_ctx; @@ -763,15 +796,22 @@ struct thandle { /* local transation, no need to inform other layers */ unsigned int th_local:1; - /* In DNE, one transaction can be disassemblied into - * updates on several different MDTs, and these updates - * will be attached to th_remote_update_list per target. - * Only single thread will access the list, no need lock - */ - cfs_list_t th_remote_update_list; - struct update_request *th_current_request; + struct thandle_update *th_update; }; +static inline void thandle_get(struct thandle *thandle) +{ + atomic_inc(&thandle->th_refc); +} + +static inline void thandle_put(struct thandle *thandle) +{ + if (atomic_dec_and_test(&thandle->th_refc)) { + if (thandle->th_update != NULL) + OBD_FREE_PTR(thandle->th_update); + OBD_FREE(thandle, thandle->th_alloc_size); + } +} /** * Transaction call-backs. * @@ -837,15 +877,17 @@ struct dt_object *dt_find_or_create(const struct lu_env *env, struct dt_object *dt_locate_at(const struct lu_env *env, struct dt_device *dev, const struct lu_fid *fid, - struct lu_device *top_dev); + struct lu_device *top_dev, + const struct lu_object_conf *conf); + static inline struct dt_object * dt_locate(const struct lu_env *env, struct dt_device *dev, const struct lu_fid *fid) { - return dt_locate_at(env, dev, fid, dev->dd_lu_dev.ld_site->ls_top_dev); + return dt_locate_at(env, dev, fid, + dev->dd_lu_dev.ld_site->ls_top_dev, NULL); } - int local_oid_storage_init(const struct lu_env *env, struct dt_device *dev, const struct lu_fid *first_fid, struct local_oid_storage **los); @@ -963,8 +1005,8 @@ static inline int dt_trans_start_local(const struct lu_env *env, static inline int dt_trans_stop(const struct lu_env *env, struct dt_device *d, struct thandle *th) { - LASSERT(d->dd_ops->dt_trans_stop); - return d->dd_ops->dt_trans_stop(env, th); + LASSERT(d->dd_ops->dt_trans_stop); + return d->dd_ops->dt_trans_stop(env, d, th); } static inline int dt_trans_cb_add(struct thandle *th, @@ -1085,6 +1127,16 @@ static inline int dt_write_locked(const struct lu_env *env, return dt->do_ops->do_write_locked(env, dt); } +static inline int dt_declare_attr_get(const struct lu_env *env, + struct dt_object *dt, + struct lustre_capa *capa) +{ + LASSERT(dt); + LASSERT(dt->do_ops); + LASSERT(dt->do_ops->do_declare_attr_get); + return dt->do_ops->do_declare_attr_get(env, dt, capa); +} + static inline int dt_attr_get(const struct lu_env *env, struct dt_object *dt, struct lu_attr *la, void *arg) { @@ -1157,7 +1209,7 @@ static inline struct obd_capa *dt_capa_get(const struct lu_env *env, { LASSERT(dt); LASSERT(dt->do_ops); - LASSERT(dt->do_ops->do_ref_del); + LASSERT(dt->do_ops->do_capa_get); return dt->do_ops->do_capa_get(env, dt, old, opc); } @@ -1368,6 +1420,18 @@ static inline int dt_xattr_set(const struct lu_env *env, return dt->do_ops->do_xattr_set(env, dt, buf, name, fl, th, capa); } +static inline int dt_declare_xattr_get(const struct lu_env *env, + struct dt_object *dt, + struct lu_buf *buf, + const char *name, + struct lustre_capa *capa) +{ + LASSERT(dt); + LASSERT(dt->do_ops); + LASSERT(dt->do_ops->do_declare_xattr_get); + return dt->do_ops->do_declare_xattr_get(env, dt, buf, name, capa); +} + static inline int dt_xattr_get(const struct lu_env *env, struct dt_object *dt, struct lu_buf *buf, const char *name, struct lustre_capa *capa) @@ -1468,6 +1532,7 @@ struct dt_thread_info { struct dt_object_format dti_dof; struct lustre_mdt_attrs dti_lma; struct lu_buf dti_lb; + struct lu_object_conf dti_conf; loff_t dti_off; }; @@ -1486,6 +1551,7 @@ int dt_global_init(void); void dt_global_fini(void); # ifdef LPROCFS +#ifndef HAVE_ONLY_PROCFS_SEQ int lprocfs_dt_rd_blksize(char *page, char **start, off_t off, int count, int *eof, void *data); int lprocfs_dt_rd_kbytestotal(char *page, char **start, off_t off, @@ -1498,6 +1564,13 @@ int lprocfs_dt_rd_filestotal(char *page, char **start, off_t off, int count, int *eof, void *data); int lprocfs_dt_rd_filesfree(char *page, char **start, off_t off, int count, int *eof, void *data); +#endif +int lprocfs_dt_blksize_seq_show(struct seq_file *m, void *v); +int lprocfs_dt_kbytestotal_seq_show(struct seq_file *m, void *v); +int lprocfs_dt_kbytesfree_seq_show(struct seq_file *m, void *v); +int lprocfs_dt_kbytesavail_seq_show(struct seq_file *m, void *v); +int lprocfs_dt_filestotal_seq_show(struct seq_file *m, void *v); +int lprocfs_dt_filesfree_seq_show(struct seq_file *m, void *v); # endif /* LPROCFS */ #endif /* __LUSTRE_DT_OBJECT_H */