X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Finclude%2Flu_object.h;h=cf83ef1913ba4b21087215b0b223ff9eafe0a29a;hp=e9761de169046e055125c69964e51fdb0b11726b;hb=38ee91992ac8b21143234c64c22b935680439b39;hpb=d2d56f38da01001c92a09afc6b52b5acbd9bc13c diff --git a/lustre/include/lu_object.h b/lustre/include/lu_object.h index e9761de..cf83ef1 100644 --- a/lustre/include/lu_object.h +++ b/lustre/include/lu_object.h @@ -23,6 +23,8 @@ #ifndef __LUSTRE_LU_OBJECT_H #define __LUSTRE_LU_OBJECT_H +#include + /* * struct lu_fid */ @@ -295,10 +297,11 @@ struct lu_device_type_operations { struct lu_device_type *t, struct lustre_cfg *lcfg); /* - * Free device. Dual to ->ldto_device_alloc(). + * Free device. Dual to ->ldto_device_alloc(). Returns pointer to + * the next device in the stack. */ - void (*ldto_device_free)(const struct lu_env *, - struct lu_device *); + struct lu_device *(*ldto_device_free)(const struct lu_env *, + struct lu_device *); /* * Initialize the devices after allocation @@ -367,13 +370,13 @@ struct lu_attr { __u32 la_flags; /* object flags */ __u32 la_nlink; /* number of persistent references to this * object */ + __u32 la_blkbits; /* blk bits of the object*/ __u32 la_blksize; /* blk size of the object*/ __u32 la_rdev; /* real device */ __u64 la_valid; /* valid bits */ }; - /* * Layer in the layered object. */ @@ -796,6 +799,11 @@ void lu_object_print(const struct lu_env *env, void *cookie, int lu_object_invariant(const struct lu_object *o); /* + * Finalize and free devices in the device stack. + */ +void lu_stack_fini(const struct lu_env *env, struct lu_device *top); + +/* * Returns 1 iff object @o exists on the stable storage, * returns -1 iff object @o is on remote server. */ @@ -825,7 +833,7 @@ static inline int lu_object_assert_not_exists(const struct lu_object *o) /* * Attr of this object. */ -static inline const __u32 lu_object_attr(const struct lu_object *o) +static inline __u32 lu_object_attr(const struct lu_object *o) { LASSERT(lu_object_exists(o) > 0); return o->lo_header->loh_attr; @@ -833,7 +841,7 @@ static inline const __u32 lu_object_attr(const struct lu_object *o) struct lu_rdpg { /* input params, should be filled out by mdt */ - __u32 rp_hash; /* hash */ + __u64 rp_hash; /* hash */ int rp_count; /* count in bytes */ int rp_npages; /* number of pages */ struct page **rp_pages; /* pointers to pages */ @@ -844,6 +852,14 @@ enum lu_xattr_flags { LU_XATTR_CREATE = (1 << 1) }; +/* For lu_context health-checks */ +enum lu_context_state { + LCS_INITIALIZED = 1, + LCS_ENTERED, + LCS_LEFT, + LCS_FINALIZED +}; + /* * lu_context. Execution context for lu_object methods. Currently associated * with thread. @@ -884,6 +900,7 @@ struct lu_context { * detail. */ void **lc_value; + enum lu_context_state lc_state; }; /* @@ -966,11 +983,49 @@ struct lu_context_key { struct module *lct_owner; }; +#define LU_KEY_INIT(mod, type) \ + static void* mod##_key_init(const struct lu_context *ctx, \ + struct lu_context_key *key) \ + { \ + type *value; \ + \ + CLASSERT(CFS_PAGE_SIZE >= sizeof (*value)); \ + \ + OBD_ALLOC_PTR(value); \ + if (value == NULL) \ + value = ERR_PTR(-ENOMEM); \ + \ + return value; \ + } \ + struct __##mod##__dummy_init {;} /* semicolon catcher */ + +#define LU_KEY_FINI(mod, type) \ + static void mod##_key_fini(const struct lu_context *ctx, \ + struct lu_context_key *key, void* data) \ + { \ + type *info = data; \ + \ + OBD_FREE_PTR(info); \ + } \ + struct __##mod##__dummy_fini {;} /* semicolon catcher */ + +#define LU_KEY_INIT_FINI(mod, type) \ + LU_KEY_INIT(mod,type); \ + LU_KEY_FINI(mod,type) + +#define LU_CONTEXT_KEY_DEFINE(mod, tags) \ + struct lu_context_key mod##_thread_key = { \ + .lct_tags = tags, \ + .lct_init = mod##_key_init, \ + .lct_fini = mod##_key_fini \ + } + #define LU_CONTEXT_KEY_INIT(key) \ do { \ (key)->lct_owner = THIS_MODULE; \ } while (0) + /* * Register new key. */ @@ -979,6 +1034,73 @@ int lu_context_key_register(struct lu_context_key *key); * Deregister key. */ void lu_context_key_degister(struct lu_context_key *key); + +#define LU_KEY_REGISTER_GENERIC(mod) \ + static int mod##_key_register_generic(struct lu_context_key *k, ...) \ + { \ + struct lu_context_key* key = k; \ + va_list args; \ + int result; \ + \ + va_start(args, k); \ + \ + do { \ + LU_CONTEXT_KEY_INIT(key); \ + result = lu_context_key_register(key); \ + if (result) \ + break; \ + key = va_arg(args, struct lu_context_key*); \ + } while (key != NULL); \ + \ + va_end(args); \ + \ + if (result) { \ + va_start(args, k); \ + while (k != key) { \ + lu_context_key_degister(k); \ + k = va_arg(args, struct lu_context_key*); \ + } \ + va_end(args); \ + } \ + \ + return result; \ + } + +#define LU_KEY_DEGISTER_GENERIC(mod) \ + static void mod##_key_degister_generic(struct lu_context_key *k, ...) \ + { \ + va_list args; \ + \ + va_start(args, k); \ + \ + do { \ + lu_context_key_degister(k); \ + k = va_arg(args, struct lu_context_key*); \ + } while (k != NULL); \ + \ + va_end(args); \ + } + +#define LU_TYPE_INIT(mod, ...) \ + LU_KEY_REGISTER_GENERIC(mod) \ + static int mod##_type_init(struct lu_device_type *t) \ + { \ + return mod##_key_register_generic(__VA_ARGS__, NULL); \ + } \ + struct __##mod##_dummy_type_init {;} + +#define LU_TYPE_FINI(mod, ...) \ + LU_KEY_DEGISTER_GENERIC(mod) \ + static void mod##_type_fini(struct lu_device_type *t) \ + { \ + mod##_key_degister_generic(__VA_ARGS__, NULL); \ + } \ + struct __##mod##_dummy_type_fini {;} + +#define LU_TYPE_INIT_FINI(mod, ...) \ + LU_TYPE_INIT(mod, __VA_ARGS__); \ + LU_TYPE_FINI(mod, __VA_ARGS__) + /* * Return value associated with key @key in context @ctx. */