X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Finclude%2Fdt_object.h;h=a8ec09c197091965c0860d6e369369ed1e7c7c88;hb=ee79350df9f075b58958afc76ffa507ca23780be;hp=fbbb9ad5606a89718ffdb47181e7350ec8199fe5;hpb=fbf5870b9848929d352460f1f005b79c0b5ccc5a;p=fs%2Flustre-release.git diff --git a/lustre/include/dt_object.h b/lustre/include/dt_object.h index fbbb9ad..a8ec09c 100644 --- a/lustre/include/dt_object.h +++ b/lustre/include/dt_object.h @@ -66,6 +66,7 @@ struct txn_param; struct dt_device; struct dt_object; struct dt_index_features; +struct dt_quota_ctxt; struct dt_device_param { unsigned ddp_max_name_len; @@ -82,11 +83,12 @@ enum dt_txn_op { DTO_IDNEX_UPDATE, DTO_OBJECT_CREATE, DTO_OBJECT_DELETE, - DTO_ATTR_SET, + DTO_ATTR_SET_BASE, DTO_XATTR_SET, DTO_LOG_REC, /**< XXX temporary: dt layer knows nothing about llog. */ DTO_WRITE_BASE, DTO_WRITE_BLOCK, + DTO_ATTR_SET_CHOWN, DTO_NR }; @@ -144,6 +146,12 @@ struct dt_device_operations { struct dt_device *dev, int mode, unsigned long timeout, __u32 alg, struct lustre_capa_key *keys); + /** + * Initialize quota context. + */ + void (*dt_init_quota_ctxt)(const struct lu_env *env, + struct dt_device *dev, + struct dt_quota_ctxt *ctxt, void *data); /** * get transaction credits for given \a op. @@ -163,6 +171,8 @@ struct dt_index_features { size_t dif_recsize_min; /** maximal required record size, 0 if no limit */ size_t dif_recsize_max; + /** pointer size for record */ + size_t dif_ptrsize; }; enum dt_index_flags { @@ -188,10 +198,53 @@ extern const struct dt_index_features dt_directory_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; + __u32 dah_mode; +}; + +/** + * object type specifier. + */ + +enum dt_format_type { + DFT_REGULAR, + DFT_DIR, + /** for mknod */ + DFT_NODE, + /** for special index */ + DFT_INDEX, + /** for symbolic link */ + DFT_SYM, +}; + +/** + * object format specifier. + */ +struct dt_object_format { + /** type for dt object */ + enum dt_format_type dof_type; + union { + struct dof_regular { + } dof_reg; + struct dof_dir { + } dof_dir; + struct dof_node { + } dof_node; + /** + * special index need feature as parameter to create + * special idx + */ + struct dof_index { + const struct dt_index_features *di_feat; + } dof_idx; + } u; }; +enum dt_format_type dt_mode_to_dft(__u32 mode); + +/** Version type. May differ in DMU and ldiskfs */ +typedef __u64 dt_obj_version_t; + /** * Per-dt-object operations. */ @@ -204,6 +257,8 @@ struct dt_object_operations { struct dt_object *dt); void (*do_write_unlock)(const struct lu_env *env, struct dt_object *dt); + int (*do_write_locked)(const struct lu_env *env, + struct dt_object *dt); /** * Note: following ->do_{x,}attr_{set,get}() operations are very * similar to ->moo_{x,}attr_{set,get}() operations in struct @@ -289,6 +344,7 @@ struct dt_object_operations { int (*do_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); /** @@ -320,6 +376,17 @@ struct dt_object_operations { struct lustre_capa *old, __u64 opc); int (*do_object_sync)(const struct lu_env *, struct dt_object *); + dt_obj_version_t (*do_version_get)(const struct lu_env *env, + struct dt_object *dt); + void (*do_version_set)(const struct lu_env *env, struct dt_object *dt, + dt_obj_version_t new_version); + /** + * 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); }; /** @@ -337,7 +404,8 @@ struct dt_body_operations { */ 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); + struct thandle *handle, struct lustre_capa *capa, + int ignore_quota); }; /** @@ -370,7 +438,8 @@ struct dt_index_operations { */ int (*dio_insert)(const struct lu_env *env, struct dt_object *dt, const struct dt_rec *rec, const struct dt_key *key, - struct thandle *handle, struct lustre_capa *capa); + struct thandle *handle, struct lustre_capa *capa, + int ignore_quota); /** * precondition: dt_object_exists(dt); */ @@ -387,7 +456,7 @@ struct dt_index_operations { * precondition: dt_object_exists(dt); */ struct dt_it *(*init)(const struct lu_env *env, - struct dt_object *dt, int writable, + struct dt_object *dt, struct lustre_capa *capa); void (*fini)(const struct lu_env *env, struct dt_it *di); @@ -396,16 +465,16 @@ struct dt_index_operations { const struct dt_key *key); void (*put)(const struct lu_env *env, struct dt_it *di); - int (*del)(const struct lu_env *env, - struct dt_it *di, struct thandle *th); int (*next)(const struct lu_env *env, struct dt_it *di); struct dt_key *(*key)(const struct lu_env *env, const struct dt_it *di); int (*key_size)(const struct lu_env *env, const struct dt_it *di); - struct dt_rec *(*rec)(const struct lu_env *env, - const struct dt_it *di); + int (*rec)(const struct lu_env *env, + const struct dt_it *di, + struct lu_dirent *lde, + __u32 attr); __u64 (*store)(const struct lu_env *env, const struct dt_it *di); int (*load)(const struct lu_env *env, @@ -469,6 +538,17 @@ static inline void txn_param_init(struct txn_param *p, unsigned int credits) p->tp_credits = credits; } +static inline void txn_param_credit_add(struct txn_param *p, + unsigned int credits) +{ + p->tp_credits += credits; +} + +static inline void txn_param_sync(struct txn_param *p) +{ + p->tp_sync = 1; +} + /** * This is the general purpose transaction handle. * 1. Transaction Life Cycle @@ -514,6 +594,7 @@ struct dt_txn_callback { int (*dtc_txn_commit)(const struct lu_env *env, struct thandle *txn, void *cookie); void *dtc_cookie; + __u32 dtc_tag; struct list_head dtc_linkage; }; @@ -526,10 +607,65 @@ int dt_txn_hook_stop(const struct lu_env *env, struct thandle *txn); int dt_txn_hook_commit(const struct lu_env *env, struct thandle *txn); int dt_try_as_dir(const struct lu_env *env, struct dt_object *obj); + +/** + * Callback function used for parsing path. + * \see llo_store_resolve + */ +typedef int (*dt_entry_func_t)(const struct lu_env *env, + const char *name, + void *pvt); + +#define DT_MAX_PATH 1024 + +int dt_path_parser(const struct lu_env *env, + char *local, dt_entry_func_t entry_func, + void *data); + struct dt_object *dt_store_open(const struct lu_env *env, - struct dt_device *dt, const char *name, + struct dt_device *dt, + const char *dirname, + const char *filename, struct lu_fid *fid); -/** @} dt */ +struct dt_object *dt_locate(const struct lu_env *env, + struct dt_device *dev, + const struct lu_fid *fid); + +static inline dt_obj_version_t do_version_get(const struct lu_env *env, + struct dt_object *o) +{ + LASSERT(o->do_ops->do_version_get); + return o->do_ops->do_version_get(env, o); +} + +static inline void do_version_set(const struct lu_env *env, + struct dt_object *o, dt_obj_version_t v) +{ + LASSERT(o->do_ops->do_version_set); + return o->do_ops->do_version_set(env, o, v); +} + +int dt_record_read(const struct lu_env *env, struct dt_object *dt, + struct lu_buf *buf, loff_t *pos); +int dt_record_write(const struct lu_env *env, struct dt_object *dt, + const struct lu_buf *buf, loff_t *pos, struct thandle *th); + +static inline struct thandle *dt_trans_start(const struct lu_env *env, + struct dt_device *d, + struct txn_param *p) +{ + LASSERT(d->dd_ops->dt_trans_start); + return d->dd_ops->dt_trans_start(env, d, p); +} + +static inline void 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); +} +/** @} dt */ #endif /* __LUSTRE_DT_OBJECT_H */