X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Finclude%2Fdt_object.h;h=a39c4614ea76b4064cc9469d5a9840af209f9889;hp=f8c7477f699ef5e009d683362f93084fdcdf801c;hb=b69b7de30c3977cb69a741099218bc4a81752717;hpb=11b08d4ee69a242b763e5f4a34c511cb857f7868 diff --git a/lustre/include/dt_object.h b/lustre/include/dt_object.h index f8c7477..a39c461 100644 --- a/lustre/include/dt_object.h +++ b/lustre/include/dt_object.h @@ -27,7 +27,7 @@ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2011, 2012, Intel Corporation. + * Copyright (c) 2011, 2013, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -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. */ @@ -213,6 +212,8 @@ enum dt_index_flags { */ extern const struct dt_index_features dt_directory_features; extern const struct dt_index_features dt_otable_features; +extern const struct dt_index_features dt_lfsck_orphan_features; +extern const struct dt_index_features dt_lfsck_features; /* index features supported by the accounting objects */ extern const struct dt_index_features dt_acct_features; @@ -229,8 +230,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; }; /** @@ -276,6 +279,8 @@ enum dt_format_type dt_mode_to_dft(__u32 mode); typedef __u64 dt_obj_version_t; +union ldlm_policy_data; + /** * Per-dt-object operations. */ @@ -300,6 +305,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. * @@ -322,6 +330,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. * @@ -374,11 +389,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. * @@ -436,18 +451,31 @@ struct dt_object_operations { int (*do_ref_del)(const struct lu_env *env, struct dt_object *dt, struct thandle *th); - struct obd_capa *(*do_capa_get)(const struct lu_env *env, - struct dt_object *dt, - struct lustre_capa *old, - __u64 opc); - int (*do_object_sync)(const struct lu_env *, struct dt_object *); - /** - * Get object info of next level. Currently, only get inode from osd. - * This is only used by quota b=16542 - * precondition: dt_object_exists(dt); - */ - int (*do_data_get)(const struct lu_env *env, struct dt_object *dt, - void **data); + struct obd_capa *(*do_capa_get)(const struct lu_env *env, + struct dt_object *dt, + struct lustre_capa *old, + __u64 opc); + int (*do_object_sync)(const struct lu_env *env, struct dt_object *obj, + __u64 start, __u64 end); + /** + * Get object info of next level. Currently, only get inode from osd. + * This is only used by quota b=16542 + * precondition: dt_object_exists(dt); + */ + int (*do_data_get)(const struct lu_env *env, struct dt_object *dt, + void **data); + + /** + * Lock object. + */ + int (*do_object_lock)(const struct lu_env *env, struct dt_object *dt, + struct lustre_handle *lh, + struct ldlm_enqueue_info *einfo, + union ldlm_policy_data *policy); + + int (*do_object_unlock)(const struct lu_env *env, struct dt_object *dt, + struct ldlm_enqueue_info *einfo, + union ldlm_policy_data *policy); }; /** @@ -460,17 +488,17 @@ struct dt_body_operations { ssize_t (*dbo_read)(const struct lu_env *env, struct dt_object *dt, struct lu_buf *buf, loff_t *pos, struct lustre_capa *capa); - /** - * precondition: dt_object_exists(dt); - */ - ssize_t (*dbo_declare_write)(const struct lu_env *env, - struct dt_object *dt, - const loff_t size, loff_t pos, - struct thandle *handle); - ssize_t (*dbo_write)(const struct lu_env *env, struct dt_object *dt, - const struct lu_buf *buf, loff_t *pos, - struct thandle *handle, struct lustre_capa *capa, - int ignore_quota); + /** + * precondition: dt_object_exists(dt); + */ + ssize_t (*dbo_declare_write)(const struct lu_env *env, + struct dt_object *dt, + const struct lu_buf *buf, loff_t pos, + struct thandle *handle); + ssize_t (*dbo_write)(const struct lu_env *env, struct dt_object *dt, + const struct lu_buf *buf, loff_t *pos, + struct thandle *handle, struct lustre_capa *capa, + int ignore_quota); /* * methods for zero-copy IO */ @@ -518,19 +546,13 @@ struct dt_body_operations { * Punch object's content * precondition: regular object, not index */ - int (*do_declare_punch)(const struct lu_env *, struct dt_object *, + int (*dbo_declare_punch)(const struct lu_env *, struct dt_object *, __u64, __u64, struct thandle *th); - int (*do_punch)(const struct lu_env *env, struct dt_object *dt, + int (*dbo_punch)(const struct lu_env *env, struct dt_object *dt, __u64 start, __u64 end, struct thandle *th, struct lustre_capa *capa); }; -struct dt_lock_operations { - int (*do_object_lock)(const struct lu_env *env, struct dt_object *dt, - struct lustre_handle *lh, - struct ldlm_enqueue_info *einfo, - void *policy); -}; /** * Incomplete type of index record. */ @@ -608,6 +630,9 @@ struct dt_index_operations { const struct dt_it *di, struct dt_rec *rec, __u32 attr); + int (*rec_size)(const struct lu_env *env, + const struct dt_it *di, + __u32 attr); __u64 (*store)(const struct lu_env *env, const struct dt_it *di); int (*load)(const struct lu_env *env, @@ -619,6 +644,7 @@ struct dt_index_operations { enum dt_otable_it_valid { DOIV_ERROR_HANDLE = 0x0001, + DOIV_DRYRUN = 0x0002, }; enum dt_otable_it_flags { @@ -630,6 +656,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. @@ -653,6 +682,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); @@ -674,7 +704,6 @@ struct dt_object { const struct dt_object_operations *do_ops; const struct dt_body_operations *do_body_ops; const struct dt_index_operations *do_index_ops; - const struct dt_lock_operations *do_lock_ops; }; /* @@ -685,16 +714,21 @@ 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; }; +static inline struct lu_device *dt2lu_dev(struct dt_device *d) +{ + return &d->dd_lu_dev; +} + static inline struct dt_object *lu2dt(struct lu_object *l) { LASSERT(l == NULL || IS_ERR(l) || lu_device_is_dt(l->lo_dev)); @@ -722,6 +756,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 @@ -740,6 +787,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; @@ -751,20 +802,27 @@ struct thandle { __s32 th_result; /** whether we need sync commit */ - int th_sync:1; + unsigned int th_sync:1; /* local transation, no need to inform other layers */ - int th_local:1; + 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. * @@ -811,6 +869,10 @@ int dt_path_parser(const struct lu_env *env, char *local, dt_entry_func_t entry_func, void *data); +struct dt_object * +dt_store_resolve(const struct lu_env *env, struct dt_device *dt, + const char *path, struct lu_fid *fid); + struct dt_object *dt_store_open(const struct lu_env *env, struct dt_device *dt, const char *dirname, @@ -826,15 +888,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); @@ -877,28 +941,41 @@ local_index_find_or_create_with_fid(const struct lu_env *env, struct dt_object *parent, const char *name, __u32 mode, const struct dt_index_features *ft); +int local_object_unlink(const struct lu_env *env, struct dt_device *dt, + struct dt_object *parent, const char *name); static inline int dt_object_lock(const struct lu_env *env, struct dt_object *o, struct lustre_handle *lh, struct ldlm_enqueue_info *einfo, - void *policy) + union ldlm_policy_data *policy) { - LASSERT(o); - LASSERT(o->do_lock_ops); - LASSERT(o->do_lock_ops->do_object_lock); - return o->do_lock_ops->do_object_lock(env, o, lh, einfo, policy); + LASSERT(o != NULL); + LASSERT(o->do_ops != NULL); + LASSERT(o->do_ops->do_object_lock != NULL); + return o->do_ops->do_object_lock(env, o, lh, einfo, policy); +} + +static inline int dt_object_unlock(const struct lu_env *env, + struct dt_object *o, + struct ldlm_enqueue_info *einfo, + union ldlm_policy_data *policy) +{ + LASSERT(o != NULL); + LASSERT(o->do_ops != NULL); + LASSERT(o->do_ops->do_object_unlock != NULL); + return o->do_ops->do_object_unlock(env, o, einfo, policy); } int dt_lookup_dir(const struct lu_env *env, struct dt_object *dir, const char *name, struct lu_fid *fid); -static inline int dt_object_sync(const struct lu_env *env, - struct dt_object *o) +static inline int dt_object_sync(const struct lu_env *env, struct dt_object *o, + __u64 start, __u64 end) { - LASSERT(o); - LASSERT(o->do_ops); - LASSERT(o->do_ops->do_object_sync); - return o->do_ops->do_object_sync(env, o); + LASSERT(o); + LASSERT(o->do_ops); + LASSERT(o->do_ops->do_object_sync); + return o->do_ops->do_object_sync(env, o, start, end); } int dt_declare_version_set(const struct lu_env *env, struct dt_object *o, @@ -950,8 +1027,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, @@ -965,18 +1042,19 @@ static inline int dt_trans_cb_add(struct thandle *th, static inline int dt_declare_record_write(const struct lu_env *env, - struct dt_object *dt, - int size, loff_t pos, - struct thandle *th) + struct dt_object *dt, + const struct lu_buf *buf, + loff_t pos, + struct thandle *th) { - int rc; - - LASSERTF(dt != NULL, "dt is NULL when we want to write record\n"); - LASSERT(th != NULL); - LASSERT(dt->do_body_ops); - LASSERT(dt->do_body_ops->dbo_declare_write); - rc = dt->do_body_ops->dbo_declare_write(env, dt, size, pos, th); - return rc; + int rc; + + LASSERTF(dt != NULL, "dt is NULL when we want to write record\n"); + LASSERT(th != NULL); + LASSERT(dt->do_body_ops); + LASSERT(dt->do_body_ops->dbo_declare_write); + rc = dt->do_body_ops->dbo_declare_write(env, dt, buf, pos, th); + return rc; } static inline int dt_declare_create(const struct lu_env *env, @@ -1072,6 +1150,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) { @@ -1144,7 +1232,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); } @@ -1214,8 +1302,8 @@ static inline int dt_declare_punch(const struct lu_env *env, { LASSERT(dt); LASSERT(dt->do_body_ops); - LASSERT(dt->do_body_ops->do_declare_punch); - return dt->do_body_ops->do_declare_punch(env, dt, start, end, th); + LASSERT(dt->do_body_ops->dbo_declare_punch); + return dt->do_body_ops->dbo_declare_punch(env, dt, start, end, th); } static inline int dt_punch(const struct lu_env *env, struct dt_object *dt, @@ -1224,8 +1312,8 @@ static inline int dt_punch(const struct lu_env *env, struct dt_object *dt, { LASSERT(dt); LASSERT(dt->do_body_ops); - LASSERT(dt->do_body_ops->do_punch); - return dt->do_body_ops->do_punch(env, dt, start, end, th, capa); + LASSERT(dt->do_body_ops->dbo_punch); + return dt->do_body_ops->dbo_punch(env, dt, start, end, th, capa); } static inline int dt_fiemap_get(const struct lu_env *env, struct dt_object *d, @@ -1355,6 +1443,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) @@ -1447,6 +1547,20 @@ struct dt_find_hint { struct dt_object *dfh_o; }; +struct dt_insert_rec { + union { + const struct lu_fid *rec_fid; + void *rec_data; + }; + union { + struct { + __u32 rec_type; + __u32 rec_padding; + }; + __u64 rec_misc; + }; +}; + struct dt_thread_info { char dti_buf[DT_MAX_PATH]; struct dt_find_hint dti_dfh; @@ -1455,7 +1569,9 @@ 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; + struct dt_insert_rec dti_dt_rec; }; extern struct lu_context_key dt_key; @@ -1469,4 +1585,30 @@ static inline struct dt_thread_info *dt_info(const struct lu_env *env) return dti; } +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, + int count, int *eof, void *data); +int lprocfs_dt_rd_kbytesfree(char *page, char **start, off_t off, + int count, int *eof, void *data); +int lprocfs_dt_rd_kbytesavail(char *page, char **start, off_t off, + int count, int *eof, void *data); +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 */