X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fobdclass%2Fcl_object.c;h=5d77f90609310fc4e6f285b79e71136d07bc616d;hb=1fe3ae8dab47941e465dcc47ffa52e18538aeb1e;hp=ac46d074b24e3ce0c1d1f7ebb453a17b7972022f;hpb=cc2ff1bfd66a5c004eb6ed61fc2dac3f1ab49d3a;p=fs%2Flustre-release.git diff --git a/lustre/obdclass/cl_object.c b/lustre/obdclass/cl_object.c index ac46d07..5d77f90 100644 --- a/lustre/obdclass/cl_object.c +++ b/lustre/obdclass/cl_object.c @@ -27,7 +27,7 @@ * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2011, 2013, Intel Corporation. + * Copyright (c) 2011, 2014, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -44,7 +44,6 @@ * * i_mutex * PG_locked - * ->coh_lock_guard * ->coh_attr_guard * ->ls_guard */ @@ -59,17 +58,14 @@ #include #include /* for cfs_hash stuff */ #include +#include #include "cl_internal.h" static struct kmem_cache *cl_env_kmem; -/** Lock class of cl_object_header::coh_lock_guard */ -static struct lock_class_key cl_lock_guard_class; /** Lock class of cl_object_header::coh_attr_guard */ static struct lock_class_key cl_attr_guard_class; -extern __u32 lu_context_tags_default; -extern __u32 lu_session_tags_default; /** * Initialize cl_object_header. */ @@ -80,11 +76,8 @@ int cl_object_header_init(struct cl_object_header *h) ENTRY; result = lu_object_header_init(&h->coh_lu); if (result == 0) { - spin_lock_init(&h->coh_lock_guard); spin_lock_init(&h->coh_attr_guard); - lockdep_set_class(&h->coh_lock_guard, &cl_lock_guard_class); lockdep_set_class(&h->coh_attr_guard, &cl_attr_guard_class); - CFS_INIT_LIST_HEAD(&h->coh_locks); h->coh_page_bufsize = 0; } RETURN(result); @@ -96,7 +89,6 @@ EXPORT_SYMBOL(cl_object_header_init); */ void cl_object_header_fini(struct cl_object_header *h) { - LASSERT(cfs_list_empty(&h->coh_locks)); lu_object_header_fini(&h->coh_lu); } EXPORT_SYMBOL(cl_object_header_fini); @@ -187,6 +179,7 @@ static spinlock_t *cl_object_attr_guard(struct cl_object *o) * cl_object_attr_get(), cl_object_attr_set(). */ void cl_object_attr_lock(struct cl_object *o) +__acquires(cl_object_attr_guard(o)) { spin_lock(cl_object_attr_guard(o)); } @@ -196,6 +189,7 @@ EXPORT_SYMBOL(cl_object_attr_lock); * Releases data-attributes lock, acquired by cl_object_attr_lock(). */ void cl_object_attr_unlock(struct cl_object *o) +__releases(cl_object_attr_guard(o)) { spin_unlock(cl_object_attr_guard(o)); } @@ -219,7 +213,7 @@ int cl_object_attr_get(const struct lu_env *env, struct cl_object *obj, top = obj->co_lu.lo_header; result = 0; - cfs_list_for_each_entry(obj, &top->loh_layers, co_lu.lo_linkage) { + list_for_each_entry(obj, &top->loh_layers, co_lu.lo_linkage) { if (obj->co_ops->coo_attr_get != NULL) { result = obj->co_ops->coo_attr_get(env, obj, attr); if (result != 0) { @@ -249,20 +243,19 @@ int cl_object_attr_set(const struct lu_env *env, struct cl_object *obj, assert_spin_locked(cl_object_attr_guard(obj)); ENTRY; - top = obj->co_lu.lo_header; - result = 0; - cfs_list_for_each_entry_reverse(obj, &top->loh_layers, - co_lu.lo_linkage) { - if (obj->co_ops->coo_attr_set != NULL) { - result = obj->co_ops->coo_attr_set(env, obj, attr, v); - if (result != 0) { - if (result > 0) - result = 0; - break; - } - } - } - RETURN(result); + top = obj->co_lu.lo_header; + result = 0; + list_for_each_entry_reverse(obj, &top->loh_layers, co_lu.lo_linkage) { + if (obj->co_ops->coo_attr_set != NULL) { + result = obj->co_ops->coo_attr_set(env, obj, attr, v); + if (result != 0) { + if (result > 0) + result = 0; + break; + } + } + } + RETURN(result); } EXPORT_SYMBOL(cl_object_attr_set); @@ -283,8 +276,7 @@ int cl_object_glimpse(const struct lu_env *env, struct cl_object *obj, ENTRY; top = obj->co_lu.lo_header; result = 0; - cfs_list_for_each_entry_reverse(obj, &top->loh_layers, - co_lu.lo_linkage) { + list_for_each_entry_reverse(obj, &top->loh_layers, co_lu.lo_linkage) { if (obj->co_ops->coo_glimpse != NULL) { result = obj->co_ops->coo_glimpse(env, obj, lvb); if (result != 0) @@ -312,7 +304,7 @@ int cl_conf_set(const struct lu_env *env, struct cl_object *obj, ENTRY; top = obj->co_lu.lo_header; result = 0; - cfs_list_for_each_entry(obj, &top->loh_layers, co_lu.lo_linkage) { + list_for_each_entry(obj, &top->loh_layers, co_lu.lo_linkage) { if (obj->co_ops->coo_conf_set != NULL) { result = obj->co_ops->coo_conf_set(env, obj, conf); if (result != 0) @@ -326,7 +318,7 @@ EXPORT_SYMBOL(cl_conf_set); /** * Prunes caches of pages and locks for this object. */ -void cl_object_prune(const struct lu_env *env, struct cl_object *obj) +int cl_object_prune(const struct lu_env *env, struct cl_object *obj) { struct lu_object_header *top; struct cl_object *o; @@ -335,7 +327,7 @@ void cl_object_prune(const struct lu_env *env, struct cl_object *obj) top = obj->co_lu.lo_header; result = 0; - cfs_list_for_each_entry(o, &top->loh_layers, co_lu.lo_linkage) { + list_for_each_entry(o, &top->loh_layers, co_lu.lo_linkage) { if (o->co_ops->coo_prune != NULL) { result = o->co_ops->coo_prune(env, o); if (result != 0) @@ -343,14 +335,33 @@ void cl_object_prune(const struct lu_env *env, struct cl_object *obj) } } - /* TODO: pruning locks will be moved into layers after cl_lock - * simplification is done */ - cl_locks_prune(env, obj, 1); - EXIT; + RETURN(result); } EXPORT_SYMBOL(cl_object_prune); /** + * Get stripe information of this object. + */ +int cl_object_getstripe(const struct lu_env *env, struct cl_object *obj, + struct lov_user_md __user *uarg) +{ + struct lu_object_header *top; + int result = 0; + ENTRY; + + top = obj->co_lu.lo_header; + list_for_each_entry(obj, &top->loh_layers, co_lu.lo_linkage) { + if (obj->co_ops->coo_getstripe != NULL) { + result = obj->co_ops->coo_getstripe(env, obj, uarg); + if (result != 0) + break; + } + } + RETURN(result); +} +EXPORT_SYMBOL(cl_object_getstripe); + +/** * Helper function removing all object locks, and marking object for * deletion. All object pages must have been deleted at this point. * @@ -359,38 +370,12 @@ EXPORT_SYMBOL(cl_object_prune); */ void cl_object_kill(const struct lu_env *env, struct cl_object *obj) { - struct cl_object_header *hdr; - - hdr = cl_object_header(obj); + struct cl_object_header *hdr = cl_object_header(obj); set_bit(LU_OBJECT_HEARD_BANSHEE, &hdr->coh_lu.loh_flags); - /* - * Destroy all locks. Object destruction (including cl_inode_fini()) - * cannot cancel the locks, because in the case of a local client, - * where client and server share the same thread running - * prune_icache(), this can dead-lock with ldlm_cancel_handler() - * waiting on __wait_on_freeing_inode(). - */ - cl_locks_prune(env, obj, 0); } EXPORT_SYMBOL(cl_object_kill); -/** - * Check if the object has locks. - */ -int cl_object_has_locks(struct cl_object *obj) -{ - struct cl_object_header *head = cl_object_header(obj); - int has; - - spin_lock(&head->coh_lock_guard); - has = cfs_list_empty(&head->coh_locks); - spin_unlock(&head->coh_lock_guard); - - return (has == 0); -} -EXPORT_SYMBOL(cl_object_has_locks); - void cache_stats_init(struct cache_stats *cs, const char *name) { int i; @@ -400,7 +385,8 @@ void cache_stats_init(struct cache_stats *cs, const char *name) atomic_set(&cs->cs_stats[i], 0); } -int cache_stats_print(const struct cache_stats *cs, struct seq_file *m, int h) +static int cache_stats_print(const struct cache_stats *cs, + struct seq_file *m, int h) { int i; @@ -433,17 +419,14 @@ static void cl_env_percpu_refill(void); */ int cl_site_init(struct cl_site *s, struct cl_device *d) { - int i; + size_t i; int result; result = lu_site_init(&s->cs_lu, &d->cd_lu_dev); if (result == 0) { cache_stats_init(&s->cs_pages, "pages"); - cache_stats_init(&s->cs_locks, "locks"); for (i = 0; i < ARRAY_SIZE(s->cs_pages_state); ++i) atomic_set(&s->cs_pages_state[0], 0); - for (i = 0; i < ARRAY_SIZE(s->cs_locks_state); ++i) - atomic_set(&s->cs_locks_state[i], 0); cl_env_percpu_refill(); } return result; @@ -477,16 +460,7 @@ int cl_site_stats_print(const struct cl_site *site, struct seq_file *m) [CPS_PAGEIN] = "r", [CPS_FREEING] = "f" }; - static const char *lstate[] = { - [CLS_NEW] = "n", - [CLS_QUEUING] = "q", - [CLS_ENQUEUED] = "e", - [CLS_HELD] = "h", - [CLS_INTRANSIT] = "t", - [CLS_CACHED] = "c", - [CLS_FREEING] = "f" - }; - int i; + size_t i; /* lookup hit total busy create @@ -501,12 +475,6 @@ locks: ...... ...... ...... ...... ...... [...... ...... ...... ...... ......] seq_printf(m, "%s: %u ", pstate[i], atomic_read(&site->cs_pages_state[i])); seq_printf(m, "]\n"); - cache_stats_print(&site->cs_locks, m, 0); - seq_printf(m, " ["); - for (i = 0; i < ARRAY_SIZE(site->cs_locks_state); ++i) - seq_printf(m, "%s: %u ", lstate[i], - atomic_read(&site->cs_locks_state[i])); - seq_printf(m, "]\n"); cache_stats_print(&cl_env_stats, m, 0); seq_printf(m, "\n"); return 0; @@ -537,7 +505,7 @@ EXPORT_SYMBOL(cl_site_stats_print); * bz20044, bz22683. */ -static CFS_LIST_HEAD(cl_envs); +static struct list_head cl_envs; static unsigned cl_envs_cached_nr = 0; static unsigned cl_envs_cached_max = 128; /* XXX: prototype: arbitrary limit * for now. */ @@ -555,7 +523,7 @@ struct cl_env { * This allows cl_env to be entered into cl_env_hash which implements * the current thread -> client environment lookup. */ - cfs_hlist_node_t ce_node; + struct hlist_node ce_node; #endif /** * Owner for the current cl_env. @@ -574,7 +542,7 @@ struct cl_env { * Linkage into global list of all client environments. Used for * garbage collection. */ - cfs_list_t ce_linkage; + struct list_head ce_linkage; /* * */ @@ -627,14 +595,15 @@ static unsigned cl_env_hops_hash(cfs_hash_t *lh, #endif } -static void *cl_env_hops_obj(cfs_hlist_node_t *hn) +static void *cl_env_hops_obj(struct hlist_node *hn) { - struct cl_env *cle = cfs_hlist_entry(hn, struct cl_env, ce_node); - LASSERT(cle->ce_magic == &cl_env_init0); - return (void *)cle; + struct cl_env *cle = hlist_entry(hn, struct cl_env, ce_node); + + LASSERT(cle->ce_magic == &cl_env_init0); + return (void *)cle; } -static int cl_env_hops_keycmp(const void *key, cfs_hlist_node_t *hn) +static int cl_env_hops_keycmp(const void *key, struct hlist_node *hn) { struct cl_env *cle = cl_env_hops_obj(hn); @@ -642,9 +611,9 @@ static int cl_env_hops_keycmp(const void *key, cfs_hlist_node_t *hn) return (key == cle->ce_owner); } -static void cl_env_hops_noop(cfs_hash_t *hs, cfs_hlist_node_t *hn) +static void cl_env_hops_noop(cfs_hash_t *hs, struct hlist_node *hn) { - struct cl_env *cle = cfs_hlist_entry(hn, struct cl_env, ce_node); + struct cl_env *cle = hlist_entry(hn, struct cl_env, ce_node); LASSERT(cle->ce_magic == &cl_env_init0); } @@ -763,7 +732,7 @@ static struct lu_env *cl_env_new(__u32 ctx_tags, __u32 ses_tags, void *debug) if (cle != NULL) { int rc; - CFS_INIT_LIST_HEAD(&cle->ce_linkage); + INIT_LIST_HEAD(&cle->ce_linkage); cle->ce_magic = &cl_env_init0; env = &cle->ce_lu; rc = lu_env_init(env, LCT_CL_THREAD|ctx_tags); @@ -804,12 +773,12 @@ static struct lu_env *cl_env_obtain(void *debug) ENTRY; spin_lock(&cl_envs_guard); - LASSERT(equi(cl_envs_cached_nr == 0, cfs_list_empty(&cl_envs))); + LASSERT(equi(cl_envs_cached_nr == 0, list_empty(&cl_envs))); if (cl_envs_cached_nr > 0) { int rc; cle = container_of(cl_envs.next, struct cl_env, ce_linkage); - cfs_list_del_init(&cle->ce_linkage); + list_del_init(&cle->ce_linkage); cl_envs_cached_nr--; spin_unlock(&cl_envs_guard); @@ -931,9 +900,9 @@ unsigned cl_env_cache_purge(unsigned nr) ENTRY; spin_lock(&cl_envs_guard); - for (; !cfs_list_empty(&cl_envs) && nr > 0; --nr) { + for (; !list_empty(&cl_envs) && nr > 0; --nr) { cle = container_of(cl_envs.next, struct cl_env, ce_linkage); - cfs_list_del_init(&cle->ce_linkage); + list_del_init(&cle->ce_linkage); LASSERT(cl_envs_cached_nr > 0); cl_envs_cached_nr--; spin_unlock(&cl_envs_guard); @@ -941,7 +910,7 @@ unsigned cl_env_cache_purge(unsigned nr) cl_env_fini(cle); spin_lock(&cl_envs_guard); } - LASSERT(equi(cl_envs_cached_nr == 0, cfs_list_empty(&cl_envs))); + LASSERT(equi(cl_envs_cached_nr == 0, list_empty(&cl_envs))); spin_unlock(&cl_envs_guard); RETURN(nr); } @@ -979,7 +948,7 @@ void cl_env_put(struct lu_env *env, int *refcheck) (env->le_ctx.lc_tags & ~LCT_HAS_EXIT) == LCT_CL_THREAD && (env->le_ses->lc_tags & ~LCT_HAS_EXIT) == LCT_SESSION) { spin_lock(&cl_envs_guard); - cfs_list_add(&cle->ce_linkage, &cl_envs); + list_add(&cle->ce_linkage, &cl_envs); cl_envs_cached_nr++; spin_unlock(&cl_envs_guard); } else @@ -1125,7 +1094,7 @@ static int cl_env_percpu_init(void) cle = &cl_env_percpu[i]; env = &cle->ce_lu; - CFS_INIT_LIST_HEAD(&cle->ce_linkage); + INIT_LIST_HEAD(&cle->ce_linkage); cle->ce_magic = &cl_env_init0; rc = lu_env_init(env, LCT_CL_THREAD | tags); if (rc == 0) { @@ -1254,12 +1223,6 @@ void cl_stack_fini(const struct lu_env *env, struct cl_device *cl) } EXPORT_SYMBOL(cl_stack_fini); -int cl_lock_init(void); -void cl_lock_fini(void); - -int cl_page_init(void); -void cl_page_fini(void); - static struct lu_context_key cl_key; struct cl_thread_info *cl_env_info(const struct lu_env *env) @@ -1277,7 +1240,7 @@ static void *cl_key_init(const struct lu_context *ctx, info = cl0_key_init(ctx, key); if (!IS_ERR(info)) { - int i; + size_t i; for (i = 0; i < ARRAY_SIZE(info->clt_counters); ++i) lu_ref_init(&info->clt_counters[i].ctc_locks_locked); @@ -1288,8 +1251,8 @@ static void *cl_key_init(const struct lu_context *ctx, static void cl_key_fini(const struct lu_context *ctx, struct lu_context_key *key, void *data) { - struct cl_thread_info *info; - int i; + struct cl_thread_info *info; + size_t i; info = data; for (i = 0; i < ARRAY_SIZE(info->clt_counters); ++i) @@ -1300,8 +1263,8 @@ static void cl_key_fini(const struct lu_context *ctx, static void cl_key_exit(const struct lu_context *ctx, struct lu_context_key *key, void *data) { - struct cl_thread_info *info = data; - int i; + struct cl_thread_info *info = data; + size_t i; for (i = 0; i < ARRAY_SIZE(info->clt_counters); ++i) { LASSERT(info->clt_counters[i].ctc_nr_held == 0); @@ -1339,11 +1302,13 @@ static struct lu_kmem_descr cl_object_caches[] = { */ int cl_global_init(void) { - int result; + int result; - result = cl_env_store_init(); - if (result) - return result; + INIT_LIST_HEAD(&cl_envs); + + result = cl_env_store_init(); + if (result) + return result; result = lu_kmem_init(cl_object_caches); if (result) @@ -1354,22 +1319,13 @@ int cl_global_init(void) if (result) goto out_kmem; - result = cl_lock_init(); - if (result) - goto out_context; - - result = cl_page_init(); - if (result) - goto out_lock; - result = cl_env_percpu_init(); if (result) /* no cl_env_percpu_fini on error */ - goto out_lock; + goto out_context; return 0; -out_lock: - cl_lock_fini(); + out_context: lu_context_key_degister(&cl_key); out_kmem: @@ -1385,8 +1341,6 @@ out_store: void cl_global_fini(void) { cl_env_percpu_fini(); - cl_lock_fini(); - cl_page_fini(); lu_context_key_degister(&cl_key); lu_kmem_fini(cl_object_caches); cl_env_store_fini();