Whamcloud - gitweb
git://git.whamcloud.com
/
fs
/
lustre-release.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
LU-1330 md: fix lu_ucred.c boilerplate
[fs/lustre-release.git]
/
lustre
/
lov
/
lov_pool.c
diff --git
a/lustre/lov/lov_pool.c
b/lustre/lov/lov_pool.c
index
2b320de
..
2c6f1e8
100644
(file)
--- a/
lustre/lov/lov_pool.c
+++ b/
lustre/lov/lov_pool.c
@@
-1,6
+1,4
@@
-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
+/*
* GPL HEADER START
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* GPL HEADER START
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
@@
-28,6
+26,8
@@
/*
* Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
/*
* Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright (c) 2012, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
*/
/*
* This file is part of Lustre, http://www.lustre.org/
@@
-53,6
+53,9
@@
#include <obd.h>
#include "lov_internal.h"
#include <obd.h>
#include "lov_internal.h"
+#define pool_tgt(_p, _i) \
+ _p->pool_lobd->u.lov.lov_tgts[_p->pool_obds.op_array[_i]]
+
static void lov_pool_getref(struct pool_desc *pool)
{
CDEBUG(D_INFO, "pool %p\n", pool);
static void lov_pool_getref(struct pool_desc *pool)
{
CDEBUG(D_INFO, "pool %p\n", pool);
@@
-73,6
+76,13
@@
void lov_pool_putref(struct pool_desc *pool)
}
}
}
}
+void lov_pool_putref_locked(struct pool_desc *pool)
+{
+ CDEBUG(D_INFO, "pool %p\n", pool);
+ LASSERT(cfs_atomic_read(&pool->pool_refcount) > 1);
+
+ cfs_atomic_dec(&pool->pool_refcount);
+}
/*
* hash function using a Rotating Hash algorithm
/*
* hash function using a Rotating Hash algorithm
@@
-81,7
+91,7
@@
void lov_pool_putref(struct pool_desc *pool)
* Chapter 6.4.
* Addison Wesley, 1973
*/
* Chapter 6.4.
* Addison Wesley, 1973
*/
-static __u32 pool_hashfn(cfs_hash_t *hash_body, void *key, unsigned mask)
+static __u32 pool_hashfn(cfs_hash_t *hash_body,
const
void *key, unsigned mask)
{
int i;
__u32 result;
{
int i;
__u32 result;
@@
-105,42
+115,46
@@
static void *pool_key(cfs_hlist_node_t *hnode)
return (pool->pool_name);
}
return (pool->pool_name);
}
-static int pool_hashkey_
compare(
void *key, cfs_hlist_node_t *compared_hnode)
+static int pool_hashkey_
keycmp(const
void *key, cfs_hlist_node_t *compared_hnode)
{
char *pool_name;
struct pool_desc *pool;
{
char *pool_name;
struct pool_desc *pool;
- int rc;
pool_name = (char *)key;
pool = cfs_hlist_entry(compared_hnode, struct pool_desc, pool_hash);
pool_name = (char *)key;
pool = cfs_hlist_entry(compared_hnode, struct pool_desc, pool_hash);
- rc = strncmp(pool_name, pool->pool_name, LOV_MAXPOOLNAME);
- return (!rc);
+ return !strncmp(pool_name, pool->pool_name, LOV_MAXPOOLNAME);
+}
+
+static void *pool_hashobject(cfs_hlist_node_t *hnode)
+{
+ return cfs_hlist_entry(hnode, struct pool_desc, pool_hash);
}
}
-static void
*pool_hashrefcount_get(
cfs_hlist_node_t *hnode)
+static void
pool_hashrefcount_get(cfs_hash_t *hs,
cfs_hlist_node_t *hnode)
{
struct pool_desc *pool;
pool = cfs_hlist_entry(hnode, struct pool_desc, pool_hash);
lov_pool_getref(pool);
{
struct pool_desc *pool;
pool = cfs_hlist_entry(hnode, struct pool_desc, pool_hash);
lov_pool_getref(pool);
- return (pool);
}
}
-static void *pool_hashrefcount_put(cfs_hlist_node_t *hnode)
+static void pool_hashrefcount_put_locked(cfs_hash_t *hs,
+ cfs_hlist_node_t *hnode)
{
struct pool_desc *pool;
pool = cfs_hlist_entry(hnode, struct pool_desc, pool_hash);
{
struct pool_desc *pool;
pool = cfs_hlist_entry(hnode, struct pool_desc, pool_hash);
- lov_pool_putref(pool);
- return (pool);
+ lov_pool_putref_locked(pool);
}
cfs_hash_ops_t pool_hash_operations = {
.hs_hash = pool_hashfn,
.hs_key = pool_key,
}
cfs_hash_ops_t pool_hash_operations = {
.hs_hash = pool_hashfn,
.hs_key = pool_key,
- .hs_compare = pool_hashkey_compare,
+ .hs_keycmp = pool_hashkey_keycmp,
+ .hs_object = pool_hashobject,
.hs_get = pool_hashrefcount_get,
.hs_get = pool_hashrefcount_get,
- .hs_put = pool_hashrefcount_put,
+ .hs_put_locked = pool_hashrefcount_put_locked,
+
};
#ifdef LPROCFS
};
#ifdef LPROCFS
@@
-174,14
+188,14
@@
static void *pool_proc_next(struct seq_file *s, void *v, loff_t *pos)
/* iterate to find a non empty entry */
prev_idx = iter->idx;
/* iterate to find a non empty entry */
prev_idx = iter->idx;
-
cfs_
down_read(&pool_tgt_rw_sem(iter->pool));
+ down_read(&pool_tgt_rw_sem(iter->pool));
iter->idx++;
if (iter->idx == pool_tgt_count(iter->pool)) {
iter->idx = prev_idx; /* we stay on the last entry */
iter->idx++;
if (iter->idx == pool_tgt_count(iter->pool)) {
iter->idx = prev_idx; /* we stay on the last entry */
-
cfs_
up_read(&pool_tgt_rw_sem(iter->pool));
+ up_read(&pool_tgt_rw_sem(iter->pool));
return NULL;
}
return NULL;
}
-
cfs_
up_read(&pool_tgt_rw_sem(iter->pool));
+ up_read(&pool_tgt_rw_sem(iter->pool));
(*pos)++;
/* return != NULL to continue */
return iter;
(*pos)++;
/* return != NULL to continue */
return iter;
@@
-251,9
+265,9
@@
static int pool_proc_show(struct seq_file *s, void *v)
LASSERT(iter->pool != NULL);
LASSERT(iter->idx <= pool_tgt_count(iter->pool));
LASSERT(iter->pool != NULL);
LASSERT(iter->idx <= pool_tgt_count(iter->pool));
-
cfs_
down_read(&pool_tgt_rw_sem(iter->pool));
+ down_read(&pool_tgt_rw_sem(iter->pool));
tgt = pool_tgt(iter->pool, iter->idx);
tgt = pool_tgt(iter->pool, iter->idx);
-
cfs_
up_read(&pool_tgt_rw_sem(iter->pool));
+ up_read(&pool_tgt_rw_sem(iter->pool));
if (tgt)
seq_printf(s, "%s\n", obd_uuid2str(&(tgt->ltd_uuid)));
if (tgt)
seq_printf(s, "%s\n", obd_uuid2str(&(tgt->ltd_uuid)));
@@
-295,7
+309,7
@@
void lov_dump_pool(int level, struct pool_desc *pool)
CDEBUG(level, "pool "LOV_POOLNAMEF" has %d members\n",
pool->pool_name, pool->pool_obds.op_count);
CDEBUG(level, "pool "LOV_POOLNAMEF" has %d members\n",
pool->pool_name, pool->pool_obds.op_count);
-
cfs_
down_read(&pool_tgt_rw_sem(pool));
+ down_read(&pool_tgt_rw_sem(pool));
for (i = 0; i < pool_tgt_count(pool) ; i++) {
if (!pool_tgt(pool, i) || !(pool_tgt(pool, i))->ltd_exp)
for (i = 0; i < pool_tgt_count(pool) ; i++) {
if (!pool_tgt(pool, i) || !(pool_tgt(pool, i))->ltd_exp)
@@
-305,7
+319,7
@@
void lov_dump_pool(int level, struct pool_desc *pool)
obd_uuid2str(&((pool_tgt(pool, i))->ltd_uuid)));
}
obd_uuid2str(&((pool_tgt(pool, i))->ltd_uuid)));
}
-
cfs_
up_read(&pool_tgt_rw_sem(pool));
+ up_read(&pool_tgt_rw_sem(pool));
lov_pool_putref(pool);
}
lov_pool_putref(pool);
}
@@
-318,7
+332,7
@@
int lov_ost_pool_init(struct ost_pool *op, unsigned int count)
count = LOV_POOL_INIT_COUNT;
op->op_array = NULL;
op->op_count = 0;
count = LOV_POOL_INIT_COUNT;
op->op_array = NULL;
op->op_count = 0;
-
cfs_
init_rwsem(&op->op_rw_sem);
+ init_rwsem(&op->op_rw_sem);
op->op_size = count;
OBD_ALLOC(op->op_array, op->op_size * sizeof(op->op_array[0]));
if (op->op_array == NULL) {
op->op_size = count;
OBD_ALLOC(op->op_array, op->op_size * sizeof(op->op_array[0]));
if (op->op_array == NULL) {
@@
-358,7
+372,7
@@
int lov_ost_pool_add(struct ost_pool *op, __u32 idx, unsigned int min_count)
int rc = 0, i;
ENTRY;
int rc = 0, i;
ENTRY;
-
cfs_
down_write(&op->op_rw_sem);
+ down_write(&op->op_rw_sem);
rc = lov_ost_pool_extend(op, min_count);
if (rc)
rc = lov_ost_pool_extend(op, min_count);
if (rc)
@@
-374,7
+388,7
@@
int lov_ost_pool_add(struct ost_pool *op, __u32 idx, unsigned int min_count)
op->op_count++;
EXIT;
out:
op->op_count++;
EXIT;
out:
-
cfs_
up_write(&op->op_rw_sem);
+ up_write(&op->op_rw_sem);
return rc;
}
return rc;
}
@@
-383,20
+397,20
@@
int lov_ost_pool_remove(struct ost_pool *op, __u32 idx)
int i;
ENTRY;
int i;
ENTRY;
-
cfs_
down_write(&op->op_rw_sem);
+ down_write(&op->op_rw_sem);
for (i = 0; i < op->op_count; i++) {
if (op->op_array[i] == idx) {
memmove(&op->op_array[i], &op->op_array[i + 1],
(op->op_count - i - 1) * sizeof(op->op_array[0]));
op->op_count--;
for (i = 0; i < op->op_count; i++) {
if (op->op_array[i] == idx) {
memmove(&op->op_array[i], &op->op_array[i + 1],
(op->op_count - i - 1) * sizeof(op->op_array[0]));
op->op_count--;
-
cfs_
up_write(&op->op_rw_sem);
+ up_write(&op->op_rw_sem);
EXIT;
return 0;
}
}
EXIT;
return 0;
}
}
-
cfs_
up_write(&op->op_rw_sem);
+ up_write(&op->op_rw_sem);
RETURN(-EINVAL);
}
RETURN(-EINVAL);
}
@@
-407,14
+421,14
@@
int lov_ost_pool_free(struct ost_pool *op)
if (op->op_size == 0)
RETURN(0);
if (op->op_size == 0)
RETURN(0);
-
cfs_
down_write(&op->op_rw_sem);
+ down_write(&op->op_rw_sem);
OBD_FREE(op->op_array, op->op_size * sizeof(op->op_array[0]));
op->op_array = NULL;
op->op_count = 0;
op->op_size = 0;
OBD_FREE(op->op_array, op->op_size * sizeof(op->op_array[0]));
op->op_array = NULL;
op->op_count = 0;
op->op_size = 0;
-
cfs_
up_write(&op->op_rw_sem);
+ up_write(&op->op_rw_sem);
RETURN(0);
}
RETURN(0);
}
@@
-437,7
+451,7
@@
int lov_pool_new(struct obd_device *obd, char *poolname)
strncpy(new_pool->pool_name, poolname, LOV_MAXPOOLNAME);
new_pool->pool_name[LOV_MAXPOOLNAME] = '\0';
strncpy(new_pool->pool_name, poolname, LOV_MAXPOOLNAME);
new_pool->pool_name[LOV_MAXPOOLNAME] = '\0';
-
new_pool->pool_lov = lov
;
+
new_pool->pool_lobd = obd
;
/* ref count init to 1 because when created a pool is always used
* up to deletion
*/
/* ref count init to 1 because when created a pool is always used
* up to deletion
*/
@@
-469,10
+483,10
@@
int lov_pool_new(struct obd_device *obd, char *poolname)
CDEBUG(D_INFO, "pool %p - proc %p\n", new_pool, new_pool->pool_proc_entry);
#endif
CDEBUG(D_INFO, "pool %p - proc %p\n", new_pool, new_pool->pool_proc_entry);
#endif
-
cfs_
spin_lock(&obd->obd_dev_lock);
-
cfs_list_add_tail(&new_pool->pool_list, &lov->lov_pool_list);
-
lov->lov_pool_count++;
-
cfs_
spin_unlock(&obd->obd_dev_lock);
+ spin_lock(&obd->obd_dev_lock);
+ cfs_list_add_tail(&new_pool->pool_list, &lov->lov_pool_list);
+ lov->lov_pool_count++;
+ spin_unlock(&obd->obd_dev_lock);
/* add to find only when it fully ready */
rc = cfs_hash_add_unique(lov->lov_pools_hash_body, poolname,
/* add to find only when it fully ready */
rc = cfs_hash_add_unique(lov->lov_pools_hash_body, poolname,
@@
-486,10
+500,10
@@
int lov_pool_new(struct obd_device *obd, char *poolname)
RETURN(0);
out_err:
RETURN(0);
out_err:
-
cfs_
spin_lock(&obd->obd_dev_lock);
-
cfs_list_del_init(&new_pool->pool_list);
-
lov->lov_pool_count--;
-
cfs_
spin_unlock(&obd->obd_dev_lock);
+ spin_lock(&obd->obd_dev_lock);
+ cfs_list_del_init(&new_pool->pool_list);
+ lov->lov_pool_count--;
+ spin_unlock(&obd->obd_dev_lock);
lprocfs_remove(&new_pool->pool_proc_entry);
lprocfs_remove(&new_pool->pool_proc_entry);
@@
-519,15
+533,15
@@
int lov_pool_del(struct obd_device *obd, char *poolname)
lov_pool_putref(pool);
}
lov_pool_putref(pool);
}
-
cfs_
spin_lock(&obd->obd_dev_lock);
-
cfs_list_del_init(&pool->pool_list);
-
lov->lov_pool_count--;
-
cfs_
spin_unlock(&obd->obd_dev_lock);
+ spin_lock(&obd->obd_dev_lock);
+ cfs_list_del_init(&pool->pool_list);
+ lov->lov_pool_count--;
+ spin_unlock(&obd->obd_dev_lock);
-
/* release last reference */
-
lov_pool_putref(pool);
+ /* release last reference */
+ lov_pool_putref(pool);
-
RETURN(0);
+ RETURN(0);
}
}
@@
-635,7
+649,7
@@
int lov_check_index_in_pool(__u32 idx, struct pool_desc *pool)
*/
lov_pool_getref(pool);
*/
lov_pool_getref(pool);
-
cfs_
down_read(&pool_tgt_rw_sem(pool));
+ down_read(&pool_tgt_rw_sem(pool));
for (i = 0; i < pool_tgt_count(pool); i++) {
if (pool_tgt_array(pool)[i] == idx)
for (i = 0; i < pool_tgt_count(pool); i++) {
if (pool_tgt_array(pool)[i] == idx)
@@
-644,7
+658,7
@@
int lov_check_index_in_pool(__u32 idx, struct pool_desc *pool)
rc = -ENOENT;
EXIT;
out:
rc = -ENOENT;
EXIT;
out:
-
cfs_
up_read(&pool_tgt_rw_sem(pool));
+ up_read(&pool_tgt_rw_sem(pool));
lov_pool_putref(pool);
return rc;
lov_pool_putref(pool);
return rc;