Whamcloud - gitweb
LU-5162 mdc: Add exception entry check for radix_tree
[fs/lustre-release.git] / lustre / lod / lod_pool.c
index c9d4901..c8959a0 100644 (file)
@@ -26,6 +26,8 @@
 /*
  * Copyright  2008 Sun Microsystems, Inc. All rights reserved
  * Use is subject to license terms.
+ *
+ * Copyright (c) 2012, 2013, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -72,9 +74,9 @@ void lod_pool_putref(struct pool_desc *pool)
 void lod_pool_putref_locked(struct pool_desc *pool)
 {
        CDEBUG(D_INFO, "pool %p\n", pool);
-       LASSERT(cfs_atomic_read(&pool->pool_refcount) > 1);
+       LASSERT(atomic_read(&pool->pool_refcount) > 1);
 
-       cfs_atomic_dec(&pool->pool_refcount);
+       atomic_dec(&pool->pool_refcount);
 }
 
 
@@ -162,33 +164,33 @@ cfs_hash_ops_t pool_hash_operations = {
  * pos is from 0 to (pool->pool_obds.op_count - 1)
  */
 #define POOL_IT_MAGIC 0xB001CEA0
-struct pool_iterator {
-       int magic;
-       struct pool_desc *pool;
-       int idx;        /* from 0 to pool_tgt_size - 1 */
+struct lod_pool_iterator {
+       int               lpi_magic;
+       int               lpi_idx;      /* from 0 to pool_tgt_size - 1 */
+       struct pool_desc *lpi_pool;
 };
 
 static void *pool_proc_next(struct seq_file *s, void *v, loff_t *pos)
 {
-       struct pool_iterator *iter = (struct pool_iterator *)s->private;
+       struct lod_pool_iterator *iter = s->private;
        int prev_idx;
 
-       LASSERTF(iter->magic == POOL_IT_MAGIC, "%08X", iter->magic);
+       LASSERTF(iter->lpi_magic == POOL_IT_MAGIC, "%08X", iter->lpi_magic);
 
        /* test if end of file */
-       if (*pos >= pool_tgt_count(iter->pool))
+       if (*pos >= pool_tgt_count(iter->lpi_pool))
                return NULL;
 
        /* iterate to find a non empty entry */
-       prev_idx = iter->idx;
-       cfs_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 */
-               cfs_up_read(&pool_tgt_rw_sem(iter->pool));
+       prev_idx = iter->lpi_idx;
+       down_read(&pool_tgt_rw_sem(iter->lpi_pool));
+       iter->lpi_idx++;
+       if (iter->lpi_idx == pool_tgt_count(iter->lpi_pool)) {
+               iter->lpi_idx = prev_idx; /* we stay on the last entry */
+               up_read(&pool_tgt_rw_sem(iter->lpi_pool));
                return NULL;
        }
-       cfs_up_read(&pool_tgt_rw_sem(iter->pool));
+       up_read(&pool_tgt_rw_sem(iter->lpi_pool));
        (*pos)++;
        /* return != NULL to continue */
        return iter;
@@ -196,8 +198,8 @@ static void *pool_proc_next(struct seq_file *s, void *v, loff_t *pos)
 
 static void *pool_proc_start(struct seq_file *s, loff_t *pos)
 {
-       struct pool_desc *pool = (struct pool_desc *)s->private;
-       struct pool_iterator *iter;
+       struct pool_desc *pool = s->private;
+       struct lod_pool_iterator *iter;
 
        lod_pool_getref(pool);
        if ((pool_tgt_count(pool) == 0) ||
@@ -211,9 +213,9 @@ static void *pool_proc_start(struct seq_file *s, loff_t *pos)
        OBD_ALLOC_PTR(iter);
        if (!iter)
                return ERR_PTR(-ENOMEM);
-       iter->magic = POOL_IT_MAGIC;
-       iter->pool = pool;
-       iter->idx = 0;
+       iter->lpi_magic = POOL_IT_MAGIC;
+       iter->lpi_pool = pool;
+       iter->lpi_idx = 0;
 
        /* we use seq_file private field to memorized iterator so
         * we can free it at stop() */
@@ -234,16 +236,16 @@ static void *pool_proc_start(struct seq_file *s, loff_t *pos)
 
 static void pool_proc_stop(struct seq_file *s, void *v)
 {
-       struct pool_iterator *iter = (struct pool_iterator *)s->private;
+       struct lod_pool_iterator *iter = s->private;
 
        /* in some cases stop() method is called 2 times, without
         * calling start() method (see seq_read() from fs/seq_file.c)
         * we have to free only if s->private is an iterator */
-       if ((iter) && (iter->magic == POOL_IT_MAGIC)) {
+       if (iter != NULL && (iter->lpi_magic == POOL_IT_MAGIC)) {
                /* we restore s->private so next call to pool_proc_start()
                 * will work */
-               s->private = iter->pool;
-               lod_pool_putref(iter->pool);
+               s->private = iter->lpi_pool;
+               lod_pool_putref(iter->lpi_pool);
                OBD_FREE_PTR(iter);
        }
        return;
@@ -251,16 +253,16 @@ static void pool_proc_stop(struct seq_file *s, void *v)
 
 static int pool_proc_show(struct seq_file *s, void *v)
 {
-       struct pool_iterator *iter = (struct pool_iterator *)v;
-       struct lod_ost_desc  *osc_desc;
+       struct lod_pool_iterator *iter = v;
+       struct lod_tgt_desc  *osc_desc;
 
-       LASSERTF(iter->magic == POOL_IT_MAGIC, "%08X", iter->magic);
-       LASSERT(iter->pool != NULL);
-       LASSERT(iter->idx <= pool_tgt_count(iter->pool));
+       LASSERTF(iter->lpi_magic == POOL_IT_MAGIC, "%08X", iter->lpi_magic);
+       LASSERT(iter->lpi_pool != NULL);
+       LASSERT(iter->lpi_idx <= pool_tgt_count(iter->lpi_pool));
 
-       cfs_down_read(&pool_tgt_rw_sem(iter->pool));
-       osc_desc = pool_tgt(iter->pool, iter->idx);
-       cfs_up_read(&pool_tgt_rw_sem(iter->pool));
+       down_read(&pool_tgt_rw_sem(iter->lpi_pool));
+       osc_desc = pool_tgt(iter->lpi_pool, iter->lpi_idx);
+       up_read(&pool_tgt_rw_sem(iter->lpi_pool));
        if (osc_desc)
                seq_printf(s, "%s\n", obd_uuid2str(&(osc_desc->ltd_uuid)));
 
@@ -281,7 +283,7 @@ static int pool_proc_open(struct inode *inode, struct file *file)
        rc = seq_open(file, &pool_proc_ops);
        if (!rc) {
                struct seq_file *s = file->private_data;
-               s->private = PROC_I(inode)->pde->data;
+               s->private = PDE_DATA(inode);
        }
        return rc;
 }
@@ -302,7 +304,7 @@ void lod_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);
-       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)
@@ -312,7 +314,7 @@ void lod_dump_pool(int level, struct pool_desc *pool)
                       obd_uuid2str(&((pool_tgt(pool, i))->ltd_uuid)));
        }
 
-       cfs_up_read(&pool_tgt_rw_sem(pool));
+       up_read(&pool_tgt_rw_sem(pool));
        lod_pool_putref(pool);
 }
 
@@ -325,7 +327,7 @@ int lod_ost_pool_init(struct ost_pool *op, unsigned int count)
                count = LOD_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) {
@@ -365,7 +367,7 @@ int lod_ost_pool_add(struct ost_pool *op, __u32 idx, unsigned int min_count)
        int rc = 0, i;
        ENTRY;
 
-       cfs_down_write(&op->op_rw_sem);
+       down_write(&op->op_rw_sem);
 
        rc = lod_ost_pool_extend(op, min_count);
        if (rc)
@@ -381,7 +383,7 @@ int lod_ost_pool_add(struct ost_pool *op, __u32 idx, unsigned int min_count)
        op->op_count++;
        EXIT;
 out:
-       cfs_up_write(&op->op_rw_sem);
+       up_write(&op->op_rw_sem);
        return rc;
 }
 
@@ -390,20 +392,20 @@ int lod_ost_pool_remove(struct ost_pool *op, __u32 idx)
        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--;
-                       cfs_up_write(&op->op_rw_sem);
+                       up_write(&op->op_rw_sem);
                        EXIT;
                        return 0;
                }
        }
 
-       cfs_up_write(&op->op_rw_sem);
+       up_write(&op->op_rw_sem);
        RETURN(-EINVAL);
 }
 
@@ -414,14 +416,14 @@ int lod_ost_pool_free(struct ost_pool *op)
        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;
 
-       cfs_up_write(&op->op_rw_sem);
+       up_write(&op->op_rw_sem);
        RETURN(0);
 }
 
@@ -450,7 +452,7 @@ int lod_pool_new(struct obd_device *obd, char *poolname)
        if (rc)
                GOTO(out_err, rc);
 
-       memset(&(new_pool->pool_rr), 0, sizeof(struct lov_qos_rr));
+       memset(&new_pool->pool_rr, 0, sizeof(new_pool->pool_rr));
        rc = lod_ost_pool_init(&new_pool->pool_rr.lqr_pool, 0);
        if (rc)
                GOTO(out_free_pool_obds, rc);
@@ -460,21 +462,26 @@ int lod_pool_new(struct obd_device *obd, char *poolname)
 #ifdef LPROCFS
        lod_pool_getref(new_pool);
        new_pool->pool_proc_entry = lprocfs_add_simple(lod->lod_pool_proc_entry,
-                                                      poolname, NULL, NULL,
+                                                      poolname,
+#ifndef HAVE_ONLY_PROCFS_SEQ
+                                                      NULL, NULL,
+#endif
                                                       new_pool,
                                                       &pool_proc_operations);
        if (IS_ERR(new_pool->pool_proc_entry)) {
-               CWARN("Cannot add proc pool entry "LOV_POOLNAMEF"\n", poolname);
+               CDEBUG(D_CONFIG, "%s: cannot add proc entry "LOV_POOLNAMEF"\n",
+                      obd->obd_name, poolname);
                new_pool->pool_proc_entry = NULL;
                lod_pool_putref(new_pool);
        }
-       CDEBUG(D_INFO, "pool %p - proc %p\n", new_pool, new_pool->pool_proc_entry);
+       CDEBUG(D_INFO, "pool %p - proc %p\n", new_pool,
+              new_pool->pool_proc_entry);
 #endif
 
-       cfs_spin_lock(&obd->obd_dev_lock);
+       spin_lock(&obd->obd_dev_lock);
        cfs_list_add_tail(&new_pool->pool_list, &lod->lod_pool_list);
        lod->lod_pool_count++;
-       cfs_spin_unlock(&obd->obd_dev_lock);
+       spin_unlock(&obd->obd_dev_lock);
 
        /* add to find only when it fully ready  */
        rc = cfs_hash_add_unique(lod->lod_pools_hash_body, poolname,
@@ -488,10 +495,10 @@ int lod_pool_new(struct obd_device *obd, char *poolname)
        RETURN(0);
 
 out_err:
-       cfs_spin_lock(&obd->obd_dev_lock);
+       spin_lock(&obd->obd_dev_lock);
        cfs_list_del_init(&new_pool->pool_list);
        lod->lod_pool_count--;
-       cfs_spin_unlock(&obd->obd_dev_lock);
+       spin_unlock(&obd->obd_dev_lock);
 
        lprocfs_remove(&new_pool->pool_proc_entry);
 
@@ -519,10 +526,10 @@ int lod_pool_del(struct obd_device *obd, char *poolname)
                lod_pool_putref(pool);
        }
 
-       cfs_spin_lock(&obd->obd_dev_lock);
+       spin_lock(&obd->obd_dev_lock);
        cfs_list_del_init(&pool->pool_list);
        lod->lod_pool_count--;
-       cfs_spin_unlock(&obd->obd_dev_lock);
+       spin_unlock(&obd->obd_dev_lock);
 
        /* release last reference */
        lod_pool_putref(pool);
@@ -547,7 +554,7 @@ int lod_pool_add(struct obd_device *obd, char *poolname, char *ostname)
        obd_str2uuid(&ost_uuid, ostname);
 
        /* search ost in lod array */
-       lod_getref(lod);
+       lod_getref(&lod->lod_ost_descs);
        lod_foreach_ost(lod, idx) {
                if (obd_uuid_equals(&ost_uuid, &OST_TGT(lod, idx)->ltd_uuid)) {
                        rc = 0;
@@ -569,7 +576,7 @@ int lod_pool_add(struct obd_device *obd, char *poolname, char *ostname)
 
        EXIT;
 out:
-       lod_putref(lod);
+       lod_putref(lod, &lod->lod_ost_descs);
        lod_pool_putref(pool);
        return rc;
 }
@@ -589,7 +596,7 @@ int lod_pool_remove(struct obd_device *obd, char *poolname, char *ostname)
 
        obd_str2uuid(&ost_uuid, ostname);
 
-       lod_getref(lod);
+       lod_getref(&lod->lod_ost_descs);
        /* search ost in lod array, to get index */
        cfs_foreach_bit(lod->lod_ost_bitmap, idx) {
                if (obd_uuid_equals(&ost_uuid, &OST_TGT(lod, idx)->ltd_uuid)) {
@@ -611,7 +618,7 @@ int lod_pool_remove(struct obd_device *obd, char *poolname, char *ostname)
 
        EXIT;
 out:
-       lod_putref(lod);
+       lod_putref(lod, &lod->lod_ost_descs);
        lod_pool_putref(pool);
        return rc;
 }
@@ -627,7 +634,7 @@ int lod_check_index_in_pool(__u32 idx, struct pool_desc *pool)
         */
        lod_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)
@@ -636,7 +643,7 @@ int lod_check_index_in_pool(__u32 idx, struct pool_desc *pool)
        rc = -ENOENT;
        EXIT;
 out:
-       cfs_up_read(&pool_tgt_rw_sem(pool));
+       up_read(&pool_tgt_rw_sem(pool));
 
        lod_pool_putref(pool);
        return rc;
@@ -650,11 +657,13 @@ struct pool_desc *lod_find_pool(struct lod_device *lod, char *poolname)
        if (poolname[0] != '\0') {
                pool = cfs_hash_lookup(lod->lod_pools_hash_body, poolname);
                if (pool == NULL)
-                       CWARN("Request for an unknown pool ("LOV_POOLNAMEF")\n",
-                             poolname);
-               if ((pool != NULL) && (pool_tgt_count(pool) == 0)) {
-                       CWARN("Request for an empty pool ("LOV_POOLNAMEF")\n",
-                             poolname);
+                       CDEBUG(D_CONFIG, "%s: request for an unknown pool ("
+                              LOV_POOLNAMEF")\n",
+                              lod->lod_child_exp->exp_obd->obd_name, poolname);
+               if (pool != NULL && pool_tgt_count(pool) == 0) {
+                       CDEBUG(D_CONFIG, "%s: request for an empty pool ("
+                              LOV_POOLNAMEF")\n",
+                              lod->lod_child_exp->exp_obd->obd_name, poolname);
                        /* pool is ignored, so we remove ref on it */
                        lod_pool_putref(pool);
                        pool = NULL;