diff options
Diffstat (limited to 'drivers/staging/lustre/lustre/ldlm')
-rw-r--r-- | drivers/staging/lustre/lustre/ldlm/interval_tree.c | 50 | ||||
-rw-r--r-- | drivers/staging/lustre/lustre/ldlm/l_lock.c | 8 | ||||
-rw-r--r-- | drivers/staging/lustre/lustre/ldlm/ldlm_extent.c | 10 | ||||
-rw-r--r-- | drivers/staging/lustre/lustre/ldlm/ldlm_flock.c | 66 | ||||
-rw-r--r-- | drivers/staging/lustre/lustre/ldlm/ldlm_internal.h | 49 | ||||
-rw-r--r-- | drivers/staging/lustre/lustre/ldlm/ldlm_lib.c | 79 | ||||
-rw-r--r-- | drivers/staging/lustre/lustre/ldlm/ldlm_lock.c | 394 | ||||
-rw-r--r-- | drivers/staging/lustre/lustre/ldlm/ldlm_lockd.c | 124 | ||||
-rw-r--r-- | drivers/staging/lustre/lustre/ldlm/ldlm_pool.c | 283 | ||||
-rw-r--r-- | drivers/staging/lustre/lustre/ldlm/ldlm_request.c | 181 | ||||
-rw-r--r-- | drivers/staging/lustre/lustre/ldlm/ldlm_resource.c | 95 |
11 files changed, 635 insertions, 704 deletions
diff --git a/drivers/staging/lustre/lustre/ldlm/interval_tree.c b/drivers/staging/lustre/lustre/ldlm/interval_tree.c index ce90c7e3c488..c65b13c800f9 100644 --- a/drivers/staging/lustre/lustre/ldlm/interval_tree.c +++ b/drivers/staging/lustre/lustre/ldlm/interval_tree.c @@ -133,53 +133,45 @@ for (node = interval_last(root); node != NULL; \ static struct interval_node *interval_first(struct interval_node *node) { - ENTRY; - if (!node) - RETURN(NULL); + return NULL; while (node->in_left) node = node->in_left; - RETURN(node); + return node; } static struct interval_node *interval_last(struct interval_node *node) { - ENTRY; - if (!node) - RETURN(NULL); + return NULL; while (node->in_right) node = node->in_right; - RETURN(node); + return node; } static struct interval_node *interval_next(struct interval_node *node) { - ENTRY; - if (!node) - RETURN(NULL); + return NULL; if (node->in_right) - RETURN(interval_first(node->in_right)); + return interval_first(node->in_right); while (node->in_parent && node_is_right_child(node)) node = node->in_parent; - RETURN(node->in_parent); + return node->in_parent; } static struct interval_node *interval_prev(struct interval_node *node) { - ENTRY; - if (!node) - RETURN(NULL); + return NULL; if (node->in_left) - RETURN(interval_last(node->in_left)); + return interval_last(node->in_left); while (node->in_parent && node_is_left_child(node)) node = node->in_parent; - RETURN(node->in_parent); + return node->in_parent; } enum interval_iter interval_iterate(struct interval_node *root, @@ -188,7 +180,6 @@ enum interval_iter interval_iterate(struct interval_node *root, { struct interval_node *node; enum interval_iter rc = INTERVAL_ITER_CONT; - ENTRY; interval_for_each(node, root) { rc = func(node, data); @@ -196,7 +187,7 @@ enum interval_iter interval_iterate(struct interval_node *root, break; } - RETURN(rc); + return rc; } EXPORT_SYMBOL(interval_iterate); @@ -206,7 +197,6 @@ enum interval_iter interval_iterate_reverse(struct interval_node *root, { struct interval_node *node; enum interval_iter rc = INTERVAL_ITER_CONT; - ENTRY; interval_for_each_reverse(node, root) { rc = func(node, data); @@ -214,7 +204,7 @@ enum interval_iter interval_iterate_reverse(struct interval_node *root, break; } - RETURN(rc); + return rc; } EXPORT_SYMBOL(interval_iterate_reverse); @@ -225,7 +215,6 @@ struct interval_node *interval_find(struct interval_node *root, { struct interval_node *walk = root; int rc; - ENTRY; while (walk) { rc = extent_compare(ex, &walk->in_extent); @@ -237,7 +226,7 @@ struct interval_node *interval_find(struct interval_node *root, walk = walk->in_right; } - RETURN(walk); + return walk; } EXPORT_SYMBOL(interval_find); @@ -326,7 +315,6 @@ static void interval_insert_color(struct interval_node *node, struct interval_node **root) { struct interval_node *parent, *gparent; - ENTRY; while ((parent = node->in_parent) && node_is_red(parent)) { gparent = parent->in_parent; @@ -373,7 +361,6 @@ static void interval_insert_color(struct interval_node *node, } (*root)->in_color = INTERVAL_BLACK; - EXIT; } struct interval_node *interval_insert(struct interval_node *node, @@ -381,14 +368,13 @@ struct interval_node *interval_insert(struct interval_node *node, { struct interval_node **p, *parent = NULL; - ENTRY; LASSERT(!interval_is_intree(node)); p = root; while (*p) { parent = *p; if (node_equal(parent, node)) - RETURN(parent); + return parent; /* max_high field must be updated after each iteration */ if (parent->in_max_high < interval_high(node)) @@ -409,7 +395,7 @@ struct interval_node *interval_insert(struct interval_node *node, interval_insert_color(node, root); node->in_intree = 1; - RETURN(NULL); + return NULL; } EXPORT_SYMBOL(interval_insert); @@ -423,7 +409,6 @@ static void interval_erase_color(struct interval_node *node, struct interval_node **root) { struct interval_node *tmp; - ENTRY; while (node_is_black_or_0(node) && node != *root) { if (parent->in_left == node) { @@ -490,7 +475,6 @@ static void interval_erase_color(struct interval_node *node, } if (node) node->in_color = INTERVAL_BLACK; - EXIT; } /* @@ -501,7 +485,6 @@ static void update_maxhigh(struct interval_node *node, __u64 old_maxhigh) { __u64 left_max, right_max; - ENTRY; while (node) { left_max = node->in_left ? node->in_left->in_max_high : 0; @@ -513,7 +496,6 @@ static void update_maxhigh(struct interval_node *node, break; node = node->in_parent; } - EXIT; } void interval_erase(struct interval_node *node, @@ -521,7 +503,6 @@ void interval_erase(struct interval_node *node, { struct interval_node *child, *parent; int color; - ENTRY; LASSERT(interval_is_intree(node)); node->in_intree = 0; @@ -586,7 +567,6 @@ void interval_erase(struct interval_node *node, color: if (color == INTERVAL_BLACK) interval_erase_color(child, parent, root); - EXIT; } EXPORT_SYMBOL(interval_erase); diff --git a/drivers/staging/lustre/lustre/ldlm/l_lock.c b/drivers/staging/lustre/lustre/ldlm/l_lock.c index 853409aa945d..32f4d52b5362 100644 --- a/drivers/staging/lustre/lustre/ldlm/l_lock.c +++ b/drivers/staging/lustre/lustre/ldlm/l_lock.c @@ -51,12 +51,12 @@ struct ldlm_resource *lock_res_and_lock(struct ldlm_lock *lock) { /* on server-side resource of lock doesn't change */ - if (!lock->l_ns_srv) + if ((lock->l_flags & LDLM_FL_NS_SRV) == 0) spin_lock(&lock->l_lock); lock_res(lock->l_resource); - lock->l_res_locked = 1; + lock->l_flags |= LDLM_FL_RES_LOCKED; return lock->l_resource; } EXPORT_SYMBOL(lock_res_and_lock); @@ -67,10 +67,10 @@ EXPORT_SYMBOL(lock_res_and_lock); void unlock_res_and_lock(struct ldlm_lock *lock) { /* on server-side resource of lock doesn't change */ - lock->l_res_locked = 0; + lock->l_flags &= ~LDLM_FL_RES_LOCKED; unlock_res(lock->l_resource); - if (!lock->l_ns_srv) + if ((lock->l_flags & LDLM_FL_NS_SRV) == 0) spin_unlock(&lock->l_lock); } EXPORT_SYMBOL(unlock_res_and_lock); diff --git a/drivers/staging/lustre/lustre/ldlm/ldlm_extent.c b/drivers/staging/lustre/lustre/ldlm/ldlm_extent.c index f7432f78e396..7e316637369b 100644 --- a/drivers/staging/lustre/lustre/ldlm/ldlm_extent.c +++ b/drivers/staging/lustre/lustre/ldlm/ldlm_extent.c @@ -72,7 +72,6 @@ __u64 ldlm_extent_shift_kms(struct ldlm_lock *lock, __u64 old_kms) struct list_head *tmp; struct ldlm_lock *lck; __u64 kms = 0; - ENTRY; /* don't let another thread in ldlm_extent_shift_kms race in * just after we finish and take our lock into account in its @@ -86,7 +85,7 @@ __u64 ldlm_extent_shift_kms(struct ldlm_lock *lock, __u64 old_kms) continue; if (lck->l_policy_data.l_extent.end >= old_kms) - RETURN(old_kms); + return old_kms; /* This extent _has_ to be smaller than old_kms (checked above) * so kms can only ever be smaller or the same as old_kms. */ @@ -95,7 +94,7 @@ __u64 ldlm_extent_shift_kms(struct ldlm_lock *lock, __u64 old_kms) } LASSERTF(kms <= old_kms, "kms "LPU64" old_kms "LPU64"\n", kms, old_kms); - RETURN(kms); + return kms; } EXPORT_SYMBOL(ldlm_extent_shift_kms); @@ -103,16 +102,15 @@ struct kmem_cache *ldlm_interval_slab; struct ldlm_interval *ldlm_interval_alloc(struct ldlm_lock *lock) { struct ldlm_interval *node; - ENTRY; LASSERT(lock->l_resource->lr_type == LDLM_EXTENT); OBD_SLAB_ALLOC_PTR_GFP(node, ldlm_interval_slab, __GFP_IO); if (node == NULL) - RETURN(NULL); + return NULL; INIT_LIST_HEAD(&node->li_group); ldlm_interval_attach(node, lock); - RETURN(node); + return node; } void ldlm_interval_free(struct ldlm_interval *node) diff --git a/drivers/staging/lustre/lustre/ldlm/ldlm_flock.c b/drivers/staging/lustre/lustre/ldlm/ldlm_flock.c index f100a84bde73..c68ed2766333 100644 --- a/drivers/staging/lustre/lustre/ldlm/ldlm_flock.c +++ b/drivers/staging/lustre/lustre/ldlm/ldlm_flock.c @@ -142,8 +142,6 @@ static inline void ldlm_flock_blocking_unlink(struct ldlm_lock *req) static inline void ldlm_flock_destroy(struct ldlm_lock *lock, ldlm_mode_t mode, __u64 flags) { - ENTRY; - LDLM_DEBUG(lock, "ldlm_flock_destroy(mode: %d, flags: 0x%llx)", mode, flags); @@ -162,7 +160,6 @@ ldlm_flock_destroy(struct ldlm_lock *lock, ldlm_mode_t mode, __u64 flags) } ldlm_lock_destroy_nolock(lock); - EXIT; } /** @@ -198,6 +195,7 @@ ldlm_flock_deadlock(struct ldlm_lock *req, struct ldlm_lock *bl_lock) if (lock == NULL) break; + LASSERT(req != lock); flock = &lock->l_policy_data.l_flock; LASSERT(flock->owner == bl_owner); bl_owner = flock->blocking_owner; @@ -253,7 +251,6 @@ ldlm_process_flock_lock(struct ldlm_lock *req, __u64 *flags, int first_enq, int splitted = 0; const struct ldlm_callback_suite null_cbs = { NULL }; int rc; - ENTRY; CDEBUG(D_DLMTRACE, "flags %#llx owner "LPU64" pid %u mode %u start " LPU64" end "LPU64"\n", *flags, @@ -308,12 +305,12 @@ reprocess: continue; if (!first_enq) - RETURN(LDLM_ITER_CONTINUE); + return LDLM_ITER_CONTINUE; if (*flags & LDLM_FL_BLOCK_NOWAIT) { ldlm_flock_destroy(req, mode, *flags); *err = -EAGAIN; - RETURN(LDLM_ITER_STOP); + return LDLM_ITER_STOP; } if (*flags & LDLM_FL_TEST_LOCK) { @@ -326,24 +323,27 @@ reprocess: req->l_policy_data.l_flock.end = lock->l_policy_data.l_flock.end; *flags |= LDLM_FL_LOCK_CHANGED; - RETURN(LDLM_ITER_STOP); - } - - if (ldlm_flock_deadlock(req, lock)) { - ldlm_flock_destroy(req, mode, *flags); - *err = -EDEADLK; - RETURN(LDLM_ITER_STOP); + return LDLM_ITER_STOP; } + /* add lock to blocking list before deadlock + * check to prevent race */ rc = ldlm_flock_blocking_link(req, lock); if (rc) { ldlm_flock_destroy(req, mode, *flags); *err = rc; - RETURN(LDLM_ITER_STOP); + return LDLM_ITER_STOP; + } + if (ldlm_flock_deadlock(req, lock)) { + ldlm_flock_blocking_unlink(req); + ldlm_flock_destroy(req, mode, *flags); + *err = -EDEADLK; + return LDLM_ITER_STOP; } + ldlm_resource_add_lock(res, &res->lr_waiting, req); *flags |= LDLM_FL_BLOCK_GRANTED; - RETURN(LDLM_ITER_STOP); + return LDLM_ITER_STOP; } } @@ -351,7 +351,7 @@ reprocess: ldlm_flock_destroy(req, mode, *flags); req->l_req_mode = LCK_NL; *flags |= LDLM_FL_LOCK_CHANGED; - RETURN(LDLM_ITER_STOP); + return LDLM_ITER_STOP; } /* In case we had slept on this lock request take it off of the @@ -463,7 +463,7 @@ reprocess: ldlm_flock_destroy(req, lock->l_granted_mode, *flags); *err = -ENOLCK; - RETURN(LDLM_ITER_STOP); + return LDLM_ITER_STOP; } goto reprocess; } @@ -530,7 +530,7 @@ reprocess: ldlm_flock_destroy(req, mode, *flags); ldlm_resource_dump(D_INFO, res); - RETURN(LDLM_ITER_CONTINUE); + return LDLM_ITER_CONTINUE; } struct ldlm_flock_wait_data { @@ -542,7 +542,6 @@ static void ldlm_flock_interrupted_wait(void *data) { struct ldlm_lock *lock; - ENTRY; lock = ((struct ldlm_flock_wait_data *)data)->fwd_lock; @@ -553,8 +552,6 @@ ldlm_flock_interrupted_wait(void *data) /* client side - set flag to prevent lock from being put on LRU list */ lock->l_flags |= LDLM_FL_CBPENDING; unlock_res_and_lock(lock); - - EXIT; } /** @@ -577,7 +574,6 @@ ldlm_flock_completion_ast(struct ldlm_lock *lock, __u64 flags, void *data) struct l_wait_info lwi; ldlm_error_t err; int rc = 0; - ENTRY; CDEBUG(D_DLMTRACE, "flags: 0x%llx data: %p getlk: %p\n", flags, data, getlk); @@ -595,7 +591,7 @@ ldlm_flock_completion_ast(struct ldlm_lock *lock, __u64 flags, void *data) /* Need to wake up the waiter if we were evicted */ wake_up(&lock->l_waitq); - RETURN(0); + return 0; } LASSERT(flags != LDLM_FL_WAIT_NOREPROC); @@ -607,7 +603,7 @@ ldlm_flock_completion_ast(struct ldlm_lock *lock, __u64 flags, void *data) goto granted; /* CP AST RPC: lock get granted, wake it up */ wake_up(&lock->l_waitq); - RETURN(0); + return 0; } LDLM_DEBUG(lock, "client-side enqueue returned a blocked lock, " @@ -633,26 +629,26 @@ ldlm_flock_completion_ast(struct ldlm_lock *lock, __u64 flags, void *data) if (rc) { LDLM_DEBUG(lock, "client-side enqueue waking up: failed (%d)", rc); - RETURN(rc); + return rc; } granted: OBD_FAIL_TIMEOUT(OBD_FAIL_LDLM_CP_CB_WAIT, 10); - if (lock->l_destroyed) { + if (lock->l_flags & LDLM_FL_DESTROYED) { LDLM_DEBUG(lock, "client-side enqueue waking up: destroyed"); - RETURN(0); + return 0; } if (lock->l_flags & LDLM_FL_FAILED) { LDLM_DEBUG(lock, "client-side enqueue waking up: failed"); - RETURN(-EIO); + return -EIO; } if (rc) { LDLM_DEBUG(lock, "client-side enqueue waking up: failed (%d)", rc); - RETURN(rc); + return rc; } LDLM_DEBUG(lock, "client-side enqueue granted"); @@ -694,15 +690,13 @@ granted: ldlm_process_flock_lock(lock, &noreproc, 1, &err, NULL); } unlock_res_and_lock(lock); - RETURN(0); + return 0; } EXPORT_SYMBOL(ldlm_flock_completion_ast); int ldlm_flock_blocking_ast(struct ldlm_lock *lock, struct ldlm_lock_desc *desc, void *data, int flag) { - ENTRY; - LASSERT(lock); LASSERT(flag == LDLM_CB_CANCELING); @@ -710,7 +704,7 @@ int ldlm_flock_blocking_ast(struct ldlm_lock *lock, struct ldlm_lock_desc *desc, lock_res_and_lock(lock); ldlm_flock_blocking_unlink(lock); unlock_res_and_lock(lock); - RETURN(0); + return 0; } void ldlm_flock_policy_wire18_to_local(const ldlm_wire_policy_data_t *wpolicy, @@ -831,19 +825,17 @@ int ldlm_init_flock_export(struct obd_export *exp) &ldlm_export_flock_ops, CFS_HASH_DEFAULT | CFS_HASH_NBLK_CHANGE); if (!exp->exp_flock_hash) - RETURN(-ENOMEM); + return -ENOMEM; - RETURN(0); + return 0; } EXPORT_SYMBOL(ldlm_init_flock_export); void ldlm_destroy_flock_export(struct obd_export *exp) { - ENTRY; if (exp->exp_flock_hash) { cfs_hash_putref(exp->exp_flock_hash); exp->exp_flock_hash = NULL; } - EXIT; } EXPORT_SYMBOL(ldlm_destroy_flock_export); diff --git a/drivers/staging/lustre/lustre/ldlm/ldlm_internal.h b/drivers/staging/lustre/lustre/ldlm/ldlm_internal.h index 141a957462f1..8cd79633dea3 100644 --- a/drivers/staging/lustre/lustre/ldlm/ldlm_internal.h +++ b/drivers/staging/lustre/lustre/ldlm/ldlm_internal.h @@ -36,23 +36,46 @@ #define MAX_STRING_SIZE 128 -extern atomic_t ldlm_srv_namespace_nr; -extern atomic_t ldlm_cli_namespace_nr; +extern int ldlm_srv_namespace_nr; +extern int ldlm_cli_namespace_nr; extern struct mutex ldlm_srv_namespace_lock; extern struct list_head ldlm_srv_namespace_list; extern struct mutex ldlm_cli_namespace_lock; -extern struct list_head ldlm_cli_namespace_list; +extern struct list_head ldlm_cli_active_namespace_list; +extern struct list_head ldlm_cli_inactive_namespace_list; -static inline atomic_t *ldlm_namespace_nr(ldlm_side_t client) +static inline int ldlm_namespace_nr_read(ldlm_side_t client) { return client == LDLM_NAMESPACE_SERVER ? - &ldlm_srv_namespace_nr : &ldlm_cli_namespace_nr; + ldlm_srv_namespace_nr : ldlm_cli_namespace_nr; +} + +static inline void ldlm_namespace_nr_inc(ldlm_side_t client) +{ + if (client == LDLM_NAMESPACE_SERVER) + ldlm_srv_namespace_nr++; + else + ldlm_cli_namespace_nr++; +} + +static inline void ldlm_namespace_nr_dec(ldlm_side_t client) +{ + if (client == LDLM_NAMESPACE_SERVER) + ldlm_srv_namespace_nr--; + else + ldlm_cli_namespace_nr--; } static inline struct list_head *ldlm_namespace_list(ldlm_side_t client) { return client == LDLM_NAMESPACE_SERVER ? - &ldlm_srv_namespace_list : &ldlm_cli_namespace_list; + &ldlm_srv_namespace_list : &ldlm_cli_active_namespace_list; +} + +static inline struct list_head *ldlm_namespace_inactive_list(ldlm_side_t client) +{ + return client == LDLM_NAMESPACE_SERVER ? + &ldlm_srv_namespace_list : &ldlm_cli_inactive_namespace_list; } static inline struct mutex *ldlm_namespace_lock(ldlm_side_t client) @@ -61,6 +84,16 @@ static inline struct mutex *ldlm_namespace_lock(ldlm_side_t client) &ldlm_srv_namespace_lock : &ldlm_cli_namespace_lock; } +/* ns_bref is the number of resources in this namespace */ +static inline int ldlm_ns_empty(struct ldlm_namespace *ns) +{ + return atomic_read(&ns->ns_bref) == 0; +} + +void ldlm_namespace_move_to_active_locked(struct ldlm_namespace *, ldlm_side_t); +void ldlm_namespace_move_to_inactive_locked(struct ldlm_namespace *, ldlm_side_t); +struct ldlm_namespace *ldlm_namespace_first_locked(ldlm_side_t); + /* ldlm_request.c */ /* Cancel lru flag, it indicates we cancel aged locks. */ enum { @@ -159,8 +192,8 @@ void ldlm_destroy_flock_export(struct obd_export *exp); void l_check_ns_lock(struct ldlm_namespace *ns); void l_check_no_ns_lock(struct ldlm_namespace *ns); -extern proc_dir_entry_t *ldlm_svc_proc_dir; -extern proc_dir_entry_t *ldlm_type_proc_dir; +extern struct proc_dir_entry *ldlm_svc_proc_dir; +extern struct proc_dir_entry *ldlm_type_proc_dir; struct ldlm_state { struct ptlrpc_service *ldlm_cb_service; diff --git a/drivers/staging/lustre/lustre/ldlm/ldlm_lib.c b/drivers/staging/lustre/lustre/ldlm/ldlm_lib.c index 42df53072dc3..1a8c0d7005c7 100644 --- a/drivers/staging/lustre/lustre/ldlm/ldlm_lib.c +++ b/drivers/staging/lustre/lustre/ldlm/ldlm_lib.c @@ -60,17 +60,16 @@ static int import_set_conn(struct obd_import *imp, struct obd_uuid *uuid, struct ptlrpc_connection *ptlrpc_conn; struct obd_import_conn *imp_conn = NULL, *item; int rc = 0; - ENTRY; if (!create && !priority) { CDEBUG(D_HA, "Nothing to do\n"); - RETURN(-EINVAL); + return -EINVAL; } ptlrpc_conn = ptlrpc_uuid_to_connection(uuid); if (!ptlrpc_conn) { CDEBUG(D_HA, "can't find connection %s\n", uuid->uuid); - RETURN (-ENOENT); + return -ENOENT; } if (create) { @@ -115,13 +114,13 @@ static int import_set_conn(struct obd_import *imp, struct obd_uuid *uuid, } spin_unlock(&imp->imp_lock); - RETURN(0); + return 0; out_free: if (imp_conn) OBD_FREE(imp_conn, sizeof(*imp_conn)); out_put: ptlrpc_connection_put(ptlrpc_conn); - RETURN(rc); + return rc; } int import_set_conn_priority(struct obd_import *imp, struct obd_uuid *uuid) @@ -141,7 +140,6 @@ int client_import_del_conn(struct obd_import *imp, struct obd_uuid *uuid) struct obd_import_conn *imp_conn; struct obd_export *dlmexp; int rc = -ENOENT; - ENTRY; spin_lock(&imp->imp_lock); if (list_empty(&imp->imp_conn_list)) { @@ -187,7 +185,7 @@ out: spin_unlock(&imp->imp_lock); if (rc == -ENOENT) CERROR("connection %s not found\n", uuid->uuid); - RETURN(rc); + return rc; } EXPORT_SYMBOL(client_import_del_conn); @@ -200,7 +198,6 @@ int client_import_find_conn(struct obd_import *imp, lnet_nid_t peer, { struct obd_import_conn *conn; int rc = -ENOENT; - ENTRY; spin_lock(&imp->imp_lock); list_for_each_entry(conn, &imp->imp_conn_list, oic_item) { @@ -212,7 +209,7 @@ int client_import_find_conn(struct obd_import *imp, lnet_nid_t peer, } } spin_unlock(&imp->imp_lock); - RETURN(rc); + return rc; } EXPORT_SYMBOL(client_import_find_conn); @@ -267,7 +264,6 @@ int client_obd_setup(struct obd_device *obddev, struct lustre_cfg *lcfg) ldlm_ns_type_t ns_type = LDLM_NS_TYPE_UNKNOWN; int rc; char *cli_name = lustre_cfg_buf(lcfg, 0); - ENTRY; /* In a more perfect world, we would hang a ptlrpc_client off of * obd_type and just use the values from there. */ @@ -305,27 +301,27 @@ int client_obd_setup(struct obd_device *obddev, struct lustre_cfg *lcfg) } else { CERROR("unknown client OBD type \"%s\", can't setup\n", name); - RETURN(-EINVAL); + return -EINVAL; } if (LUSTRE_CFG_BUFLEN(lcfg, 1) < 1) { CERROR("requires a TARGET UUID\n"); - RETURN(-EINVAL); + return -EINVAL; } if (LUSTRE_CFG_BUFLEN(lcfg, 1) > 37) { CERROR("client UUID must be less than 38 characters\n"); - RETURN(-EINVAL); + return -EINVAL; } if (LUSTRE_CFG_BUFLEN(lcfg, 2) < 1) { CERROR("setup requires a SERVER UUID\n"); - RETURN(-EINVAL); + return -EINVAL; } if (LUSTRE_CFG_BUFLEN(lcfg, 2) > 37) { CERROR("target UUID must be less than 38 characters\n"); - RETURN(-EINVAL); + return -EINVAL; } init_rwsem(&cli->cl_sem); @@ -339,8 +335,8 @@ int client_obd_setup(struct obd_device *obddev, struct lustre_cfg *lcfg) cli->cl_avail_grant = 0; /* FIXME: Should limit this for the sum of all cl_dirty_max. */ cli->cl_dirty_max = OSC_MAX_DIRTY_DEFAULT * 1024 * 1024; - if (cli->cl_dirty_max >> PAGE_CACHE_SHIFT > num_physpages / 8) - cli->cl_dirty_max = num_physpages << (PAGE_CACHE_SHIFT - 3); + if (cli->cl_dirty_max >> PAGE_CACHE_SHIFT > totalram_pages / 8) + cli->cl_dirty_max = totalram_pages << (PAGE_CACHE_SHIFT - 3); INIT_LIST_HEAD(&cli->cl_cache_waiters); INIT_LIST_HEAD(&cli->cl_loi_ready_list); INIT_LIST_HEAD(&cli->cl_loi_hp_ready_list); @@ -388,11 +384,11 @@ int client_obd_setup(struct obd_device *obddev, struct lustre_cfg *lcfg) if (!strcmp(name, LUSTRE_MDC_NAME)) { cli->cl_max_rpcs_in_flight = MDC_MAX_RIF_DEFAULT; - } else if (num_physpages >> (20 - PAGE_CACHE_SHIFT) <= 128 /* MB */) { + } else if (totalram_pages >> (20 - PAGE_CACHE_SHIFT) <= 128 /* MB */) { cli->cl_max_rpcs_in_flight = 2; - } else if (num_physpages >> (20 - PAGE_CACHE_SHIFT) <= 256 /* MB */) { + } else if (totalram_pages >> (20 - PAGE_CACHE_SHIFT) <= 256 /* MB */) { cli->cl_max_rpcs_in_flight = 3; - } else if (num_physpages >> (20 - PAGE_CACHE_SHIFT) <= 512 /* MB */) { + } else if (totalram_pages >> (20 - PAGE_CACHE_SHIFT) <= 512 /* MB */) { cli->cl_max_rpcs_in_flight = 4; } else { if (osc_on_mdt(obddev->obd_name)) @@ -452,29 +448,27 @@ int client_obd_setup(struct obd_device *obddev, struct lustre_cfg *lcfg) cli->cl_qchk_stat = CL_NOT_QUOTACHECKED; - RETURN(rc); + return rc; err_import: class_destroy_import(imp); err_ldlm: ldlm_put_ref(); err: - RETURN(rc); + return rc; } EXPORT_SYMBOL(client_obd_setup); int client_obd_cleanup(struct obd_device *obddev) { - ENTRY; - ldlm_namespace_free_post(obddev->obd_namespace); obddev->obd_namespace = NULL; LASSERT(obddev->u.cli.cl_import == NULL); ldlm_put_ref(); - RETURN(0); + return 0; } EXPORT_SYMBOL(client_obd_cleanup); @@ -489,7 +483,6 @@ int client_connect_import(const struct lu_env *env, struct obd_connect_data *ocd; struct lustre_handle conn = { 0 }; int rc; - ENTRY; *exp = NULL; down_write(&cli->cl_sem); @@ -532,8 +525,6 @@ int client_connect_import(const struct lu_env *env, ptlrpc_pinger_add_import(imp); - EXIT; - if (rc) { out_ldlm: cli->cl_conn_count--; @@ -553,12 +544,11 @@ int client_disconnect_export(struct obd_export *exp) struct client_obd *cli; struct obd_import *imp; int rc = 0, err; - ENTRY; if (!obd) { CERROR("invalid export for disconnect: exp %p cookie "LPX64"\n", exp, exp ? exp->exp_handle.h_cookie : -1); - RETURN(-EINVAL); + return -EINVAL; } cli = &obd->u.cli; @@ -605,8 +595,6 @@ int client_disconnect_export(struct obd_export *exp) ptlrpc_invalidate_import(imp); - EXIT; - out_disconnect: /* Use server style - class_disconnect should be always called for * o_disconnect. */ @@ -616,7 +604,7 @@ out_disconnect: up_write(&cli->cl_sem); - RETURN(rc); + return rc; } EXPORT_SYMBOL(client_disconnect_export); @@ -627,7 +615,6 @@ EXPORT_SYMBOL(client_disconnect_export); int target_pack_pool_reply(struct ptlrpc_request *req) { struct obd_device *obd; - ENTRY; /* Check that we still have all structures alive as this may * be some late RPC at shutdown time. */ @@ -635,7 +622,7 @@ int target_pack_pool_reply(struct ptlrpc_request *req) !exp_connect_lru_resize(req->rq_export))) { lustre_msg_set_slv(req->rq_repmsg, 0); lustre_msg_set_limit(req->rq_repmsg, 0); - RETURN(0); + return 0; } /* OBD is alive here as export is alive, which we checked above. */ @@ -646,7 +633,7 @@ int target_pack_pool_reply(struct ptlrpc_request *req) lustre_msg_set_limit(req->rq_repmsg, obd->obd_pool_limit); read_unlock(&obd->obd_pool_lock); - RETURN(0); + return 0; } EXPORT_SYMBOL(target_pack_pool_reply); @@ -674,10 +661,8 @@ void target_send_reply(struct ptlrpc_request *req, int rc, int fail_id) int netrc; struct ptlrpc_reply_state *rs; struct obd_export *exp; - ENTRY; if (req->rq_no_reply) { - EXIT; return; } @@ -686,7 +671,6 @@ void target_send_reply(struct ptlrpc_request *req, int rc, int fail_id) if (rs == NULL || !rs->rs_difficult) { /* no notifiers */ target_send_reply_msg (req, rc, fail_id); - EXIT; return; } @@ -757,19 +741,18 @@ void target_send_reply(struct ptlrpc_request *req, int rc, int fail_id) } spin_unlock(&rs->rs_lock); spin_unlock(&svcpt->scp_rep_lock); - EXIT; } EXPORT_SYMBOL(target_send_reply); ldlm_mode_t lck_compat_array[] = { - [LCK_EX] LCK_COMPAT_EX, - [LCK_PW] LCK_COMPAT_PW, - [LCK_PR] LCK_COMPAT_PR, - [LCK_CW] LCK_COMPAT_CW, - [LCK_CR] LCK_COMPAT_CR, - [LCK_NL] LCK_COMPAT_NL, - [LCK_GROUP] LCK_COMPAT_GROUP, - [LCK_COS] LCK_COMPAT_COS, + [LCK_EX] = LCK_COMPAT_EX, + [LCK_PW] = LCK_COMPAT_PW, + [LCK_PR] = LCK_COMPAT_PR, + [LCK_CW] = LCK_COMPAT_CW, + [LCK_CR] = LCK_COMPAT_CR, + [LCK_NL] = LCK_COMPAT_NL, + [LCK_GROUP] = LCK_COMPAT_GROUP, + [LCK_COS] = LCK_COMPAT_COS, }; /** diff --git a/drivers/staging/lustre/lustre/ldlm/ldlm_lock.c b/drivers/staging/lustre/lustre/ldlm/ldlm_lock.c index 33b76a1e5dec..6133b3f34718 100644 --- a/drivers/staging/lustre/lustre/ldlm/ldlm_lock.c +++ b/drivers/staging/lustre/lustre/ldlm/ldlm_lock.c @@ -49,45 +49,45 @@ /* lock types */ char *ldlm_lockname[] = { - [0] "--", - [LCK_EX] "EX", - [LCK_PW] "PW", - [LCK_PR] "PR", - [LCK_CW] "CW", - [LCK_CR] "CR", - [LCK_NL] "NL", - [LCK_GROUP] "GROUP", - [LCK_COS] "COS" + [0] = "--", + [LCK_EX] = "EX", + [LCK_PW] = "PW", + [LCK_PR] = "PR", + [LCK_CW] = "CW", + [LCK_CR] = "CR", + [LCK_NL] = "NL", + [LCK_GROUP] = "GROUP", + [LCK_COS] = "COS", }; EXPORT_SYMBOL(ldlm_lockname); char *ldlm_typename[] = { - [LDLM_PLAIN] "PLN", - [LDLM_EXTENT] "EXT", - [LDLM_FLOCK] "FLK", - [LDLM_IBITS] "IBT", + [LDLM_PLAIN] = "PLN", + [LDLM_EXTENT] = "EXT", + [LDLM_FLOCK] = "FLK", + [LDLM_IBITS] = "IBT", }; EXPORT_SYMBOL(ldlm_typename); static ldlm_policy_wire_to_local_t ldlm_policy_wire18_to_local[] = { - [LDLM_PLAIN - LDLM_MIN_TYPE] ldlm_plain_policy_wire_to_local, - [LDLM_EXTENT - LDLM_MIN_TYPE] ldlm_extent_policy_wire_to_local, - [LDLM_FLOCK - LDLM_MIN_TYPE] ldlm_flock_policy_wire18_to_local, - [LDLM_IBITS - LDLM_MIN_TYPE] ldlm_ibits_policy_wire_to_local, + [LDLM_PLAIN - LDLM_MIN_TYPE] = ldlm_plain_policy_wire_to_local, + [LDLM_EXTENT - LDLM_MIN_TYPE] = ldlm_extent_policy_wire_to_local, + [LDLM_FLOCK - LDLM_MIN_TYPE] = ldlm_flock_policy_wire18_to_local, + [LDLM_IBITS - LDLM_MIN_TYPE] = ldlm_ibits_policy_wire_to_local, }; static ldlm_policy_wire_to_local_t ldlm_policy_wire21_to_local[] = { - [LDLM_PLAIN - LDLM_MIN_TYPE] ldlm_plain_policy_wire_to_local, - [LDLM_EXTENT - LDLM_MIN_TYPE] ldlm_extent_policy_wire_to_local, - [LDLM_FLOCK - LDLM_MIN_TYPE] ldlm_flock_policy_wire21_to_local, - [LDLM_IBITS - LDLM_MIN_TYPE] ldlm_ibits_policy_wire_to_local, + [LDLM_PLAIN - LDLM_MIN_TYPE] = ldlm_plain_policy_wire_to_local, + [LDLM_EXTENT - LDLM_MIN_TYPE] = ldlm_extent_policy_wire_to_local, + [LDLM_FLOCK - LDLM_MIN_TYPE] = ldlm_flock_policy_wire21_to_local, + [LDLM_IBITS - LDLM_MIN_TYPE] = ldlm_ibits_policy_wire_to_local, }; static ldlm_policy_local_to_wire_t ldlm_policy_local_to_wire[] = { - [LDLM_PLAIN - LDLM_MIN_TYPE] ldlm_plain_policy_local_to_wire, - [LDLM_EXTENT - LDLM_MIN_TYPE] ldlm_extent_policy_local_to_wire, - [LDLM_FLOCK - LDLM_MIN_TYPE] ldlm_flock_policy_local_to_wire, - [LDLM_IBITS - LDLM_MIN_TYPE] ldlm_ibits_policy_local_to_wire, + [LDLM_PLAIN - LDLM_MIN_TYPE] = ldlm_plain_policy_local_to_wire, + [LDLM_EXTENT - LDLM_MIN_TYPE] = ldlm_extent_policy_local_to_wire, + [LDLM_FLOCK - LDLM_MIN_TYPE] = ldlm_flock_policy_local_to_wire, + [LDLM_IBITS - LDLM_MIN_TYPE] = ldlm_ibits_policy_local_to_wire, }; /** @@ -188,8 +188,6 @@ EXPORT_SYMBOL(ldlm_lock_get); */ void ldlm_lock_put(struct ldlm_lock *lock) { - ENTRY; - LASSERT(lock->l_resource != LP_POISON); LASSERT(atomic_read(&lock->l_refc) > 0); if (atomic_dec_and_test(&lock->l_refc)) { @@ -199,7 +197,7 @@ void ldlm_lock_put(struct ldlm_lock *lock) "final lock_put on destroyed lock, freeing it."); res = lock->l_resource; - LASSERT(lock->l_destroyed); + LASSERT(lock->l_flags & LDLM_FL_DESTROYED); LASSERT(list_empty(&lock->l_res_link)); LASSERT(list_empty(&lock->l_pending_chain)); @@ -220,8 +218,6 @@ void ldlm_lock_put(struct ldlm_lock *lock) lu_ref_fini(&lock->l_reference); OBD_FREE_RCU(lock, sizeof(*lock), &lock->l_handle); } - - EXIT; } EXPORT_SYMBOL(ldlm_lock_put); @@ -253,16 +249,14 @@ int ldlm_lock_remove_from_lru(struct ldlm_lock *lock) struct ldlm_namespace *ns = ldlm_lock_to_ns(lock); int rc; - ENTRY; - if (lock->l_ns_srv) { + if (lock->l_flags & LDLM_FL_NS_SRV) { LASSERT(list_empty(&lock->l_lru)); - RETURN(0); + return 0; } spin_lock(&ns->ns_lock); rc = ldlm_lock_remove_from_lru_nolock(lock); spin_unlock(&ns->ns_lock); - EXIT; return rc; } @@ -289,11 +283,9 @@ void ldlm_lock_add_to_lru(struct ldlm_lock *lock) { struct ldlm_namespace *ns = ldlm_lock_to_ns(lock); - ENTRY; spin_lock(&ns->ns_lock); ldlm_lock_add_to_lru_nolock(lock); spin_unlock(&ns->ns_lock); - EXIT; } /** @@ -304,10 +296,8 @@ void ldlm_lock_touch_in_lru(struct ldlm_lock *lock) { struct ldlm_namespace *ns = ldlm_lock_to_ns(lock); - ENTRY; - if (lock->l_ns_srv) { + if (lock->l_flags & LDLM_FL_NS_SRV) { LASSERT(list_empty(&lock->l_lru)); - EXIT; return; } @@ -317,7 +307,6 @@ void ldlm_lock_touch_in_lru(struct ldlm_lock *lock) ldlm_lock_add_to_lru_nolock(lock); } spin_unlock(&ns->ns_lock); - EXIT; } /** @@ -341,8 +330,6 @@ void ldlm_lock_touch_in_lru(struct ldlm_lock *lock) */ int ldlm_lock_destroy_internal(struct ldlm_lock *lock) { - ENTRY; - if (lock->l_readers || lock->l_writers) { LDLM_ERROR(lock, "lock still has references"); LBUG(); @@ -353,12 +340,11 @@ int ldlm_lock_destroy_internal(struct ldlm_lock *lock) LBUG(); } - if (lock->l_destroyed) { + if (lock->l_flags & LDLM_FL_DESTROYED) { LASSERT(list_empty(&lock->l_lru)); - EXIT; return 0; } - lock->l_destroyed = 1; + lock->l_flags |= LDLM_FL_DESTROYED; if (lock->l_export && lock->l_export->exp_lock_hash) { /* NB: it's safe to call cfs_hash_del() even lock isn't @@ -383,7 +369,6 @@ int ldlm_lock_destroy_internal(struct ldlm_lock *lock) if (lock->l_export && lock->l_completion_ast) lock->l_completion_ast(lock, 0); #endif - EXIT; return 1; } @@ -393,7 +378,7 @@ int ldlm_lock_destroy_internal(struct ldlm_lock *lock) void ldlm_lock_destroy(struct ldlm_lock *lock) { int first; - ENTRY; + lock_res_and_lock(lock); first = ldlm_lock_destroy_internal(lock); unlock_res_and_lock(lock); @@ -403,7 +388,6 @@ void ldlm_lock_destroy(struct ldlm_lock *lock) lu_ref_del(&lock->l_reference, "hash", lock); LDLM_LOCK_RELEASE(lock); } - EXIT; } /** @@ -412,14 +396,13 @@ void ldlm_lock_destroy(struct ldlm_lock *lock) void ldlm_lock_destroy_nolock(struct ldlm_lock *lock) { int first; - ENTRY; + first = ldlm_lock_destroy_internal(lock); /* drop reference from hashtable only for first destroy */ if (first) { lu_ref_del(&lock->l_reference, "hash", lock); LDLM_LOCK_RELEASE(lock); } - EXIT; } /* this is called by portals_handle2object with the handle lock taken */ @@ -450,14 +433,13 @@ struct portals_handle_ops lock_handle_ops = { static struct ldlm_lock *ldlm_lock_new(struct ldlm_resource *resource) { struct ldlm_lock *lock; - ENTRY; if (resource == NULL) LBUG(); OBD_SLAB_ALLOC_PTR_GFP(lock, ldlm_lock_slab, __GFP_IO); if (lock == NULL) - RETURN(NULL); + return NULL; spin_lock_init(&lock->l_lock); lock->l_resource = resource; @@ -493,7 +475,7 @@ static struct ldlm_lock *ldlm_lock_new(struct ldlm_resource *resource) #endif INIT_LIST_HEAD(&lock->l_exp_list); - RETURN(lock); + return lock; } /** @@ -507,7 +489,6 @@ int ldlm_lock_change_resource(struct ldlm_namespace *ns, struct ldlm_lock *lock, struct ldlm_resource *oldres = lock->l_resource; struct ldlm_resource *newres; int type; - ENTRY; LASSERT(ns_is_client(ns)); @@ -516,7 +497,7 @@ int ldlm_lock_change_resource(struct ldlm_namespace *ns, struct ldlm_lock *lock, sizeof(lock->l_resource->lr_name)) == 0) { /* Nothing to do */ unlock_res_and_lock(lock); - RETURN(0); + return 0; } LASSERT(new_resid->name[0] != 0); @@ -529,7 +510,7 @@ int ldlm_lock_change_resource(struct ldlm_namespace *ns, struct ldlm_lock *lock, newres = ldlm_resource_get(ns, NULL, new_resid, type, 1); if (newres == NULL) - RETURN(-ENOMEM); + return -ENOMEM; lu_ref_add(&newres->lr_reference, "lock", lock); /* @@ -557,7 +538,7 @@ int ldlm_lock_change_resource(struct ldlm_namespace *ns, struct ldlm_lock *lock, lu_ref_del(&oldres->lr_reference, "lock", lock); ldlm_resource_putref(oldres); - RETURN(0); + return 0; } EXPORT_SYMBOL(ldlm_lock_change_resource); @@ -586,19 +567,18 @@ struct ldlm_lock *__ldlm_handle2lock(const struct lustre_handle *handle, __u64 flags) { struct ldlm_lock *lock; - ENTRY; LASSERT(handle); lock = class_handle2object(handle->cookie); if (lock == NULL) - RETURN(NULL); + return NULL; /* It's unlikely but possible that someone marked the lock as * destroyed after we did handle2object on it */ - if (flags == 0 && !lock->l_destroyed) { + if (flags == 0 && ((lock->l_flags & LDLM_FL_DESTROYED)== 0)) { lu_ref_add(&lock->l_reference, "handle", current); - RETURN(lock); + return lock; } lock_res_and_lock(lock); @@ -606,24 +586,24 @@ struct ldlm_lock *__ldlm_handle2lock(const struct lustre_handle *handle, LASSERT(lock->l_resource != NULL); lu_ref_add_atomic(&lock->l_reference, "handle", current); - if (unlikely(lock->l_destroyed)) { + if (unlikely(lock->l_flags & LDLM_FL_DESTROYED)) { unlock_res_and_lock(lock); CDEBUG(D_INFO, "lock already destroyed: lock %p\n", lock); LDLM_LOCK_PUT(lock); - RETURN(NULL); + return NULL; } if (flags && (lock->l_flags & flags)) { unlock_res_and_lock(lock); LDLM_LOCK_PUT(lock); - RETURN(NULL); + return NULL; } if (flags) lock->l_flags |= flags; unlock_res_and_lock(lock); - RETURN(lock); + return lock; } EXPORT_SYMBOL(__ldlm_handle2lock); /** @} ldlm_handles */ @@ -695,7 +675,7 @@ void ldlm_add_bl_work_item(struct ldlm_lock *lock, struct ldlm_lock *new, lock->l_flags |= LDLM_FL_AST_SENT; /* If the enqueuing client said so, tell the AST recipient to * discard dirty data, rather than writing back. */ - if (new->l_flags & LDLM_AST_DISCARD_DATA) + if (new->l_flags & LDLM_FL_AST_DISCARD_DATA) lock->l_flags |= LDLM_FL_DISCARD_DATA; LASSERT(list_empty(&lock->l_bl_ast)); list_add(&lock->l_bl_ast, work_list); @@ -728,13 +708,11 @@ void ldlm_add_cp_work_item(struct ldlm_lock *lock, struct list_head *work_list) void ldlm_add_ast_work_item(struct ldlm_lock *lock, struct ldlm_lock *new, struct list_head *work_list) { - ENTRY; check_res_locked(lock->l_resource); if (new) ldlm_add_bl_work_item(lock, new, work_list); else ldlm_add_cp_work_item(lock, work_list); - EXIT; } /** @@ -853,7 +831,6 @@ void ldlm_lock_decref_internal_nolock(struct ldlm_lock *lock, __u32 mode) void ldlm_lock_decref_internal(struct ldlm_lock *lock, __u32 mode) { struct ldlm_namespace *ns; - ENTRY; lock_res_and_lock(lock); @@ -873,7 +850,7 @@ void ldlm_lock_decref_internal(struct ldlm_lock *lock, __u32 mode) (lock->l_flags & LDLM_FL_CBPENDING)) { /* If we received a blocked AST and this was the last reference, * run the callback. */ - if (lock->l_ns_srv && lock->l_export) + if ((lock->l_flags & LDLM_FL_NS_SRV) && lock->l_export) CERROR("FL_CBPENDING set on non-local lock--just a " "warning\n"); @@ -914,8 +891,6 @@ void ldlm_lock_decref_internal(struct ldlm_lock *lock, __u32 mode) LDLM_DEBUG(lock, "do not add lock into lru list"); unlock_res_and_lock(lock); } - - EXIT; } /** @@ -940,7 +915,6 @@ EXPORT_SYMBOL(ldlm_lock_decref); void ldlm_lock_decref_and_cancel(struct lustre_handle *lockh, __u32 mode) { struct ldlm_lock *lock = __ldlm_handle2lock(lockh, 0); - ENTRY; LASSERT(lock != NULL); @@ -979,7 +953,6 @@ static void search_granted_lock(struct list_head *queue, { struct list_head *tmp; struct ldlm_lock *lock, *mode_end, *policy_end; - ENTRY; list_for_each(tmp, queue) { lock = list_entry(tmp, struct ldlm_lock, l_res_link); @@ -999,7 +972,6 @@ static void search_granted_lock(struct list_head *queue, prev->res_link = &mode_end->l_res_link; prev->mode_link = &mode_end->l_sl_mode; prev->policy_link = &req->l_sl_policy; - EXIT; return; } else if (lock->l_resource->lr_type == LDLM_IBITS) { for (;;) { @@ -1018,7 +990,6 @@ static void search_granted_lock(struct list_head *queue, &policy_end->l_sl_mode; prev->policy_link = &policy_end->l_sl_policy; - EXIT; return; } @@ -1037,7 +1008,6 @@ static void search_granted_lock(struct list_head *queue, prev->res_link = &mode_end->l_res_link; prev->mode_link = &mode_end->l_sl_mode; prev->policy_link = &req->l_sl_policy; - EXIT; return; } else { LDLM_ERROR(lock,"is not LDLM_PLAIN or LDLM_IBITS lock"); @@ -1050,7 +1020,6 @@ static void search_granted_lock(struct list_head *queue, prev->res_link = queue->prev; prev->mode_link = &req->l_sl_mode; prev->policy_link = &req->l_sl_policy; - EXIT; return; } @@ -1062,14 +1031,13 @@ static void ldlm_granted_list_add_lock(struct ldlm_lock *lock, struct sl_insert_point *prev) { struct ldlm_resource *res = lock->l_resource; - ENTRY; check_res_locked(res); ldlm_resource_dump(D_INFO, res); LDLM_DEBUG(lock, "About to add lock:"); - if (lock->l_destroyed) { + if (lock->l_flags & LDLM_FL_DESTROYED) { CDEBUG(D_OTHER, "Lock destroyed, not adding to resource\n"); return; } @@ -1088,8 +1056,6 @@ static void ldlm_granted_list_add_lock(struct ldlm_lock *lock, list_add(&lock->l_sl_mode, prev->mode_link); if (&lock->l_sl_policy != prev->policy_link) list_add(&lock->l_sl_policy, prev->policy_link); - - EXIT; } /** @@ -1099,13 +1065,11 @@ static void ldlm_granted_list_add_lock(struct ldlm_lock *lock, static void ldlm_grant_lock_with_skiplist(struct ldlm_lock *lock) { struct sl_insert_point prev; - ENTRY; LASSERT(lock->l_req_mode == lock->l_granted_mode); search_granted_lock(&lock->l_resource->lr_granted, lock, &prev); ldlm_granted_list_add_lock(lock, &prev); - EXIT; } /** @@ -1122,7 +1086,6 @@ static void ldlm_grant_lock_with_skiplist(struct ldlm_lock *lock) void ldlm_grant_lock(struct ldlm_lock *lock, struct list_head *work_list) { struct ldlm_resource *res = lock->l_resource; - ENTRY; check_res_locked(res); @@ -1141,7 +1104,6 @@ void ldlm_grant_lock(struct ldlm_lock *lock, struct list_head *work_list) ldlm_add_ast_work_item(lock, NULL, work_list); ldlm_pool_add(&ldlm_res_to_ns(res)->ns_pool, lock); - EXIT; } /** @@ -1203,9 +1165,7 @@ static struct ldlm_lock *search_queue(struct list_head *queue, policy->l_inodebits.bits)) continue; - if (!unref && - (lock->l_destroyed || lock->l_flags & LDLM_FL_FAILED || - lock->l_failed)) + if (!unref && (lock->l_flags & LDLM_FL_GONE_MASK)) continue; if ((flags & LDLM_FL_LOCAL_ONLY) && @@ -1227,8 +1187,8 @@ static struct ldlm_lock *search_queue(struct list_head *queue, void ldlm_lock_fail_match_locked(struct ldlm_lock *lock) { - if (!lock->l_failed) { - lock->l_failed = 1; + if ((lock->l_flags & LDLM_FL_FAIL_NOTIFIED) == 0) { + lock->l_flags |= LDLM_FL_FAIL_NOTIFIED; wake_up_all(&lock->l_waitq); } } @@ -1306,7 +1266,6 @@ ldlm_mode_t ldlm_lock_match(struct ldlm_namespace *ns, __u64 flags, struct ldlm_resource *res; struct ldlm_lock *lock, *old_lock = NULL; int rc = 0; - ENTRY; if (ns == NULL) { old_lock = ldlm_handle2lock(lockh); @@ -1321,7 +1280,7 @@ ldlm_mode_t ldlm_lock_match(struct ldlm_namespace *ns, __u64 flags, res = ldlm_resource_get(ns, NULL, res_id, type, 0); if (res == NULL) { LASSERT(old_lock == NULL); - RETURN(0); + return 0; } LDLM_RESOURCE_ADDREF(res); @@ -1342,7 +1301,6 @@ ldlm_mode_t ldlm_lock_match(struct ldlm_namespace *ns, __u64 flags, if (lock != NULL) GOTO(out, rc = 1); - EXIT; out: unlock_res(res); LDLM_RESOURCE_DELREF(res); @@ -1352,6 +1310,8 @@ ldlm_mode_t ldlm_lock_match(struct ldlm_namespace *ns, __u64 flags, ldlm_lock2handle(lock, lockh); if ((flags & LDLM_FL_LVB_READY) && (!(lock->l_flags & LDLM_FL_LVB_READY))) { + __u64 wait_flags = LDLM_FL_LVB_READY | + LDLM_FL_DESTROYED | LDLM_FL_FAIL_NOTIFIED; struct l_wait_info lwi; if (lock->l_completion_ast) { int err = lock->l_completion_ast(lock, @@ -1373,8 +1333,7 @@ ldlm_mode_t ldlm_lock_match(struct ldlm_namespace *ns, __u64 flags, /* XXX FIXME see comment on CAN_MATCH in lustre_dlm.h */ l_wait_event(lock->l_waitq, - lock->l_flags & LDLM_FL_LVB_READY || - lock->l_destroyed || lock->l_failed, + lock->l_flags & wait_flags, &lwi); if (!(lock->l_flags & LDLM_FL_LVB_READY)) { if (flags & LDLM_FL_TEST_LOCK) @@ -1426,13 +1385,11 @@ ldlm_mode_t ldlm_revalidate_lock_handle(struct lustre_handle *lockh, { struct ldlm_lock *lock; ldlm_mode_t mode = 0; - ENTRY; lock = ldlm_handle2lock(lockh); if (lock != NULL) { lock_res_and_lock(lock); - if (lock->l_destroyed || lock->l_flags & LDLM_FL_FAILED || - lock->l_failed) + if (lock->l_flags & LDLM_FL_GONE_MASK) GOTO(out, mode); if (lock->l_flags & LDLM_FL_CBPENDING && @@ -1445,8 +1402,6 @@ ldlm_mode_t ldlm_revalidate_lock_handle(struct lustre_handle *lockh, ldlm_lock_addref_internal_nolock(lock, mode); } - EXIT; - out: if (lock != NULL) { unlock_res_and_lock(lock); @@ -1461,7 +1416,6 @@ int ldlm_fill_lvb(struct ldlm_lock *lock, struct req_capsule *pill, enum req_location loc, void *data, int size) { void *lvb; - ENTRY; LASSERT(data != NULL); LASSERT(size >= 0); @@ -1479,7 +1433,7 @@ int ldlm_fill_lvb(struct ldlm_lock *lock, struct req_capsule *pill, lustre_swab_ost_lvb); if (unlikely(lvb == NULL)) { LDLM_ERROR(lock, "no LVB"); - RETURN(-EPROTO); + return -EPROTO; } memcpy(data, lvb, size); @@ -1496,7 +1450,7 @@ int ldlm_fill_lvb(struct ldlm_lock *lock, struct req_capsule *pill, lustre_swab_ost_lvb_v1); if (unlikely(lvb == NULL)) { LDLM_ERROR(lock, "no LVB"); - RETURN(-EPROTO); + return -EPROTO; } memcpy(data, lvb, size); @@ -1506,7 +1460,7 @@ int ldlm_fill_lvb(struct ldlm_lock *lock, struct req_capsule *pill, } else { LDLM_ERROR(lock, "Replied unexpected ost LVB size %d", size); - RETURN(-EINVAL); + return -EINVAL; } break; case LVB_T_LQUOTA: @@ -1521,14 +1475,14 @@ int ldlm_fill_lvb(struct ldlm_lock *lock, struct req_capsule *pill, lustre_swab_lquota_lvb); if (unlikely(lvb == NULL)) { LDLM_ERROR(lock, "no LVB"); - RETURN(-EPROTO); + return -EPROTO; } memcpy(data, lvb, size); } else { LDLM_ERROR(lock, "Replied unexpected lquota LVB size %d", size); - RETURN(-EINVAL); + return -EINVAL; } break; case LVB_T_LAYOUT: @@ -1541,18 +1495,18 @@ int ldlm_fill_lvb(struct ldlm_lock *lock, struct req_capsule *pill, lvb = req_capsule_server_get(pill, &RMF_DLM_LVB); if (unlikely(lvb == NULL)) { LDLM_ERROR(lock, "no LVB"); - RETURN(-EPROTO); + return -EPROTO; } memcpy(data, lvb, size); break; default: LDLM_ERROR(lock, "Unknown LVB type: %d\n", lock->l_lvb_type); - libcfs_debug_dumpstack(NULL); - RETURN(-EINVAL); + dump_stack(); + return -EINVAL; } - RETURN(0); + return 0; } /** @@ -1569,26 +1523,25 @@ struct ldlm_lock *ldlm_lock_create(struct ldlm_namespace *ns, { struct ldlm_lock *lock; struct ldlm_resource *res; - ENTRY; res = ldlm_resource_get(ns, NULL, res_id, type, 1); if (res == NULL) - RETURN(NULL); + return NULL; lock = ldlm_lock_new(res); if (lock == NULL) - RETURN(NULL); + return NULL; lock->l_req_mode = mode; lock->l_ast_data = data; lock->l_pid = current_pid(); - lock->l_ns_srv = !!ns_is_server(ns); + if (ns_is_server(ns)) + lock->l_flags |= LDLM_FL_NS_SRV; if (cbs) { lock->l_blocking_ast = cbs->lcs_blocking; lock->l_completion_ast = cbs->lcs_completion; lock->l_glimpse_ast = cbs->lcs_glimpse; - lock->l_weigh_ast = cbs->lcs_weigh; } lock->l_tree_node = NULL; @@ -1609,7 +1562,7 @@ struct ldlm_lock *ldlm_lock_create(struct ldlm_namespace *ns, if (OBD_FAIL_CHECK(OBD_FAIL_LDLM_NEW_LOCK)) GOTO(out, 0); - RETURN(lock); + return lock; out: ldlm_lock_destroy(lock); @@ -1636,7 +1589,6 @@ ldlm_error_t ldlm_lock_enqueue(struct ldlm_namespace *ns, int local = ns_is_client(ldlm_res_to_ns(res)); ldlm_error_t rc = ELDLM_OK; struct ldlm_interval *node = NULL; - ENTRY; lock->l_last_activity = cfs_time_current_sec(); /* policies are not executed on the client or during replay */ @@ -1654,11 +1606,11 @@ ldlm_error_t ldlm_lock_enqueue(struct ldlm_namespace *ns, LDLM_LOCK_RELEASE(lock); } *flags |= LDLM_FL_LOCK_CHANGED; - RETURN(0); + return 0; } else if (rc != ELDLM_OK || (rc == ELDLM_OK && (*flags & LDLM_FL_INTENT_ONLY))) { ldlm_lock_destroy(lock); - RETURN(rc); + return rc; } } @@ -1693,7 +1645,7 @@ ldlm_error_t ldlm_lock_enqueue(struct ldlm_namespace *ns, /* Some flags from the enqueue want to make it into the AST, via the * lock's l_flags. */ - lock->l_flags |= *flags & LDLM_AST_DISCARD_DATA; + lock->l_flags |= *flags & LDLM_FL_AST_DISCARD_DATA; /* This distinction between local lock trees is very important; a client * namespace only has information about locks taken by that client, and @@ -1738,10 +1690,9 @@ ldlm_work_bl_ast_lock(struct ptlrpc_request_set *rqset, void *opaq) struct ldlm_lock_desc d; int rc; struct ldlm_lock *lock; - ENTRY; if (list_empty(arg->list)) - RETURN(-ENOENT); + return -ENOENT; lock = list_entry(arg->list->next, struct ldlm_lock, l_bl_ast); @@ -1762,7 +1713,7 @@ ldlm_work_bl_ast_lock(struct ptlrpc_request_set *rqset, void *opaq) lock->l_blocking_lock = NULL; LDLM_LOCK_RELEASE(lock); - RETURN(rc); + return rc; } /** @@ -1775,10 +1726,9 @@ ldlm_work_cp_ast_lock(struct ptlrpc_request_set *rqset, void *opaq) int rc = 0; struct ldlm_lock *lock; ldlm_completion_callback completion_callback; - ENTRY; if (list_empty(arg->list)) - RETURN(-ENOENT); + return -ENOENT; lock = list_entry(arg->list->next, struct ldlm_lock, l_cp_ast); @@ -1807,7 +1757,7 @@ ldlm_work_cp_ast_lock(struct ptlrpc_request_set *rqset, void *opaq) rc = completion_callback(lock, 0, (void *)arg); LDLM_LOCK_RELEASE(lock); - RETURN(rc); + return rc; } /** @@ -1820,10 +1770,9 @@ ldlm_work_revoke_ast_lock(struct ptlrpc_request_set *rqset, void *opaq) struct ldlm_lock_desc desc; int rc; struct ldlm_lock *lock; - ENTRY; if (list_empty(arg->list)) - RETURN(-ENOENT); + return -ENOENT; lock = list_entry(arg->list->next, struct ldlm_lock, l_rk_ast); list_del_init(&lock->l_rk_ast); @@ -1836,7 +1785,7 @@ ldlm_work_revoke_ast_lock(struct ptlrpc_request_set *rqset, void *opaq) rc = lock->l_blocking_ast(lock, &desc, (void*)arg, LDLM_CB_BLOCKING); LDLM_LOCK_RELEASE(lock); - RETURN(rc); + return rc; } /** @@ -1848,10 +1797,9 @@ int ldlm_work_gl_ast_lock(struct ptlrpc_request_set *rqset, void *opaq) struct ldlm_glimpse_work *gl_work; struct ldlm_lock *lock; int rc = 0; - ENTRY; if (list_empty(arg->list)) - RETURN(-ENOENT); + return -ENOENT; gl_work = list_entry(arg->list->next, struct ldlm_glimpse_work, gl_list); @@ -1871,7 +1819,7 @@ int ldlm_work_gl_ast_lock(struct ptlrpc_request_set *rqset, void *opaq) if ((gl_work->gl_flags & LDLM_GL_WORK_NOFREE) == 0) OBD_FREE_PTR(gl_work); - RETURN(rc); + return rc; } /** @@ -1888,11 +1836,11 @@ int ldlm_run_ast_work(struct ldlm_namespace *ns, struct list_head *rpc_list, int rc; if (list_empty(rpc_list)) - RETURN(0); + return 0; OBD_ALLOC_PTR(arg); if (arg == NULL) - RETURN(-ENOMEM); + return -ENOMEM; atomic_set(&arg->restart, 0); arg->list = rpc_list; @@ -1960,13 +1908,10 @@ static int ldlm_reprocess_res(cfs_hash_t *hs, cfs_hash_bd_t *bd, */ void ldlm_reprocess_all_ns(struct ldlm_namespace *ns) { - ENTRY; - if (ns != NULL) { cfs_hash_for_each_nolock(ns->ns_rs_hash, ldlm_reprocess_res, NULL); } - EXIT; } EXPORT_SYMBOL(ldlm_reprocess_all_ns); @@ -1982,13 +1927,11 @@ void ldlm_reprocess_all(struct ldlm_resource *res) { LIST_HEAD(rpc_list); - ENTRY; if (!ns_is_client(ldlm_res_to_ns(res))) { CERROR("This is client-side-only module, cannot handle " "LDLM_NAMESPACE_SERVER resource type lock.\n"); LBUG(); } - EXIT; } /** @@ -2032,7 +1975,6 @@ void ldlm_lock_cancel(struct ldlm_lock *lock) { struct ldlm_resource *res; struct ldlm_namespace *ns; - ENTRY; lock_res_and_lock(lock); @@ -2046,15 +1988,15 @@ void ldlm_lock_cancel(struct ldlm_lock *lock) LBUG(); } - if (lock->l_waited) + if (lock->l_flags & LDLM_FL_WAITED) ldlm_del_waiting_lock(lock); /* Releases cancel callback. */ ldlm_cancel_callback(lock); /* Yes, second time, just in case it was added again while we were - running with no res lock in ldlm_cancel_callback */ - if (lock->l_waited) + * running with no res lock in ldlm_cancel_callback */ + if (lock->l_flags & LDLM_FL_WAITED) ldlm_del_waiting_lock(lock); ldlm_resource_unlink_lock(lock); @@ -2067,8 +2009,6 @@ void ldlm_lock_cancel(struct ldlm_lock *lock) * if not to zero out lock->l_granted_mode */ lock->l_granted_mode = LCK_MINMODE; unlock_res_and_lock(lock); - - EXIT; } EXPORT_SYMBOL(ldlm_lock_cancel); @@ -2079,7 +2019,6 @@ int ldlm_lock_set_data(struct lustre_handle *lockh, void *data) { struct ldlm_lock *lock = ldlm_handle2lock(lockh); int rc = -EINVAL; - ENTRY; if (lock) { if (lock->l_ast_data == NULL) @@ -2088,7 +2027,7 @@ int ldlm_lock_set_data(struct lustre_handle *lockh, void *data) rc = 0; LDLM_LOCK_PUT(lock); } - RETURN(rc); + return rc; } EXPORT_SYMBOL(ldlm_lock_set_data); @@ -2160,8 +2099,6 @@ void ldlm_cancel_locks_for_export(struct obd_export *exp) */ void ldlm_lock_downgrade(struct ldlm_lock *lock, int new_mode) { - ENTRY; - LASSERT(lock->l_granted_mode & (LCK_PW | LCK_EX)); LASSERT(new_mode == LCK_COS); @@ -2177,8 +2114,6 @@ void ldlm_lock_downgrade(struct ldlm_lock *lock, int new_mode) ldlm_grant_lock(lock, NULL); unlock_res_and_lock(lock); ldlm_reprocess_all(lock->l_resource); - - EXIT; } EXPORT_SYMBOL(ldlm_lock_downgrade); @@ -2197,19 +2132,19 @@ struct ldlm_resource *ldlm_lock_convert(struct ldlm_lock *lock, int new_mode, struct ldlm_namespace *ns; int granted = 0; struct ldlm_interval *node; - ENTRY; /* Just return if mode is unchanged. */ if (new_mode == lock->l_granted_mode) { *flags |= LDLM_FL_BLOCK_GRANTED; - RETURN(lock->l_resource); + return lock->l_resource; } /* I can't check the type of lock here because the bitlock of lock * is not held here, so do the allocation blindly. -jay */ OBD_SLAB_ALLOC_PTR_GFP(node, ldlm_interval_slab, __GFP_IO); - if (node == NULL) /* Actually, this causes EDEADLOCK to be returned */ - RETURN(NULL); + if (node == NULL) + /* Actually, this causes EDEADLOCK to be returned */ + return NULL; LASSERTF((new_mode == LCK_PW && lock->l_granted_mode == LCK_PR), "new_mode %u, granted %u\n", new_mode, lock->l_granted_mode); @@ -2268,7 +2203,7 @@ struct ldlm_resource *ldlm_lock_convert(struct ldlm_lock *lock, int new_mode, ldlm_run_ast_work(ns, &rpc_list, LDLM_WORK_CP_AST); if (node) OBD_SLAB_FREE(node, ldlm_interval_slab, sizeof(*node)); - RETURN(res); + return res; } EXPORT_SYMBOL(ldlm_lock_convert); @@ -2337,91 +2272,90 @@ void _ldlm_lock_debug(struct ldlm_lock *lock, switch (resource->lr_type) { case LDLM_EXTENT: libcfs_debug_vmsg2(msgdata, fmt, args, - " ns: %s lock: %p/"LPX64" lrc: %d/%d,%d mode: %s/%s " - "res: "LPU64"/"LPU64" rrc: %d type: %s ["LPU64"->"LPU64 - "] (req "LPU64"->"LPU64") flags: "LPX64" nid: %s remote:" - " "LPX64" expref: %d pid: %u timeout: %lu lvb_type: %d\n", - ldlm_lock_to_ns_name(lock), lock, - lock->l_handle.h_cookie, atomic_read(&lock->l_refc), - lock->l_readers, lock->l_writers, - ldlm_lockname[lock->l_granted_mode], - ldlm_lockname[lock->l_req_mode], - resource->lr_name.name[0], - resource->lr_name.name[1], - atomic_read(&resource->lr_refcount), - ldlm_typename[resource->lr_type], - lock->l_policy_data.l_extent.start, - lock->l_policy_data.l_extent.end, - lock->l_req_extent.start, lock->l_req_extent.end, - lock->l_flags, nid, lock->l_remote_handle.cookie, - exp ? atomic_read(&exp->exp_refcount) : -99, - lock->l_pid, lock->l_callback_timeout, lock->l_lvb_type); + " ns: %s lock: %p/"LPX64" lrc: %d/%d,%d mode: %s/%s " + "res: "DLDLMRES" rrc: %d type: %s ["LPU64"->"LPU64"] " + "(req "LPU64"->"LPU64") flags: "LPX64" nid: %s remote: " + LPX64" expref: %d pid: %u timeout: %lu lvb_type: %d\n", + ldlm_lock_to_ns_name(lock), lock, + lock->l_handle.h_cookie, atomic_read(&lock->l_refc), + lock->l_readers, lock->l_writers, + ldlm_lockname[lock->l_granted_mode], + ldlm_lockname[lock->l_req_mode], + PLDLMRES(resource), + atomic_read(&resource->lr_refcount), + ldlm_typename[resource->lr_type], + lock->l_policy_data.l_extent.start, + lock->l_policy_data.l_extent.end, + lock->l_req_extent.start, lock->l_req_extent.end, + lock->l_flags, nid, lock->l_remote_handle.cookie, + exp ? atomic_read(&exp->exp_refcount) : -99, + lock->l_pid, lock->l_callback_timeout, + lock->l_lvb_type); break; case LDLM_FLOCK: libcfs_debug_vmsg2(msgdata, fmt, args, - " ns: %s lock: %p/"LPX64" lrc: %d/%d,%d mode: %s/%s " - "res: "LPU64"/"LPU64" rrc: %d type: %s pid: %d " - "["LPU64"->"LPU64"] flags: "LPX64" nid: %s remote: "LPX64 - " expref: %d pid: %u timeout: %lu\n", - ldlm_lock_to_ns_name(lock), lock, - lock->l_handle.h_cookie, atomic_read(&lock->l_refc), - lock->l_readers, lock->l_writers, - ldlm_lockname[lock->l_granted_mode], - ldlm_lockname[lock->l_req_mode], - resource->lr_name.name[0], - resource->lr_name.name[1], - atomic_read(&resource->lr_refcount), - ldlm_typename[resource->lr_type], - lock->l_policy_data.l_flock.pid, - lock->l_policy_data.l_flock.start, - lock->l_policy_data.l_flock.end, - lock->l_flags, nid, lock->l_remote_handle.cookie, - exp ? atomic_read(&exp->exp_refcount) : -99, - lock->l_pid, lock->l_callback_timeout); + " ns: %s lock: %p/"LPX64" lrc: %d/%d,%d mode: %s/%s " + "res: "DLDLMRES" rrc: %d type: %s pid: %d " + "["LPU64"->"LPU64"] flags: "LPX64" nid: %s " + "remote: "LPX64" expref: %d pid: %u timeout: %lu\n", + ldlm_lock_to_ns_name(lock), lock, + lock->l_handle.h_cookie, atomic_read(&lock->l_refc), + lock->l_readers, lock->l_writers, + ldlm_lockname[lock->l_granted_mode], + ldlm_lockname[lock->l_req_mode], + PLDLMRES(resource), + atomic_read(&resource->lr_refcount), + ldlm_typename[resource->lr_type], + lock->l_policy_data.l_flock.pid, + lock->l_policy_data.l_flock.start, + lock->l_policy_data.l_flock.end, + lock->l_flags, nid, lock->l_remote_handle.cookie, + exp ? atomic_read(&exp->exp_refcount) : -99, + lock->l_pid, lock->l_callback_timeout); break; case LDLM_IBITS: libcfs_debug_vmsg2(msgdata, fmt, args, - " ns: %s lock: %p/"LPX64" lrc: %d/%d,%d mode: %s/%s " - "res: "LPU64"/"LPU64" bits "LPX64" rrc: %d type: %s " - "flags: "LPX64" nid: %s remote: "LPX64" expref: %d " - "pid: %u timeout: %lu lvb_type: %d\n", - ldlm_lock_to_ns_name(lock), - lock, lock->l_handle.h_cookie, - atomic_read (&lock->l_refc), - lock->l_readers, lock->l_writers, - ldlm_lockname[lock->l_granted_mode], - ldlm_lockname[lock->l_req_mode], - resource->lr_name.name[0], - resource->lr_name.name[1], - lock->l_policy_data.l_inodebits.bits, - atomic_read(&resource->lr_refcount), - ldlm_typename[resource->lr_type], - lock->l_flags, nid, lock->l_remote_handle.cookie, - exp ? atomic_read(&exp->exp_refcount) : -99, - lock->l_pid, lock->l_callback_timeout, lock->l_lvb_type); + " ns: %s lock: %p/"LPX64" lrc: %d/%d,%d mode: %s/%s " + "res: "DLDLMRES" bits "LPX64" rrc: %d type: %s " + "flags: "LPX64" nid: %s remote: "LPX64" expref: %d " + "pid: %u timeout: %lu lvb_type: %d\n", + ldlm_lock_to_ns_name(lock), + lock, lock->l_handle.h_cookie, + atomic_read(&lock->l_refc), + lock->l_readers, lock->l_writers, + ldlm_lockname[lock->l_granted_mode], + ldlm_lockname[lock->l_req_mode], + PLDLMRES(resource), + lock->l_policy_data.l_inodebits.bits, + atomic_read(&resource->lr_refcount), + ldlm_typename[resource->lr_type], + lock->l_flags, nid, lock->l_remote_handle.cookie, + exp ? atomic_read(&exp->exp_refcount) : -99, + lock->l_pid, lock->l_callback_timeout, + lock->l_lvb_type); break; default: libcfs_debug_vmsg2(msgdata, fmt, args, - " ns: %s lock: %p/"LPX64" lrc: %d/%d,%d mode: %s/%s " - "res: "LPU64"/"LPU64" rrc: %d type: %s flags: "LPX64" " - "nid: %s remote: "LPX64" expref: %d pid: %u timeout: %lu" - "lvb_type: %d\n", - ldlm_lock_to_ns_name(lock), - lock, lock->l_handle.h_cookie, - atomic_read (&lock->l_refc), - lock->l_readers, lock->l_writers, - ldlm_lockname[lock->l_granted_mode], - ldlm_lockname[lock->l_req_mode], - resource->lr_name.name[0], - resource->lr_name.name[1], - atomic_read(&resource->lr_refcount), - ldlm_typename[resource->lr_type], - lock->l_flags, nid, lock->l_remote_handle.cookie, - exp ? atomic_read(&exp->exp_refcount) : -99, - lock->l_pid, lock->l_callback_timeout, lock->l_lvb_type); + " ns: %s lock: %p/"LPX64" lrc: %d/%d,%d mode: %s/%s " + "res: "DLDLMRES" rrc: %d type: %s flags: "LPX64" " + "nid: %s remote: "LPX64" expref: %d pid: %u " + "timeout: %lu lvb_type: %d\n", + ldlm_lock_to_ns_name(lock), + lock, lock->l_handle.h_cookie, + atomic_read(&lock->l_refc), + lock->l_readers, lock->l_writers, + ldlm_lockname[lock->l_granted_mode], + ldlm_lockname[lock->l_req_mode], + PLDLMRES(resource), + atomic_read(&resource->lr_refcount), + ldlm_typename[resource->lr_type], + lock->l_flags, nid, lock->l_remote_handle.cookie, + exp ? atomic_read(&exp->exp_refcount) : -99, + lock->l_pid, lock->l_callback_timeout, + lock->l_lvb_type); break; } va_end(args); diff --git a/drivers/staging/lustre/lustre/ldlm/ldlm_lockd.c b/drivers/staging/lustre/lustre/ldlm/ldlm_lockd.c index 324d5e4286dc..a100a0b96381 100644 --- a/drivers/staging/lustre/lustre/ldlm/ldlm_lockd.c +++ b/drivers/staging/lustre/lustre/ldlm/ldlm_lockd.c @@ -127,12 +127,12 @@ struct ldlm_bl_work_item { int ldlm_del_waiting_lock(struct ldlm_lock *lock) { - RETURN(0); + return 0; } int ldlm_refresh_waiting_lock(struct ldlm_lock *lock, int timeout) { - RETURN(0); + return 0; } @@ -146,7 +146,6 @@ void ldlm_handle_bl_callback(struct ldlm_namespace *ns, struct ldlm_lock_desc *ld, struct ldlm_lock *lock) { int do_ast; - ENTRY; LDLM_DEBUG(lock, "client blocking AST callback handler"); @@ -172,7 +171,6 @@ void ldlm_handle_bl_callback(struct ldlm_namespace *ns, LDLM_DEBUG(lock, "client blocking callback handler END"); LDLM_LOCK_RELEASE(lock); - EXIT; } /** @@ -188,7 +186,6 @@ static void ldlm_handle_cp_callback(struct ptlrpc_request *req, int lvb_len; LIST_HEAD(ast_list); int rc = 0; - ENTRY; LDLM_DEBUG(lock, "client completion callback handler START"); @@ -198,7 +195,7 @@ static void ldlm_handle_cp_callback(struct ptlrpc_request *req, schedule_timeout_and_set_state( TASK_INTERRUPTIBLE, to); if (lock->l_granted_mode == lock->l_req_mode || - lock->l_destroyed) + lock->l_flags & LDLM_FL_DESTROYED) break; } } @@ -238,7 +235,7 @@ static void ldlm_handle_cp_callback(struct ptlrpc_request *req, } lock_res_and_lock(lock); - if (lock->l_destroyed || + if ((lock->l_flags & LDLM_FL_DESTROYED) || lock->l_granted_mode == lock->l_req_mode) { /* bug 11300: the lock has already been granted */ unlock_res_and_lock(lock); @@ -332,7 +329,6 @@ static void ldlm_handle_gl_callback(struct ptlrpc_request *req, struct ldlm_lock *lock) { int rc = -ENOSYS; - ENTRY; LDLM_DEBUG(lock, "client glimpse AST callback handler"); @@ -356,12 +352,10 @@ static void ldlm_handle_gl_callback(struct ptlrpc_request *req, if (ldlm_bl_to_thread_lock(ns, NULL, lock)) ldlm_handle_bl_callback(ns, NULL, lock); - EXIT; return; } unlock_res_and_lock(lock); LDLM_LOCK_RELEASE(lock); - EXIT; } static int ldlm_callback_reply(struct ptlrpc_request *req, int rc) @@ -382,7 +376,6 @@ static int __ldlm_bl_to_thread(struct ldlm_bl_work_item *blwi, ldlm_cancel_flags_t cancel_flags) { struct ldlm_bl_pool *blp = ldlm_state->ldlm_bl_pool; - ENTRY; spin_lock(&blp->blp_lock); if (blwi->blwi_lock && @@ -402,7 +395,7 @@ static int __ldlm_bl_to_thread(struct ldlm_bl_work_item *blwi, if (!(cancel_flags & LCF_ASYNC)) wait_for_completion(&blwi->blwi_comp); - RETURN(0); + return 0; } static inline void init_blwi(struct ldlm_bl_work_item *blwi, @@ -446,20 +439,18 @@ static int ldlm_bl_to_thread(struct ldlm_namespace *ns, struct list_head *cancels, int count, ldlm_cancel_flags_t cancel_flags) { - ENTRY; - if (cancels && count == 0) - RETURN(0); + return 0; if (cancel_flags & LCF_ASYNC) { struct ldlm_bl_work_item *blwi; OBD_ALLOC(blwi, sizeof(*blwi)); if (blwi == NULL) - RETURN(-ENOMEM); + return -ENOMEM; init_blwi(blwi, ns, ld, cancels, count, lock, cancel_flags); - RETURN(__ldlm_bl_to_thread(blwi, cancel_flags)); + return __ldlm_bl_to_thread(blwi, cancel_flags); } else { /* if it is synchronous call do minimum mem alloc, as it could * be triggered from kernel shrinker @@ -468,7 +459,7 @@ static int ldlm_bl_to_thread(struct ldlm_namespace *ns, memset(&blwi, 0, sizeof(blwi)); init_blwi(&blwi, ns, ld, cancels, count, lock, cancel_flags); - RETURN(__ldlm_bl_to_thread(&blwi, cancel_flags)); + return __ldlm_bl_to_thread(&blwi, cancel_flags); } } @@ -494,7 +485,6 @@ static int ldlm_handle_setinfo(struct ptlrpc_request *req) void *val; int keylen, vallen; int rc = -ENOSYS; - ENTRY; DEBUG_REQ(D_HSM, req, "%s: handle setinfo\n", obd->obd_name); @@ -503,14 +493,14 @@ static int ldlm_handle_setinfo(struct ptlrpc_request *req) key = req_capsule_client_get(&req->rq_pill, &RMF_SETINFO_KEY); if (key == NULL) { DEBUG_REQ(D_IOCTL, req, "no set_info key"); - RETURN(-EFAULT); + return -EFAULT; } keylen = req_capsule_get_size(&req->rq_pill, &RMF_SETINFO_KEY, RCL_CLIENT); val = req_capsule_client_get(&req->rq_pill, &RMF_SETINFO_VAL); if (val == NULL) { DEBUG_REQ(D_IOCTL, req, "no set_info val"); - RETURN(-EFAULT); + return -EFAULT; } vallen = req_capsule_get_size(&req->rq_pill, &RMF_SETINFO_VAL, RCL_CLIENT); @@ -552,9 +542,11 @@ static int ldlm_handle_qc_callback(struct ptlrpc_request *req) oqctl = req_capsule_client_get(&req->rq_pill, &RMF_OBD_QUOTACTL); if (oqctl == NULL) { CERROR("Can't unpack obd_quotactl\n"); - RETURN(-EPROTO); + return -EPROTO; } + oqctl->qc_stat = ptlrpc_status_ntoh(oqctl->qc_stat); + cli->cl_qchk_stat = oqctl->qc_stat; return 0; } @@ -566,7 +558,6 @@ static int ldlm_callback_handler(struct ptlrpc_request *req) struct ldlm_request *dlm_req; struct ldlm_lock *lock; int rc; - ENTRY; /* Requests arrive in sender's byte order. The ptlrpc service * handler has already checked and, if necessary, byte-swapped the @@ -575,7 +566,7 @@ static int ldlm_callback_handler(struct ptlrpc_request *req) /* do nothing for sec context finalize */ if (lustre_msg_get_opc(req->rq_reqmsg) == SEC_CTX_FINI) - RETURN(0); + return 0; req_capsule_init(&req->rq_pill, req, RCL_SERVER); @@ -583,7 +574,7 @@ static int ldlm_callback_handler(struct ptlrpc_request *req) rc = ldlm_callback_reply(req, -ENOTCONN); ldlm_callback_errmsg(req, "Operate on unconnected server", rc, NULL); - RETURN(0); + return 0; } LASSERT(req->rq_export != NULL); @@ -592,71 +583,71 @@ static int ldlm_callback_handler(struct ptlrpc_request *req) switch (lustre_msg_get_opc(req->rq_reqmsg)) { case LDLM_BL_CALLBACK: if (OBD_FAIL_CHECK(OBD_FAIL_LDLM_BL_CALLBACK_NET)) - RETURN(0); + return 0; break; case LDLM_CP_CALLBACK: if (OBD_FAIL_CHECK(OBD_FAIL_LDLM_CP_CALLBACK_NET)) - RETURN(0); + return 0; break; case LDLM_GL_CALLBACK: if (OBD_FAIL_CHECK(OBD_FAIL_LDLM_GL_CALLBACK_NET)) - RETURN(0); + return 0; break; case LDLM_SET_INFO: rc = ldlm_handle_setinfo(req); ldlm_callback_reply(req, rc); - RETURN(0); + return 0; case OBD_LOG_CANCEL: /* remove this eventually - for 1.4.0 compat */ CERROR("shouldn't be handling OBD_LOG_CANCEL on DLM thread\n"); req_capsule_set(&req->rq_pill, &RQF_LOG_CANCEL); if (OBD_FAIL_CHECK(OBD_FAIL_OBD_LOG_CANCEL_NET)) - RETURN(0); + return 0; rc = llog_origin_handle_cancel(req); if (OBD_FAIL_CHECK(OBD_FAIL_OBD_LOG_CANCEL_REP)) - RETURN(0); + return 0; ldlm_callback_reply(req, rc); - RETURN(0); + return 0; case LLOG_ORIGIN_HANDLE_CREATE: req_capsule_set(&req->rq_pill, &RQF_LLOG_ORIGIN_HANDLE_CREATE); if (OBD_FAIL_CHECK(OBD_FAIL_OBD_LOGD_NET)) - RETURN(0); + return 0; rc = llog_origin_handle_open(req); ldlm_callback_reply(req, rc); - RETURN(0); + return 0; case LLOG_ORIGIN_HANDLE_NEXT_BLOCK: req_capsule_set(&req->rq_pill, &RQF_LLOG_ORIGIN_HANDLE_NEXT_BLOCK); if (OBD_FAIL_CHECK(OBD_FAIL_OBD_LOGD_NET)) - RETURN(0); + return 0; rc = llog_origin_handle_next_block(req); ldlm_callback_reply(req, rc); - RETURN(0); + return 0; case LLOG_ORIGIN_HANDLE_READ_HEADER: req_capsule_set(&req->rq_pill, &RQF_LLOG_ORIGIN_HANDLE_READ_HEADER); if (OBD_FAIL_CHECK(OBD_FAIL_OBD_LOGD_NET)) - RETURN(0); + return 0; rc = llog_origin_handle_read_header(req); ldlm_callback_reply(req, rc); - RETURN(0); + return 0; case LLOG_ORIGIN_HANDLE_CLOSE: if (OBD_FAIL_CHECK(OBD_FAIL_OBD_LOGD_NET)) - RETURN(0); + return 0; rc = llog_origin_handle_close(req); ldlm_callback_reply(req, rc); - RETURN(0); + return 0; case OBD_QC_CALLBACK: req_capsule_set(&req->rq_pill, &RQF_QC_CALLBACK); if (OBD_FAIL_CHECK(OBD_FAIL_OBD_QC_CALLBACK_NET)) - RETURN(0); + return 0; rc = ldlm_handle_qc_callback(req); ldlm_callback_reply(req, rc); - RETURN(0); + return 0; default: CERROR("unknown opcode %u\n", lustre_msg_get_opc(req->rq_reqmsg)); ldlm_callback_reply(req, -EPROTO); - RETURN(0); + return 0; } ns = req->rq_export->exp_obd->obd_namespace; @@ -669,7 +660,7 @@ static int ldlm_callback_handler(struct ptlrpc_request *req) rc = ldlm_callback_reply(req, -EPROTO); ldlm_callback_errmsg(req, "Operate without parameter", rc, NULL); - RETURN(0); + return 0; } /* Force a known safe race, send a cancel to the server for a lock @@ -688,7 +679,7 @@ static int ldlm_callback_handler(struct ptlrpc_request *req) rc = ldlm_callback_reply(req, -EINVAL); ldlm_callback_errmsg(req, "Operate with invalid parameter", rc, &dlm_req->lock_handle[0]); - RETURN(0); + return 0; } if ((lock->l_flags & LDLM_FL_FAIL_LOC) && @@ -715,7 +706,7 @@ static int ldlm_callback_handler(struct ptlrpc_request *req) rc = ldlm_callback_reply(req, -EINVAL); ldlm_callback_errmsg(req, "Operate on stale lock", rc, &dlm_req->lock_handle[0]); - RETURN(0); + return 0; } /* BL_AST locks are not needed in LRU. * Let ldlm_cancel_lru() be fast. */ @@ -761,7 +752,7 @@ static int ldlm_callback_handler(struct ptlrpc_request *req) LBUG(); /* checked above */ } - RETURN(0); + return 0; } @@ -805,13 +796,13 @@ static int ldlm_bl_thread_main(void *arg); static int ldlm_bl_thread_start(struct ldlm_bl_pool *blp) { struct ldlm_bl_thread_data bltd = { .bltd_blp = blp }; - task_t *task; + struct task_struct *task; init_completion(&bltd.bltd_comp); bltd.bltd_num = atomic_read(&blp->blp_num_threads); - snprintf(bltd.bltd_name, sizeof(bltd.bltd_name) - 1, + snprintf(bltd.bltd_name, sizeof(bltd.bltd_name), "ldlm_bl_%02d", bltd.bltd_num); - task = kthread_run(ldlm_bl_thread_main, &bltd, bltd.bltd_name); + task = kthread_run(ldlm_bl_thread_main, &bltd, "%s", bltd.bltd_name); if (IS_ERR(task)) { CERROR("cannot start LDLM thread ldlm_bl_%02d: rc %ld\n", atomic_read(&blp->blp_num_threads), PTR_ERR(task)); @@ -832,7 +823,6 @@ static int ldlm_bl_thread_start(struct ldlm_bl_pool *blp) static int ldlm_bl_thread_main(void *arg) { struct ldlm_bl_pool *blp; - ENTRY; { struct ldlm_bl_thread_data *bltd = arg; @@ -904,7 +894,7 @@ static int ldlm_bl_thread_main(void *arg) atomic_dec(&blp->blp_busy_threads); atomic_dec(&blp->blp_num_threads); complete(&blp->blp_comp); - RETURN(0); + return 0; } @@ -914,7 +904,7 @@ static int ldlm_cleanup(void); int ldlm_get_ref(void) { int rc = 0; - ENTRY; + mutex_lock(&ldlm_ref_mutex); if (++ldlm_refcount == 1) { rc = ldlm_setup(); @@ -923,13 +913,12 @@ int ldlm_get_ref(void) } mutex_unlock(&ldlm_ref_mutex); - RETURN(rc); + return rc; } EXPORT_SYMBOL(ldlm_get_ref); void ldlm_put_ref(void) { - ENTRY; mutex_lock(&ldlm_ref_mutex); if (ldlm_refcount == 1) { int rc = ldlm_cleanup(); @@ -941,8 +930,6 @@ void ldlm_put_ref(void) ldlm_refcount--; } mutex_unlock(&ldlm_ref_mutex); - - EXIT; } EXPORT_SYMBOL(ldlm_put_ref); @@ -1016,8 +1003,6 @@ static cfs_hash_ops_t ldlm_export_lock_ops = { int ldlm_init_export(struct obd_export *exp) { - ENTRY; - exp->exp_lock_hash = cfs_hash_create(obd_uuid2str(&exp->exp_client_uuid), HASH_EXP_LOCK_CUR_BITS, @@ -1029,20 +1014,18 @@ int ldlm_init_export(struct obd_export *exp) CFS_HASH_NBLK_CHANGE); if (!exp->exp_lock_hash) - RETURN(-ENOMEM); + return -ENOMEM; - RETURN(0); + return 0; } EXPORT_SYMBOL(ldlm_init_export); void ldlm_destroy_export(struct obd_export *exp) { - ENTRY; cfs_hash_putref(exp->exp_lock_hash); exp->exp_lock_hash = NULL; ldlm_destroy_flock_export(exp); - EXIT; } EXPORT_SYMBOL(ldlm_destroy_export); @@ -1052,14 +1035,13 @@ static int ldlm_setup(void) struct ldlm_bl_pool *blp = NULL; int rc = 0; int i; - ENTRY; if (ldlm_state != NULL) - RETURN(-EALREADY); + return -EALREADY; OBD_ALLOC(ldlm_state, sizeof(*ldlm_state)); if (ldlm_state == NULL) - RETURN(-ENOMEM); + return -ENOMEM; #ifdef LPROCFS rc = ldlm_proc_setup(); @@ -1139,23 +1121,21 @@ static int ldlm_setup(void) CERROR("Failed to initialize LDLM pools: %d\n", rc); GOTO(out, rc); } - RETURN(0); + return 0; out: ldlm_cleanup(); - RETURN(rc); + return rc; } static int ldlm_cleanup(void) { - ENTRY; - if (!list_empty(ldlm_namespace_list(LDLM_NAMESPACE_SERVER)) || !list_empty(ldlm_namespace_list(LDLM_NAMESPACE_CLIENT))) { CERROR("ldlm still has namespaces; clean these up first.\n"); ldlm_dump_all_namespaces(LDLM_NAMESPACE_SERVER, D_DLMTRACE); ldlm_dump_all_namespaces(LDLM_NAMESPACE_CLIENT, D_DLMTRACE); - RETURN(-EBUSY); + return -EBUSY; } ldlm_pools_fini(); @@ -1188,7 +1168,7 @@ static int ldlm_cleanup(void) OBD_FREE(ldlm_state, sizeof(*ldlm_state)); ldlm_state = NULL; - RETURN(0); + return 0; } int ldlm_init(void) diff --git a/drivers/staging/lustre/lustre/ldlm/ldlm_pool.c b/drivers/staging/lustre/lustre/ldlm/ldlm_pool.c index b3b60288e5f5..0025ee6356da 100644 --- a/drivers/staging/lustre/lustre/ldlm/ldlm_pool.c +++ b/drivers/staging/lustre/lustre/ldlm/ldlm_pool.c @@ -142,7 +142,7 @@ */ #define LDLM_POOL_SLV_SHIFT (10) -extern proc_dir_entry_t *ldlm_ns_proc_dir; +extern struct proc_dir_entry *ldlm_ns_proc_dir; static inline __u64 dru(__u64 val, __u32 shift, int round_up) { @@ -335,17 +335,16 @@ static void ldlm_srv_pool_push_slv(struct ldlm_pool *pl) static int ldlm_srv_pool_recalc(struct ldlm_pool *pl) { time_t recalc_interval_sec; - ENTRY; recalc_interval_sec = cfs_time_current_sec() - pl->pl_recalc_time; if (recalc_interval_sec < pl->pl_recalc_period) - RETURN(0); + return 0; spin_lock(&pl->pl_lock); recalc_interval_sec = cfs_time_current_sec() - pl->pl_recalc_time; if (recalc_interval_sec < pl->pl_recalc_period) { spin_unlock(&pl->pl_lock); - RETURN(0); + return 0; } /* * Recalc SLV after last period. This should be done @@ -367,7 +366,7 @@ static int ldlm_srv_pool_recalc(struct ldlm_pool *pl) lprocfs_counter_add(pl->pl_stats, LDLM_POOL_TIMING_STAT, recalc_interval_sec); spin_unlock(&pl->pl_lock); - RETURN(0); + return 0; } /** @@ -394,7 +393,7 @@ static int ldlm_srv_pool_shrink(struct ldlm_pool *pl, * and can't cancel anything. Let's catch this race. */ if (atomic_read(&pl->pl_granted) == 0) - RETURN(0); + return 0; spin_lock(&pl->pl_lock); @@ -473,11 +472,10 @@ static void ldlm_cli_pool_pop_slv(struct ldlm_pool *pl) static int ldlm_cli_pool_recalc(struct ldlm_pool *pl) { time_t recalc_interval_sec; - ENTRY; recalc_interval_sec = cfs_time_current_sec() - pl->pl_recalc_time; if (recalc_interval_sec < pl->pl_recalc_period) - RETURN(0); + return 0; spin_lock(&pl->pl_lock); /* @@ -486,7 +484,7 @@ static int ldlm_cli_pool_recalc(struct ldlm_pool *pl) recalc_interval_sec = cfs_time_current_sec() - pl->pl_recalc_time; if (recalc_interval_sec < pl->pl_recalc_period) { spin_unlock(&pl->pl_lock); - RETURN(0); + return 0; } /* @@ -503,7 +501,7 @@ static int ldlm_cli_pool_recalc(struct ldlm_pool *pl) * Do not cancel locks in case lru resize is disabled for this ns. */ if (!ns_connect_lru_resize(ldlm_pl2ns(pl))) - RETURN(0); + return 0; /* * In the time of canceling locks on client we do not need to maintain @@ -511,8 +509,7 @@ static int ldlm_cli_pool_recalc(struct ldlm_pool *pl) * It may be called when SLV has changed much, this is why we do not * take into account pl->pl_recalc_time here. */ - RETURN(ldlm_cancel_lru(ldlm_pl2ns(pl), 0, LCF_ASYNC, - LDLM_CANCEL_LRUR)); + return ldlm_cancel_lru(ldlm_pl2ns(pl), 0, LCF_ASYNC, LDLM_CANCEL_LRUR); } /** @@ -524,7 +521,7 @@ static int ldlm_cli_pool_shrink(struct ldlm_pool *pl, int nr, unsigned int gfp_mask) { struct ldlm_namespace *ns; - int canceled = 0, unused; + int unused; ns = ldlm_pl2ns(pl); @@ -532,7 +529,7 @@ static int ldlm_cli_pool_shrink(struct ldlm_pool *pl, * Do not cancel locks in case lru resize is disabled for this ns. */ if (!ns_connect_lru_resize(ns)) - RETURN(0); + return 0; /* * Make sure that pool knows last SLV and Limit from obd. @@ -543,14 +540,10 @@ static int ldlm_cli_pool_shrink(struct ldlm_pool *pl, unused = ns->ns_nr_unused; spin_unlock(&ns->ns_lock); - if (nr) { - canceled = ldlm_cancel_lru(ns, nr, LCF_ASYNC, - LDLM_CANCEL_SHRINK); - } - /* - * Return the number of potentially reclaimable locks. - */ - return ((unused - canceled) / 100) * sysctl_vfs_cache_pressure; + if (nr == 0) + return (unused / 100) * sysctl_vfs_cache_pressure; + else + return ldlm_cancel_lru(ns, nr, LCF_ASYNC, LDLM_CANCEL_SHRINK); } struct ldlm_pool_ops ldlm_srv_pool_ops = { @@ -578,7 +571,6 @@ int ldlm_pool_recalc(struct ldlm_pool *pl) goto recalc; spin_lock(&pl->pl_lock); - recalc_interval_sec = cfs_time_current_sec() - pl->pl_recalc_time; if (recalc_interval_sec > 0) { /* * Update pool statistics every 1s. @@ -598,16 +590,17 @@ int ldlm_pool_recalc(struct ldlm_pool *pl) count = pl->pl_ops->po_recalc(pl); lprocfs_counter_add(pl->pl_stats, LDLM_POOL_RECALC_STAT, count); - return count; } + recalc_interval_sec = pl->pl_recalc_time - cfs_time_current_sec() + + pl->pl_recalc_period; - return 0; + return recalc_interval_sec; } -EXPORT_SYMBOL(ldlm_pool_recalc); -/** +/* * Pool shrink wrapper. Will call either client or server pool recalc callback - * depending what pool \a pl is used. + * depending what pool pl is used. When nr == 0, just return the number of + * freeable locks. Otherwise, return the number of canceled locks. */ int ldlm_pool_shrink(struct ldlm_pool *pl, int nr, unsigned int gfp_mask) @@ -734,11 +727,10 @@ static int ldlm_pool_proc_init(struct ldlm_pool *pl) struct lprocfs_vars pool_vars[2]; char *var_name = NULL; int rc = 0; - ENTRY; OBD_ALLOC(var_name, MAX_STRING_SIZE + 1); if (!var_name) - RETURN(-ENOMEM); + return -ENOMEM; parent_ns_proc = ns->ns_proc_dir_entry; if (parent_ns_proc == NULL) { @@ -751,6 +743,7 @@ static int ldlm_pool_proc_init(struct ldlm_pool *pl) if (IS_ERR(pl->pl_proc_dir)) { CERROR("LProcFS failed in ldlm-pool-init\n"); rc = PTR_ERR(pl->pl_proc_dir); + pl->pl_proc_dir = NULL; GOTO(out_free_name, rc); } @@ -813,7 +806,6 @@ static int ldlm_pool_proc_init(struct ldlm_pool *pl) "recalc_timing", "sec"); rc = lprocfs_register_stats(pl->pl_proc_dir, "stats", pl->pl_stats); - EXIT; out_free_name: OBD_FREE(var_name, MAX_STRING_SIZE + 1); return rc; @@ -835,7 +827,6 @@ int ldlm_pool_init(struct ldlm_pool *pl, struct ldlm_namespace *ns, int idx, ldlm_side_t client) { int rc; - ENTRY; spin_lock_init(&pl->pl_lock); atomic_set(&pl->pl_granted, 0); @@ -863,17 +854,16 @@ int ldlm_pool_init(struct ldlm_pool *pl, struct ldlm_namespace *ns, pl->pl_client_lock_volume = 0; rc = ldlm_pool_proc_init(pl); if (rc) - RETURN(rc); + return rc; CDEBUG(D_DLMTRACE, "Lock pool %s is initialized\n", pl->pl_name); - RETURN(rc); + return rc; } EXPORT_SYMBOL(ldlm_pool_init); void ldlm_pool_fini(struct ldlm_pool *pl) { - ENTRY; ldlm_pool_proc_fini(pl); /* @@ -882,7 +872,6 @@ void ldlm_pool_fini(struct ldlm_pool *pl) * any abnormal using cases. */ POISON(pl, 0x5a, sizeof(*pl)); - EXIT; } EXPORT_SYMBOL(ldlm_pool_fini); @@ -1025,37 +1014,32 @@ static int ldlm_pool_granted(struct ldlm_pool *pl) } static struct ptlrpc_thread *ldlm_pools_thread; -static struct shrinker *ldlm_pools_srv_shrinker; -static struct shrinker *ldlm_pools_cli_shrinker; static struct completion ldlm_pools_comp; /* - * Cancel \a nr locks from all namespaces (if possible). Returns number of - * cached locks after shrink is finished. All namespaces are asked to - * cancel approximately equal amount of locks to keep balancing. + * count locks from all namespaces (if possible). Returns number of + * cached locks. */ -static int ldlm_pools_shrink(ldlm_side_t client, int nr, - unsigned int gfp_mask) +static unsigned long ldlm_pools_count(ldlm_side_t client, unsigned int gfp_mask) { - int total = 0, cached = 0, nr_ns; + int total = 0, nr_ns; struct ldlm_namespace *ns; + struct ldlm_namespace *ns_old = NULL; /* loop detection */ void *cookie; - if (client == LDLM_NAMESPACE_CLIENT && nr != 0 && - !(gfp_mask & __GFP_FS)) - return -1; + if (client == LDLM_NAMESPACE_CLIENT && !(gfp_mask & __GFP_FS)) + return 0; - CDEBUG(D_DLMTRACE, "Request to shrink %d %s locks from all pools\n", - nr, client == LDLM_NAMESPACE_CLIENT ? "client" : "server"); + CDEBUG(D_DLMTRACE, "Request to count %s locks from all pools\n", + client == LDLM_NAMESPACE_CLIENT ? "client" : "server"); cookie = cl_env_reenter(); /* * Find out how many resources we may release. */ - for (nr_ns = atomic_read(ldlm_namespace_nr(client)); - nr_ns > 0; nr_ns--) - { + for (nr_ns = ldlm_namespace_nr_read(client); + nr_ns > 0; nr_ns--) { mutex_lock(ldlm_namespace_lock(client)); if (list_empty(ldlm_namespace_list(client))) { mutex_unlock(ldlm_namespace_lock(client)); @@ -1063,24 +1047,49 @@ static int ldlm_pools_shrink(ldlm_side_t client, int nr, return 0; } ns = ldlm_namespace_first_locked(client); + + if (ns == ns_old) { + mutex_unlock(ldlm_namespace_lock(client)); + break; + } + + if (ldlm_ns_empty(ns)) { + ldlm_namespace_move_to_inactive_locked(ns, client); + mutex_unlock(ldlm_namespace_lock(client)); + continue; + } + + if (ns_old == NULL) + ns_old = ns; + ldlm_namespace_get(ns); - ldlm_namespace_move_locked(ns, client); + ldlm_namespace_move_to_active_locked(ns, client); mutex_unlock(ldlm_namespace_lock(client)); total += ldlm_pool_shrink(&ns->ns_pool, 0, gfp_mask); ldlm_namespace_put(ns); } - if (nr == 0 || total == 0) { - cl_env_reexit(cookie); - return total; - } + cl_env_reexit(cookie); + return total; +} + +static unsigned long ldlm_pools_scan(ldlm_side_t client, int nr, unsigned int gfp_mask) +{ + unsigned long freed = 0; + int tmp, nr_ns; + struct ldlm_namespace *ns; + void *cookie; + + if (client == LDLM_NAMESPACE_CLIENT && !(gfp_mask & __GFP_FS)) + return -1; + + cookie = cl_env_reenter(); /* - * Shrink at least ldlm_namespace_nr(client) namespaces. + * Shrink at least ldlm_namespace_nr_read(client) namespaces. */ - for (nr_ns = atomic_read(ldlm_namespace_nr(client)); - nr_ns > 0; nr_ns--) - { + for (tmp = nr_ns = ldlm_namespace_nr_read(client); + tmp > 0; tmp--) { int cancel, nr_locks; /* @@ -1089,50 +1098,59 @@ static int ldlm_pools_shrink(ldlm_side_t client, int nr, mutex_lock(ldlm_namespace_lock(client)); if (list_empty(ldlm_namespace_list(client))) { mutex_unlock(ldlm_namespace_lock(client)); - /* - * If list is empty, we can't return any @cached > 0, - * that probably would cause needless shrinker - * call. - */ - cached = 0; break; } ns = ldlm_namespace_first_locked(client); ldlm_namespace_get(ns); - ldlm_namespace_move_locked(ns, client); + ldlm_namespace_move_to_active_locked(ns, client); mutex_unlock(ldlm_namespace_lock(client)); nr_locks = ldlm_pool_granted(&ns->ns_pool); - cancel = 1 + nr_locks * nr / total; - ldlm_pool_shrink(&ns->ns_pool, cancel, gfp_mask); - cached += ldlm_pool_granted(&ns->ns_pool); + /* + * We use to shrink propotionally but with new shrinker API, + * we lost the total number of freeable locks. + */ + cancel = 1 + min_t(int, nr_locks, nr / nr_ns); + freed += ldlm_pool_shrink(&ns->ns_pool, cancel, gfp_mask); ldlm_namespace_put(ns); } cl_env_reexit(cookie); - /* we only decrease the SLV in server pools shrinker, return -1 to - * kernel to avoid needless loop. LU-1128 */ - return (client == LDLM_NAMESPACE_SERVER) ? -1 : cached; + /* + * we only decrease the SLV in server pools shrinker, return + * SHRINK_STOP to kernel to avoid needless loop. LU-1128 + */ + return (client == LDLM_NAMESPACE_SERVER) ? SHRINK_STOP : freed; +} + +static unsigned long ldlm_pools_srv_count(struct shrinker *s, struct shrink_control *sc) +{ + return ldlm_pools_count(LDLM_NAMESPACE_SERVER, sc->gfp_mask); +} + +static unsigned long ldlm_pools_srv_scan(struct shrinker *s, struct shrink_control *sc) +{ + return ldlm_pools_scan(LDLM_NAMESPACE_SERVER, sc->nr_to_scan, + sc->gfp_mask); } -static int ldlm_pools_srv_shrink(SHRINKER_ARGS(sc, nr_to_scan, gfp_mask)) +static unsigned long ldlm_pools_cli_count(struct shrinker *s, struct shrink_control *sc) { - return ldlm_pools_shrink(LDLM_NAMESPACE_SERVER, - shrink_param(sc, nr_to_scan), - shrink_param(sc, gfp_mask)); + return ldlm_pools_count(LDLM_NAMESPACE_CLIENT, sc->gfp_mask); } -static int ldlm_pools_cli_shrink(SHRINKER_ARGS(sc, nr_to_scan, gfp_mask)) +static unsigned long ldlm_pools_cli_scan(struct shrinker *s, struct shrink_control *sc) { - return ldlm_pools_shrink(LDLM_NAMESPACE_CLIENT, - shrink_param(sc, nr_to_scan), - shrink_param(sc, gfp_mask)); + return ldlm_pools_scan(LDLM_NAMESPACE_CLIENT, sc->nr_to_scan, + sc->gfp_mask); } -void ldlm_pools_recalc(ldlm_side_t client) +int ldlm_pools_recalc(ldlm_side_t client) { __u32 nr_l = 0, nr_p = 0, l; struct ldlm_namespace *ns; + struct ldlm_namespace *ns_old = NULL; int nr, equal = 0; + int time = 50; /* seconds of sleep if no active namespaces */ /* * No need to setup pool limit for client pools. @@ -1190,16 +1208,14 @@ void ldlm_pools_recalc(ldlm_side_t client) * for _all_ pools. */ l = LDLM_POOL_HOST_L / - atomic_read( - ldlm_namespace_nr(client)); + ldlm_namespace_nr_read(client); } else { /* * All the rest of greedy pools will have * all locks in equal parts. */ l = (LDLM_POOL_HOST_L - nr_l) / - (atomic_read( - ldlm_namespace_nr(client)) - + (ldlm_namespace_nr_read(client) - nr_p); } ldlm_pool_setup(&ns->ns_pool, l); @@ -1208,9 +1224,9 @@ void ldlm_pools_recalc(ldlm_side_t client) } /* - * Recalc at least ldlm_namespace_nr(client) namespaces. + * Recalc at least ldlm_namespace_nr_read(client) namespaces. */ - for (nr = atomic_read(ldlm_namespace_nr(client)); nr > 0; nr--) { + for (nr = ldlm_namespace_nr_read(client); nr > 0; nr--) { int skip; /* * Lock the list, get first @ns in the list, getref, move it @@ -1226,6 +1242,30 @@ void ldlm_pools_recalc(ldlm_side_t client) } ns = ldlm_namespace_first_locked(client); + if (ns_old == ns) { /* Full pass complete */ + mutex_unlock(ldlm_namespace_lock(client)); + break; + } + + /* We got an empty namespace, need to move it back to inactive + * list. + * The race with parallel resource creation is fine: + * - If they do namespace_get before our check, we fail the + * check and they move this item to the end of the list anyway + * - If we do the check and then they do namespace_get, then + * we move the namespace to inactive and they will move + * it back to active (synchronised by the lock, so no clash + * there). + */ + if (ldlm_ns_empty(ns)) { + ldlm_namespace_move_to_inactive_locked(ns, client); + mutex_unlock(ldlm_namespace_lock(client)); + continue; + } + + if (ns_old == NULL) + ns_old = ns; + spin_lock(&ns->ns_lock); /* * skip ns which is being freed, and we don't want to increase @@ -1239,24 +1279,29 @@ void ldlm_pools_recalc(ldlm_side_t client) } spin_unlock(&ns->ns_lock); - ldlm_namespace_move_locked(ns, client); + ldlm_namespace_move_to_active_locked(ns, client); mutex_unlock(ldlm_namespace_lock(client)); /* * After setup is done - recalc the pool. */ if (!skip) { - ldlm_pool_recalc(&ns->ns_pool); + int ttime = ldlm_pool_recalc(&ns->ns_pool); + + if (ttime < time) + time = ttime; + ldlm_namespace_put(ns); } } + return time; } EXPORT_SYMBOL(ldlm_pools_recalc); static int ldlm_pools_thread_main(void *arg) { struct ptlrpc_thread *thread = (struct ptlrpc_thread *)arg; - ENTRY; + int s_time, c_time; thread_set_flags(thread, SVC_RUNNING); wake_up(&thread->t_ctl_waitq); @@ -1270,14 +1315,14 @@ static int ldlm_pools_thread_main(void *arg) /* * Recal all pools on this tick. */ - ldlm_pools_recalc(LDLM_NAMESPACE_SERVER); - ldlm_pools_recalc(LDLM_NAMESPACE_CLIENT); + s_time = ldlm_pools_recalc(LDLM_NAMESPACE_SERVER); + c_time = ldlm_pools_recalc(LDLM_NAMESPACE_CLIENT); /* * Wait until the next check time, or until we're * stopped. */ - lwi = LWI_TIMEOUT(cfs_time_seconds(LDLM_POOLS_THREAD_PERIOD), + lwi = LWI_TIMEOUT(cfs_time_seconds(min(s_time, c_time)), NULL, NULL); l_wait_event(thread->t_ctl_waitq, thread_is_stopping(thread) || @@ -1302,15 +1347,14 @@ static int ldlm_pools_thread_main(void *arg) static int ldlm_pools_thread_start(void) { struct l_wait_info lwi = { 0 }; - task_t *task; - ENTRY; + struct task_struct *task; if (ldlm_pools_thread != NULL) - RETURN(-EALREADY); + return -EALREADY; OBD_ALLOC_PTR(ldlm_pools_thread); if (ldlm_pools_thread == NULL) - RETURN(-ENOMEM); + return -ENOMEM; init_completion(&ldlm_pools_comp); init_waitqueue_head(&ldlm_pools_thread->t_ctl_waitq); @@ -1321,19 +1365,16 @@ static int ldlm_pools_thread_start(void) CERROR("Can't start pool thread, error %ld\n", PTR_ERR(task)); OBD_FREE(ldlm_pools_thread, sizeof(*ldlm_pools_thread)); ldlm_pools_thread = NULL; - RETURN(PTR_ERR(task)); + return PTR_ERR(task); } l_wait_event(ldlm_pools_thread->t_ctl_waitq, thread_is_running(ldlm_pools_thread), &lwi); - RETURN(0); + return 0; } static void ldlm_pools_thread_stop(void) { - ENTRY; - if (ldlm_pools_thread == NULL) { - EXIT; return; } @@ -1348,37 +1389,37 @@ static void ldlm_pools_thread_stop(void) wait_for_completion(&ldlm_pools_comp); OBD_FREE_PTR(ldlm_pools_thread); ldlm_pools_thread = NULL; - EXIT; } +static struct shrinker ldlm_pools_srv_shrinker = { + .count_objects = ldlm_pools_srv_count, + .scan_objects = ldlm_pools_srv_scan, + .seeks = DEFAULT_SEEKS, +}; + +static struct shrinker ldlm_pools_cli_shrinker = { + .count_objects = ldlm_pools_cli_count, + .scan_objects = ldlm_pools_cli_scan, + .seeks = DEFAULT_SEEKS, +}; + int ldlm_pools_init(void) { int rc; - ENTRY; rc = ldlm_pools_thread_start(); if (rc == 0) { - ldlm_pools_srv_shrinker = - set_shrinker(DEFAULT_SEEKS, - ldlm_pools_srv_shrink); - ldlm_pools_cli_shrinker = - set_shrinker(DEFAULT_SEEKS, - ldlm_pools_cli_shrink); + register_shrinker(&ldlm_pools_srv_shrinker); + register_shrinker(&ldlm_pools_cli_shrinker); } - RETURN(rc); + return rc; } EXPORT_SYMBOL(ldlm_pools_init); void ldlm_pools_fini(void) { - if (ldlm_pools_srv_shrinker != NULL) { - remove_shrinker(ldlm_pools_srv_shrinker); - ldlm_pools_srv_shrinker = NULL; - } - if (ldlm_pools_cli_shrinker != NULL) { - remove_shrinker(ldlm_pools_cli_shrinker); - ldlm_pools_cli_shrinker = NULL; - } + unregister_shrinker(&ldlm_pools_srv_shrinker); + unregister_shrinker(&ldlm_pools_cli_shrinker); ldlm_pools_thread_stop(); } EXPORT_SYMBOL(ldlm_pools_fini); diff --git a/drivers/staging/lustre/lustre/ldlm/ldlm_request.c b/drivers/staging/lustre/lustre/ldlm/ldlm_request.c index 1a690edaba03..21cb523ac4af 100644 --- a/drivers/staging/lustre/lustre/ldlm/ldlm_request.c +++ b/drivers/staging/lustre/lustre/ldlm/ldlm_request.c @@ -94,12 +94,11 @@ int ldlm_expired_completion_wait(void *data) struct obd_import *imp; struct obd_device *obd; - ENTRY; if (lock->l_conn_export == NULL) { static cfs_time_t next_dump = 0, last_dump = 0; if (ptlrpc_check_suspend()) - RETURN(0); + return 0; LCONSOLE_WARN("lock timed out (enqueued at "CFS_TIME_T", " CFS_DURATION_T"s ago)\n", @@ -120,7 +119,7 @@ int ldlm_expired_completion_wait(void *data) if (last_dump == 0) libcfs_debug_dumplog(); } - RETURN(0); + return 0; } obd = lock->l_conn_export->exp_obd; @@ -132,7 +131,7 @@ int ldlm_expired_completion_wait(void *data) cfs_time_sub(cfs_time_current_sec(), lock->l_last_activity), obd2cli_tgt(obd), imp->imp_connection->c_remote_uuid.uuid); - RETURN(0); + return 0; } EXPORT_SYMBOL(ldlm_expired_completion_wait); @@ -160,7 +159,7 @@ static int ldlm_completion_tail(struct ldlm_lock *lock) long delay; int result; - if (lock->l_destroyed || lock->l_flags & LDLM_FL_FAILED) { + if (lock->l_flags & (LDLM_FL_DESTROYED | LDLM_FL_FAILED)) { LDLM_DEBUG(lock, "client-side enqueue: destroyed"); result = -EIO; } else { @@ -184,23 +183,21 @@ static int ldlm_completion_tail(struct ldlm_lock *lock) */ int ldlm_completion_ast_async(struct ldlm_lock *lock, __u64 flags, void *data) { - ENTRY; - if (flags == LDLM_FL_WAIT_NOREPROC) { LDLM_DEBUG(lock, "client-side enqueue waiting on pending lock"); - RETURN(0); + return 0; } if (!(flags & (LDLM_FL_BLOCK_WAIT | LDLM_FL_BLOCK_GRANTED | LDLM_FL_BLOCK_CONV))) { wake_up(&lock->l_waitq); - RETURN(ldlm_completion_tail(lock)); + return ldlm_completion_tail(lock); } LDLM_DEBUG(lock, "client-side enqueue returned a blocked lock, " "going forward"); ldlm_reprocess_all(lock->l_resource); - RETURN(0); + return 0; } EXPORT_SYMBOL(ldlm_completion_ast_async); @@ -234,7 +231,6 @@ int ldlm_completion_ast(struct ldlm_lock *lock, __u64 flags, void *data) struct l_wait_info lwi; __u32 timeout; int rc = 0; - ENTRY; if (flags == LDLM_FL_WAIT_NOREPROC) { LDLM_DEBUG(lock, "client-side enqueue waiting on pending lock"); @@ -244,7 +240,7 @@ int ldlm_completion_ast(struct ldlm_lock *lock, __u64 flags, void *data) if (!(flags & (LDLM_FL_BLOCK_WAIT | LDLM_FL_BLOCK_GRANTED | LDLM_FL_BLOCK_CONV))) { wake_up(&lock->l_waitq); - RETURN(0); + return 0; } LDLM_DEBUG(lock, "client-side enqueue returned a blocked lock, " @@ -295,10 +291,10 @@ noreproc: if (rc) { LDLM_DEBUG(lock, "client-side enqueue waking up: failed (%d)", rc); - RETURN(rc); + return rc; } - RETURN(ldlm_completion_tail(lock)); + return ldlm_completion_tail(lock); } EXPORT_SYMBOL(ldlm_completion_ast); @@ -316,7 +312,6 @@ EXPORT_SYMBOL(ldlm_completion_ast); int ldlm_blocking_ast_nocheck(struct ldlm_lock *lock) { int do_ast; - ENTRY; lock->l_flags |= LDLM_FL_CBPENDING; do_ast = (!lock->l_readers && !lock->l_writers); @@ -335,7 +330,7 @@ int ldlm_blocking_ast_nocheck(struct ldlm_lock *lock) LDLM_DEBUG(lock, "Lock still has references, will be " "cancelled later"); } - RETURN(0); + return 0; } EXPORT_SYMBOL(ldlm_blocking_ast_nocheck); @@ -355,11 +350,9 @@ EXPORT_SYMBOL(ldlm_blocking_ast_nocheck); int ldlm_blocking_ast(struct ldlm_lock *lock, struct ldlm_lock_desc *desc, void *data, int flag) { - ENTRY; - if (flag == LDLM_CB_CANCELING) { /* Don't need to do anything here. */ - RETURN(0); + return 0; } lock_res_and_lock(lock); @@ -370,9 +363,9 @@ int ldlm_blocking_ast(struct ldlm_lock *lock, struct ldlm_lock_desc *desc, * early, if so. */ if (lock->l_blocking_ast != ldlm_blocking_ast) { unlock_res_and_lock(lock); - RETURN(0); + return 0; } - RETURN(ldlm_blocking_ast_nocheck(lock)); + return ldlm_blocking_ast_nocheck(lock); } EXPORT_SYMBOL(ldlm_blocking_ast); @@ -424,7 +417,6 @@ int ldlm_cli_enqueue_local(struct ldlm_namespace *ns, .lcs_blocking = blocking, .lcs_glimpse = glimpse, }; - ENTRY; LASSERT(!(*flags & LDLM_FL_REPLAY)); if (unlikely(ns_is_client(ns))) { @@ -464,7 +456,6 @@ int ldlm_cli_enqueue_local(struct ldlm_namespace *ns, lock->l_completion_ast(lock, *flags, NULL); LDLM_DEBUG(lock, "client-side local enqueue handler, new lock created"); - EXIT; out: LDLM_LOCK_RELEASE(lock); out_nolock: @@ -530,13 +521,12 @@ int ldlm_cli_enqueue_fini(struct obd_export *exp, struct ptlrpc_request *req, struct ldlm_reply *reply; int cleanup_phase = 1; int size = 0; - ENTRY; lock = ldlm_handle2lock(lockh); /* ldlm_cli_enqueue is holding a reference on this lock. */ if (!lock) { LASSERT(type == LDLM_FLOCK); - RETURN(-ENOLCK); + return -ENOLCK; } LASSERTF(ergo(lvb_len != 0, lvb_len == lock->l_lvb_len), @@ -698,7 +688,6 @@ int ldlm_cli_enqueue_fini(struct obd_export *exp, struct ptlrpc_request *req, } LDLM_DEBUG(lock, "client-side enqueue END"); - EXIT; cleanup: if (cleanup_phase == 1 && rc) failed_lock_cleanup(ns, lock, mode); @@ -763,7 +752,6 @@ int ldlm_prep_elc_req(struct obd_export *exp, struct ptlrpc_request *req, int flags, avail, to_free, pack = 0; LIST_HEAD(head); int rc; - ENTRY; if (cancels == NULL) cancels = &head; @@ -794,7 +782,7 @@ int ldlm_prep_elc_req(struct obd_export *exp, struct ptlrpc_request *req, rc = ptlrpc_request_pack(req, version, opc); if (rc) { ldlm_lock_list_put(cancels, l_bl_ast, count); - RETURN(rc); + return rc; } if (ns_connect_cancelset(ns)) { @@ -814,7 +802,7 @@ int ldlm_prep_elc_req(struct obd_export *exp, struct ptlrpc_request *req, } else { ldlm_lock_list_put(cancels, l_bl_ast, count); } - RETURN(0); + return 0; } EXPORT_SYMBOL(ldlm_prep_elc_req); @@ -830,21 +818,20 @@ struct ptlrpc_request *ldlm_enqueue_pack(struct obd_export *exp, int lvb_len) { struct ptlrpc_request *req; int rc; - ENTRY; req = ptlrpc_request_alloc(class_exp2cliimp(exp), &RQF_LDLM_ENQUEUE); if (req == NULL) - RETURN(ERR_PTR(-ENOMEM)); + return ERR_PTR(-ENOMEM); rc = ldlm_prep_enqueue_req(exp, req, NULL, 0); if (rc) { ptlrpc_request_free(req); - RETURN(ERR_PTR(rc)); + return ERR_PTR(rc); } req_capsule_set_size(&req->rq_pill, &RMF_DLM_LVB, RCL_SERVER, lvb_len); ptlrpc_request_set_replen(req); - RETURN(req); + return req; } EXPORT_SYMBOL(ldlm_enqueue_pack); @@ -872,7 +859,6 @@ int ldlm_cli_enqueue(struct obd_export *exp, struct ptlrpc_request **reqp, int req_passed_in = 1; int rc, err; struct ptlrpc_request *req; - ENTRY; LASSERT(exp != NULL); @@ -888,15 +874,14 @@ int ldlm_cli_enqueue(struct obd_export *exp, struct ptlrpc_request **reqp, } else { const struct ldlm_callback_suite cbs = { .lcs_completion = einfo->ei_cb_cp, - .lcs_blocking = einfo->ei_cb_bl, - .lcs_glimpse = einfo->ei_cb_gl, - .lcs_weigh = einfo->ei_cb_wg + .lcs_blocking = einfo->ei_cb_bl, + .lcs_glimpse = einfo->ei_cb_gl }; lock = ldlm_lock_create(ns, res_id, einfo->ei_type, einfo->ei_mode, &cbs, einfo->ei_cbdata, lvb_len, lvb_type); if (lock == NULL) - RETURN(-ENOMEM); + return -ENOMEM; /* for the local lock, add the reference */ ldlm_lock_addref_internal(lock, einfo->ei_mode); ldlm_lock2handle(lock, lockh); @@ -937,7 +922,7 @@ int ldlm_cli_enqueue(struct obd_export *exp, struct ptlrpc_request **reqp, if (req == NULL) { failed_lock_cleanup(ns, lock, einfo->ei_mode); LDLM_LOCK_RELEASE(lock); - RETURN(-ENOMEM); + return -ENOMEM; } req_passed_in = 0; if (reqp) @@ -978,7 +963,7 @@ int ldlm_cli_enqueue(struct obd_export *exp, struct ptlrpc_request **reqp, if (async) { LASSERT(reqp != NULL); - RETURN(0); + return 0; } LDLM_DEBUG(lock, "sending request"); @@ -1002,7 +987,7 @@ int ldlm_cli_enqueue(struct obd_export *exp, struct ptlrpc_request **reqp, *reqp = NULL; } - RETURN(rc); + return rc; } EXPORT_SYMBOL(ldlm_cli_enqueue); @@ -1011,7 +996,7 @@ static int ldlm_cli_convert_local(struct ldlm_lock *lock, int new_mode, { struct ldlm_resource *res; int rc; - ENTRY; + if (ns_is_client(ldlm_lock_to_ns(lock))) { CERROR("Trying to cancel local lock\n"); LBUG(); @@ -1023,11 +1008,11 @@ static int ldlm_cli_convert_local(struct ldlm_lock *lock, int new_mode, ldlm_reprocess_all(res); rc = 0; } else { - rc = EDEADLOCK; + rc = LUSTRE_EDEADLK; } LDLM_DEBUG(lock, "client-side local convert handler END"); LDLM_LOCK_PUT(lock); - RETURN(rc); + return rc; } /* FIXME: one of ldlm_cli_convert or the server side should reject attempted @@ -1042,17 +1027,16 @@ int ldlm_cli_convert(struct lustre_handle *lockh, int new_mode, __u32 *flags) struct ldlm_resource *res; struct ptlrpc_request *req; int rc; - ENTRY; lock = ldlm_handle2lock(lockh); if (!lock) { LBUG(); - RETURN(-EINVAL); + return -EINVAL; } *flags = 0; if (lock->l_conn_export == NULL) - RETURN(ldlm_cli_convert_local(lock, new_mode, flags)); + return ldlm_cli_convert_local(lock, new_mode, flags); LDLM_DEBUG(lock, "client-side convert"); @@ -1061,7 +1045,7 @@ int ldlm_cli_convert(struct lustre_handle *lockh, int new_mode, __u32 *flags) LDLM_CONVERT); if (req == NULL) { LDLM_LOCK_PUT(lock); - RETURN(-ENOMEM); + return -ENOMEM; } body = req_capsule_client_get(&req->rq_pill, &RMF_DLM_REQ); @@ -1095,9 +1079,8 @@ int ldlm_cli_convert(struct lustre_handle *lockh, int new_mode, __u32 *flags) GOTO(out, rc); } } else { - rc = EDEADLOCK; + rc = LUSTRE_EDEADLK; } - EXIT; out: LDLM_LOCK_PUT(lock); ptlrpc_req_finished(req); @@ -1115,7 +1098,6 @@ EXPORT_SYMBOL(ldlm_cli_convert); static __u64 ldlm_cli_cancel_local(struct ldlm_lock *lock) { __u64 rc = LDLM_FL_LOCAL_ONLY; - ENTRY; if (lock->l_conn_export) { bool local_only; @@ -1147,7 +1129,7 @@ static __u64 ldlm_cli_cancel_local(struct ldlm_lock *lock) ldlm_reprocess_all(lock->l_resource); } - RETURN(rc); + return rc; } /** @@ -1159,7 +1141,6 @@ static void ldlm_cancel_pack(struct ptlrpc_request *req, struct ldlm_request *dlm; struct ldlm_lock *lock; int max, packed = 0; - ENTRY; dlm = req_capsule_client_get(&req->rq_pill, &RMF_DLM_REQ); LASSERT(dlm != NULL); @@ -1184,7 +1165,6 @@ static void ldlm_cancel_pack(struct ptlrpc_request *req, packed++; } CDEBUG(D_DLMTRACE, "%d locks packed\n", packed); - EXIT; } /** @@ -1197,7 +1177,6 @@ int ldlm_cli_cancel_req(struct obd_export *exp, struct list_head *cancels, struct obd_import *imp; int free, sent = 0; int rc = 0; - ENTRY; LASSERT(exp != NULL); LASSERT(count > 0); @@ -1205,7 +1184,7 @@ int ldlm_cli_cancel_req(struct obd_export *exp, struct list_head *cancels, CFS_FAIL_TIMEOUT(OBD_FAIL_LDLM_PAUSE_CANCEL, cfs_fail_val); if (CFS_FAIL_CHECK(OBD_FAIL_LDLM_CANCEL_RACE)) - RETURN(count); + return count; free = ldlm_format_handles_avail(class_exp2cliimp(exp), &RQF_LDLM_CANCEL, RCL_CLIENT, 0); @@ -1217,7 +1196,7 @@ int ldlm_cli_cancel_req(struct obd_export *exp, struct list_head *cancels, if (imp == NULL || imp->imp_invalid) { CDEBUG(D_DLMTRACE, "skipping cancel on invalid import %p\n", imp); - RETURN(count); + return count; } req = ptlrpc_request_alloc(imp, &RQF_LDLM_CANCEL); @@ -1248,7 +1227,7 @@ int ldlm_cli_cancel_req(struct obd_export *exp, struct list_head *cancels, } else { rc = ptlrpc_queue_wait(req); } - if (rc == ESTALE) { + if (rc == LUSTRE_ESTALE) { CDEBUG(D_DLMTRACE, "client/server (nid %s) " "out of sync -- not fatal\n", libcfs_nid2str(req->rq_import-> @@ -1270,7 +1249,6 @@ int ldlm_cli_cancel_req(struct obd_export *exp, struct list_head *cancels, } ptlrpc_req_finished(req); - EXIT; out: return sent ? sent : rc; } @@ -1290,14 +1268,14 @@ int ldlm_cli_update_pool(struct ptlrpc_request *req) struct obd_device *obd; __u64 new_slv; __u32 new_limit; - ENTRY; + if (unlikely(!req->rq_import || !req->rq_import->imp_obd || !imp_connect_lru_resize(req->rq_import))) { /* * Do nothing for corner cases. */ - RETURN(0); + return 0; } /* In some cases RPC may contain SLV and limit zeroed out. This @@ -1311,7 +1289,7 @@ int ldlm_cli_update_pool(struct ptlrpc_request *req) "(SLV: "LPU64", Limit: %u)", lustre_msg_get_slv(req->rq_repmsg), lustre_msg_get_limit(req->rq_repmsg)); - RETURN(0); + return 0; } new_limit = lustre_msg_get_limit(req->rq_repmsg); @@ -1328,7 +1306,7 @@ int ldlm_cli_update_pool(struct ptlrpc_request *req) obd->obd_pool_limit = new_limit; write_unlock(&obd->obd_pool_lock); - RETURN(0); + return 0; } EXPORT_SYMBOL(ldlm_cli_update_pool); @@ -1346,19 +1324,18 @@ int ldlm_cli_cancel(struct lustre_handle *lockh, struct ldlm_namespace *ns; struct ldlm_lock *lock; LIST_HEAD(cancels); - ENTRY; /* concurrent cancels on the same handle can happen */ lock = ldlm_handle2lock_long(lockh, LDLM_FL_CANCELING); if (lock == NULL) { LDLM_DEBUG_NOLOCK("lock is already being destroyed\n"); - RETURN(0); + return 0; } rc = ldlm_cli_cancel_local(lock); if (rc == LDLM_FL_LOCAL_ONLY) { LDLM_LOCK_RELEASE(lock); - RETURN(0); + return 0; } /* Even if the lock is marked as LDLM_FL_BL_AST, this is a LDLM_CANCEL * RPC which goes to canceld portal, so we can cancel other LRU locks @@ -1380,7 +1357,7 @@ int ldlm_cli_cancel(struct lustre_handle *lockh, LCF_BL_AST, flags); } ldlm_cli_cancel_list(&cancels, count, NULL, cancel_flags); - RETURN(0); + return 0; } EXPORT_SYMBOL(ldlm_cli_cancel); @@ -1430,7 +1407,7 @@ int ldlm_cli_cancel_list_local(struct list_head *cancels, int count, ldlm_cli_cancel_list(&head, bl_ast, NULL, 0); } - RETURN(count); + return count; } EXPORT_SYMBOL(ldlm_cli_cancel_list_local); @@ -1462,7 +1439,7 @@ static ldlm_policy_res_t ldlm_cancel_no_wait_policy(struct ldlm_namespace *ns, } unlock_res_and_lock(lock); - RETURN(result); + return result; } /** @@ -1631,7 +1608,6 @@ static int ldlm_prepare_lru_list(struct ldlm_namespace *ns, struct list_head *ca ldlm_cancel_lru_policy_t pf; struct ldlm_lock *lock, *next; int added = 0, unused, remained; - ENTRY; spin_lock(&ns->ns_lock); unused = ns->ns_nr_unused; @@ -1754,7 +1730,7 @@ static int ldlm_prepare_lru_list(struct ldlm_namespace *ns, struct list_head *ca unused--; } spin_unlock(&ns->ns_lock); - RETURN(added); + return added; } int ldlm_cancel_lru_local(struct ldlm_namespace *ns, struct list_head *cancels, @@ -1782,16 +1758,15 @@ int ldlm_cancel_lru(struct ldlm_namespace *ns, int nr, { LIST_HEAD(cancels); int count, rc; - ENTRY; /* Just prepare the list of locks, do not actually cancel them yet. * Locks are cancelled later in a separate thread. */ count = ldlm_prepare_lru_list(ns, &cancels, nr, 0, flags); rc = ldlm_bl_to_thread_list(ns, NULL, &cancels, count, cancel_flags); if (rc == 0) - RETURN(count); + return count; - RETURN(0); + return 0; } /** @@ -1807,7 +1782,6 @@ int ldlm_cancel_resource_local(struct ldlm_resource *res, { struct ldlm_lock *lock; int count = 0; - ENTRY; lock_res(res); list_for_each_entry(lock, &res->lr_granted, l_res_link) { @@ -1848,7 +1822,7 @@ int ldlm_cancel_resource_local(struct ldlm_resource *res, } unlock_res(res); - RETURN(ldlm_cli_cancel_list_local(cancels, count, cancel_flags)); + return ldlm_cli_cancel_list_local(cancels, count, cancel_flags); } EXPORT_SYMBOL(ldlm_cancel_resource_local); @@ -1867,10 +1841,9 @@ int ldlm_cli_cancel_list(struct list_head *cancels, int count, { struct ldlm_lock *lock; int res = 0; - ENTRY; if (list_empty(cancels) || count == 0) - RETURN(0); + return 0; /* XXX: requests (both batched and not) could be sent in parallel. * Usually it is enough to have just 1 RPC, but it is possible that @@ -1906,7 +1879,7 @@ int ldlm_cli_cancel_list(struct list_head *cancels, int count, ldlm_lock_list_put(cancels, l_bl_ast, res); } LASSERT(count == 0); - RETURN(0); + return 0; } EXPORT_SYMBOL(ldlm_cli_cancel_list); @@ -1926,13 +1899,12 @@ int ldlm_cli_cancel_unused_resource(struct ldlm_namespace *ns, LIST_HEAD(cancels); int count; int rc; - ENTRY; res = ldlm_resource_get(ns, NULL, res_id, 0, 0); if (res == NULL) { /* This is not a problem. */ CDEBUG(D_INFO, "No resource "LPU64"\n", res_id->name[0]); - RETURN(0); + return 0; } LDLM_RESOURCE_ADDREF(res); @@ -1944,7 +1916,7 @@ int ldlm_cli_cancel_unused_resource(struct ldlm_namespace *ns, LDLM_RESOURCE_DELREF(res); ldlm_resource_putref(res); - RETURN(0); + return 0; } EXPORT_SYMBOL(ldlm_cli_cancel_unused_resource); @@ -1986,19 +1958,17 @@ int ldlm_cli_cancel_unused(struct ldlm_namespace *ns, .lc_opaque = opaque, }; - ENTRY; - if (ns == NULL) - RETURN(ELDLM_OK); + return ELDLM_OK; if (res_id != NULL) { - RETURN(ldlm_cli_cancel_unused_resource(ns, res_id, NULL, + return ldlm_cli_cancel_unused_resource(ns, res_id, NULL, LCK_MINMODE, flags, - opaque)); + opaque); } else { cfs_hash_for_each_nolock(ns->ns_rs_hash, ldlm_cli_hash_cancel_unused, &arg); - RETURN(ELDLM_OK); + return ELDLM_OK; } } EXPORT_SYMBOL(ldlm_cli_cancel_unused); @@ -2012,10 +1982,8 @@ int ldlm_resource_foreach(struct ldlm_resource *res, ldlm_iterator_t iter, struct ldlm_lock *lock; int rc = LDLM_ITER_CONTINUE; - ENTRY; - if (!res) - RETURN(LDLM_ITER_CONTINUE); + return LDLM_ITER_CONTINUE; lock_res(res); list_for_each_safe(tmp, next, &res->lr_granted) { @@ -2040,7 +2008,7 @@ int ldlm_resource_foreach(struct ldlm_resource *res, ldlm_iterator_t iter, } out: unlock_res(res); - RETURN(rc); + return rc; } EXPORT_SYMBOL(ldlm_resource_foreach); @@ -2069,7 +2037,10 @@ void ldlm_namespace_foreach(struct ldlm_namespace *ns, ldlm_iterator_t iter, void *closure) { - struct iter_helper_data helper = { iter: iter, closure: closure }; + struct iter_helper_data helper = { + .iter = iter, + .closure = closure, + }; cfs_hash_for_each_nolock(ns->ns_rs_hash, ldlm_res_iter_helper, &helper); @@ -2088,7 +2059,6 @@ int ldlm_resource_iterate(struct ldlm_namespace *ns, { struct ldlm_resource *res; int rc; - ENTRY; if (ns == NULL) { CERROR("must pass in namespace\n"); @@ -2097,13 +2067,13 @@ int ldlm_resource_iterate(struct ldlm_namespace *ns, res = ldlm_resource_get(ns, NULL, res_id, 0, 0); if (res == NULL) - RETURN(0); + return 0; LDLM_RESOURCE_ADDREF(res); rc = ldlm_resource_foreach(res, iter, data); LDLM_RESOURCE_DELREF(res); ldlm_resource_putref(res); - RETURN(rc); + return rc; } EXPORT_SYMBOL(ldlm_resource_iterate); @@ -2137,7 +2107,6 @@ static int replay_lock_interpret(const struct lu_env *env, struct ldlm_reply *reply; struct obd_export *exp; - ENTRY; atomic_dec(&req->rq_import->imp_replay_inflight); if (rc != ELDLM_OK) GOTO(out, rc); @@ -2178,7 +2147,7 @@ out: if (rc != ELDLM_OK) ptlrpc_connect_import(req->rq_import); - RETURN(rc); + return rc; } static int replay_one_lock(struct obd_import *imp, struct ldlm_lock *lock) @@ -2187,13 +2156,11 @@ static int replay_one_lock(struct obd_import *imp, struct ldlm_lock *lock) struct ldlm_async_args *aa; struct ldlm_request *body; int flags; - ENTRY; - /* Bug 11974: Do not replay a lock which is actively being canceled */ if (lock->l_flags & LDLM_FL_CANCELING) { LDLM_DEBUG(lock, "Not replaying canceled lock:"); - RETURN(0); + return 0; } /* If this is reply-less callback lock, we cannot replay it, since @@ -2202,7 +2169,7 @@ static int replay_one_lock(struct obd_import *imp, struct ldlm_lock *lock) if (lock->l_flags & LDLM_FL_CANCEL_ON_BLOCK) { LDLM_DEBUG(lock, "Not replaying reply-less lock:"); ldlm_lock_cancel(lock); - RETURN(0); + return 0; } /* @@ -2231,7 +2198,7 @@ static int replay_one_lock(struct obd_import *imp, struct ldlm_lock *lock) req = ptlrpc_request_alloc_pack(imp, &RQF_LDLM_ENQUEUE, LUSTRE_DLM_VERSION, LDLM_ENQUEUE); if (req == NULL) - RETURN(-ENOMEM); + return -ENOMEM; /* We're part of recovery, so don't wait for it. */ req->rq_send_state = LUSTRE_IMP_REPLAY_LOCKS; @@ -2261,7 +2228,7 @@ static int replay_one_lock(struct obd_import *imp, struct ldlm_lock *lock) req->rq_interpret_reply = (ptlrpc_interpterer_t)replay_lock_interpret; ptlrpcd_add_req(req, PDL_POLICY_LOCAL, -1); - RETURN(0); + return 0; } /** @@ -2300,13 +2267,11 @@ int ldlm_replay_locks(struct obd_import *imp) struct ldlm_lock *lock, *next; int rc = 0; - ENTRY; - LASSERT(atomic_read(&imp->imp_replay_inflight) == 0); /* don't replay locks if import failed recovery */ if (imp->imp_vbr_failed) - RETURN(0); + return 0; /* ensure this doesn't fall to 0 before all have been queued */ atomic_inc(&imp->imp_replay_inflight); @@ -2328,6 +2293,6 @@ int ldlm_replay_locks(struct obd_import *imp) atomic_dec(&imp->imp_replay_inflight); - RETURN(rc); + return rc; } EXPORT_SYMBOL(ldlm_replay_locks); diff --git a/drivers/staging/lustre/lustre/ldlm/ldlm_resource.c b/drivers/staging/lustre/lustre/ldlm/ldlm_resource.c index 9052dc5e7ad2..208751a154b3 100644 --- a/drivers/staging/lustre/lustre/ldlm/ldlm_resource.c +++ b/drivers/staging/lustre/lustre/ldlm/ldlm_resource.c @@ -48,18 +48,23 @@ struct kmem_cache *ldlm_resource_slab, *ldlm_lock_slab; -atomic_t ldlm_srv_namespace_nr = ATOMIC_INIT(0); -atomic_t ldlm_cli_namespace_nr = ATOMIC_INIT(0); +int ldlm_srv_namespace_nr = 0; +int ldlm_cli_namespace_nr = 0; struct mutex ldlm_srv_namespace_lock; LIST_HEAD(ldlm_srv_namespace_list); struct mutex ldlm_cli_namespace_lock; -LIST_HEAD(ldlm_cli_namespace_list); +/* Client Namespaces that have active resources in them. + * Once all resources go away, ldlm_poold moves such namespaces to the + * inactive list */ +LIST_HEAD(ldlm_cli_active_namespace_list); +/* Client namespaces that don't have any locks in them */ +LIST_HEAD(ldlm_cli_inactive_namespace_list); -proc_dir_entry_t *ldlm_type_proc_dir = NULL; -proc_dir_entry_t *ldlm_ns_proc_dir = NULL; -proc_dir_entry_t *ldlm_svc_proc_dir = NULL; +struct proc_dir_entry *ldlm_type_proc_dir = NULL; +struct proc_dir_entry *ldlm_ns_proc_dir = NULL; +struct proc_dir_entry *ldlm_svc_proc_dir = NULL; extern unsigned int ldlm_cancel_unused_locks_before_replay; @@ -73,7 +78,7 @@ static ssize_t lprocfs_wr_dump_ns(struct file *file, const char *buffer, { ldlm_dump_all_namespaces(LDLM_NAMESPACE_SERVER, D_DLMTRACE); ldlm_dump_all_namespaces(LDLM_NAMESPACE_CLIENT, D_DLMTRACE); - RETURN(count); + return count; } LPROC_SEQ_FOPS_WR_ONLY(ldlm, dump_ns); @@ -90,7 +95,6 @@ int ldlm_proc_setup(void) { "cancel_unused_locks_before_replay", &ldlm_rw_uint_fops, &ldlm_cancel_unused_locks_before_replay }, { NULL }}; - ENTRY; LASSERT(ldlm_ns_proc_dir == NULL); ldlm_type_proc_dir = lprocfs_register(OBD_LDLM_DEVICENAME, @@ -122,7 +126,7 @@ int ldlm_proc_setup(void) rc = lprocfs_add_vars(ldlm_type_proc_dir, list, NULL); - RETURN(0); + return 0; err_ns: lprocfs_remove(&ldlm_ns_proc_dir); @@ -132,7 +136,7 @@ err: ldlm_svc_proc_dir = NULL; ldlm_type_proc_dir = NULL; ldlm_ns_proc_dir = NULL; - RETURN(rc); + return rc; } void ldlm_proc_cleanup(void) @@ -325,7 +329,7 @@ int ldlm_namespace_proc_register(struct ldlm_namespace *ns) { struct lprocfs_vars lock_vars[2]; char lock_name[MAX_STRING_SIZE + 1]; - proc_dir_entry_t *ns_pde; + struct proc_dir_entry *ns_pde; LASSERT(ns != NULL); LASSERT(ns->ns_rs_hash != NULL); @@ -563,14 +567,13 @@ struct ldlm_namespace *ldlm_namespace_new(struct obd_device *obd, char *name, cfs_hash_bd_t bd; int idx; int rc; - ENTRY; LASSERT(obd != NULL); rc = ldlm_get_ref(); if (rc) { CERROR("ldlm_get_ref failed: %d\n", rc); - RETURN(NULL); + return NULL; } for (idx = 0;;idx++) { @@ -636,7 +639,7 @@ struct ldlm_namespace *ldlm_namespace_new(struct obd_device *obd, char *name, GOTO(out_hash, rc); } - idx = atomic_read(ldlm_namespace_nr(client)); + idx = ldlm_namespace_nr_read(client); rc = ldlm_pool_init(&ns->ns_pool, ns, idx, client); if (rc) { CERROR("Can't initialize lock pool, rc %d\n", rc); @@ -644,7 +647,7 @@ struct ldlm_namespace *ldlm_namespace_new(struct obd_device *obd, char *name, } ldlm_namespace_register(ns, client); - RETURN(ns); + return ns; out_proc: ldlm_namespace_proc_unregister(ns); ldlm_namespace_cleanup(ns, 0); @@ -654,7 +657,7 @@ out_ns: OBD_FREE_PTR(ns); out_ref: ldlm_put_ref(); - RETURN(NULL); + return NULL; } EXPORT_SYMBOL(ldlm_namespace_new); @@ -803,8 +806,6 @@ EXPORT_SYMBOL(ldlm_namespace_cleanup); */ static int __ldlm_namespace_free(struct ldlm_namespace *ns, int force) { - ENTRY; - /* At shutdown time, don't call the cancellation callback */ ldlm_namespace_cleanup(ns, force ? LDLM_FL_LOCAL_ONLY : 0); @@ -836,13 +837,13 @@ force_wait: "with %d resources in use, (rc=%d)\n", ldlm_ns_name(ns), atomic_read(&ns->ns_bref), rc); - RETURN(ELDLM_NAMESPACE_EXISTS); + return ELDLM_NAMESPACE_EXISTS; } CDEBUG(D_DLMTRACE, "dlm namespace %s free done waiting\n", ldlm_ns_name(ns)); } - RETURN(ELDLM_OK); + return ELDLM_OK; } /** @@ -859,9 +860,8 @@ void ldlm_namespace_free_prior(struct ldlm_namespace *ns, int force) { int rc; - ENTRY; + if (!ns) { - EXIT; return; } @@ -886,7 +886,6 @@ void ldlm_namespace_free_prior(struct ldlm_namespace *ns, rc = __ldlm_namespace_free(ns, 1); LASSERT(rc == 0); } - EXIT; } /** @@ -896,9 +895,7 @@ void ldlm_namespace_free_prior(struct ldlm_namespace *ns, */ void ldlm_namespace_free_post(struct ldlm_namespace *ns) { - ENTRY; if (!ns) { - EXIT; return; } @@ -917,7 +914,6 @@ void ldlm_namespace_free_post(struct ldlm_namespace *ns) LASSERT(list_empty(&ns->ns_list_chain)); OBD_FREE_PTR(ns); ldlm_put_ref(); - EXIT; } /** @@ -953,6 +949,12 @@ void ldlm_namespace_get(struct ldlm_namespace *ns) } EXPORT_SYMBOL(ldlm_namespace_get); +/* This is only for callers that care about refcount */ +int ldlm_namespace_get_return(struct ldlm_namespace *ns) +{ + return atomic_inc_return(&ns->ns_bref); +} + void ldlm_namespace_put(struct ldlm_namespace *ns) { if (atomic_dec_and_lock(&ns->ns_bref, &ns->ns_lock)) { @@ -967,8 +969,8 @@ void ldlm_namespace_register(struct ldlm_namespace *ns, ldlm_side_t client) { mutex_lock(ldlm_namespace_lock(client)); LASSERT(list_empty(&ns->ns_list_chain)); - list_add(&ns->ns_list_chain, ldlm_namespace_list(client)); - atomic_inc(ldlm_namespace_nr(client)); + list_add(&ns->ns_list_chain, ldlm_namespace_inactive_list(client)); + ldlm_namespace_nr_inc(client); mutex_unlock(ldlm_namespace_lock(client)); } @@ -981,12 +983,13 @@ void ldlm_namespace_unregister(struct ldlm_namespace *ns, ldlm_side_t client) * using list_empty(&ns->ns_list_chain). This is why it is * important to use list_del_init() here. */ list_del_init(&ns->ns_list_chain); - atomic_dec(ldlm_namespace_nr(client)); + ldlm_namespace_nr_dec(client); mutex_unlock(ldlm_namespace_lock(client)); } /** Should be called with ldlm_namespace_lock(client) taken. */ -void ldlm_namespace_move_locked(struct ldlm_namespace *ns, ldlm_side_t client) +void ldlm_namespace_move_to_active_locked(struct ldlm_namespace *ns, + ldlm_side_t client) { LASSERT(!list_empty(&ns->ns_list_chain)); LASSERT(mutex_is_locked(ldlm_namespace_lock(client))); @@ -994,6 +997,16 @@ void ldlm_namespace_move_locked(struct ldlm_namespace *ns, ldlm_side_t client) } /** Should be called with ldlm_namespace_lock(client) taken. */ +void ldlm_namespace_move_to_inactive_locked(struct ldlm_namespace *ns, + ldlm_side_t client) +{ + LASSERT(!list_empty(&ns->ns_list_chain)); + LASSERT(mutex_is_locked(ldlm_namespace_lock(client))); + list_move_tail(&ns->ns_list_chain, + ldlm_namespace_inactive_list(client)); +} + +/** Should be called with ldlm_namespace_lock(client) taken. */ struct ldlm_namespace *ldlm_namespace_first_locked(ldlm_side_t client) { LASSERT(mutex_is_locked(ldlm_namespace_lock(client))); @@ -1049,6 +1062,7 @@ ldlm_resource_get(struct ldlm_namespace *ns, struct ldlm_resource *parent, struct ldlm_resource *res; cfs_hash_bd_t bd; __u64 version; + int ns_refcount = 0; LASSERT(ns != NULL); LASSERT(parent == NULL); @@ -1119,7 +1133,7 @@ ldlm_resource_get(struct ldlm_namespace *ns, struct ldlm_resource *parent, /* We won! Let's add the resource. */ cfs_hash_bd_add_locked(ns->ns_rs_hash, &bd, &res->lr_hash); if (cfs_hash_bd_count_get(&bd) == 1) - ldlm_namespace_get(ns); + ns_refcount = ldlm_namespace_get_return(ns); cfs_hash_bd_unlock(ns->ns_rs_hash, &bd, 1); if (ns->ns_lvbo && ns->ns_lvbo->lvbo_init) { @@ -1128,8 +1142,9 @@ ldlm_resource_get(struct ldlm_namespace *ns, struct ldlm_resource *parent, OBD_FAIL_TIMEOUT(OBD_FAIL_LDLM_CREATE_RESOURCE, 2); rc = ns->ns_lvbo->lvbo_init(res); if (rc < 0) { - CERROR("lvbo_init failed for resource " - LPU64": rc %d\n", name->name[0], rc); + CERROR("%s: lvbo_init failed for resource "LPX64":" + LPX64": rc = %d\n", ns->ns_obd->obd_name, + name->name[0], name->name[1], rc); if (res->lr_lvb_data) { OBD_FREE(res->lr_lvb_data, res->lr_lvb_len); res->lr_lvb_data = NULL; @@ -1144,6 +1159,16 @@ ldlm_resource_get(struct ldlm_namespace *ns, struct ldlm_resource *parent, /* We create resource with locked lr_lvb_mutex. */ mutex_unlock(&res->lr_lvb_mutex); + /* Let's see if we happened to be the very first resource in this + * namespace. If so, and this is a client namespace, we need to move + * the namespace into the active namespaces list to be patrolled by + * the ldlm_poold. */ + if (ns_is_client(ns) && ns_refcount == 1) { + mutex_lock(ldlm_namespace_lock(LDLM_NAMESPACE_CLIENT)); + ldlm_namespace_move_to_active_locked(ns, LDLM_NAMESPACE_CLIENT); + mutex_unlock(ldlm_namespace_lock(LDLM_NAMESPACE_CLIENT)); + } + return res; } EXPORT_SYMBOL(ldlm_resource_get); @@ -1249,7 +1274,7 @@ void ldlm_resource_add_lock(struct ldlm_resource *res, struct list_head *head, LDLM_DEBUG(lock, "About to add this lock:\n"); - if (lock->l_destroyed) { + if (lock->l_flags & LDLM_FL_DESTROYED) { CDEBUG(D_OTHER, "Lock destroyed, not adding to resource\n"); return; } @@ -1274,7 +1299,7 @@ void ldlm_resource_insert_lock_after(struct ldlm_lock *original, ldlm_resource_dump(D_INFO, res); LDLM_DEBUG(new, "About to insert this lock after %p:\n", original); - if (new->l_destroyed) { + if (new->l_flags & LDLM_FL_DESTROYED) { CDEBUG(D_OTHER, "Lock destroyed, not adding to resource\n"); goto out; } |