Whamcloud - gitweb
LU-9859 lod: use linux kernel bitmap API
[fs/lustre-release.git] / lustre / lod / lod_qos.c
index 644ced9..f4a7783 100644 (file)
@@ -137,8 +137,8 @@ static int lod_statfs_and_check(const struct lu_env *env, struct lod_device *d,
 
                        LASSERT(desc->ld_active_tgt_count > 0);
                        desc->ld_active_tgt_count--;
-                       ltd->ltd_qos.lq_dirty = 1;
-                       ltd->ltd_qos.lq_rr.lqr_dirty = 1;
+                       set_bit(LQ_DIRTY, &ltd->ltd_qos.lq_flags);
+                       set_bit(LQ_DIRTY, &ltd->ltd_qos.lq_rr.lqr_flags);
                        CDEBUG(D_CONFIG, "%s: turns inactive\n",
                               tgt->ltd_exp->exp_obd->obd_name);
                }
@@ -153,8 +153,8 @@ static int lod_statfs_and_check(const struct lu_env *env, struct lod_device *d,
                        tgt->ltd_active = 1;
                        tgt->ltd_connecting = 0;
                        desc->ld_active_tgt_count++;
-                       ltd->ltd_qos.lq_dirty = 1;
-                       ltd->ltd_qos.lq_rr.lqr_dirty = 1;
+                       set_bit(LQ_DIRTY, &ltd->ltd_qos.lq_flags);
+                       set_bit(LQ_DIRTY, &ltd->ltd_qos.lq_rr.lqr_flags);
                        CDEBUG(D_CONFIG, "%s: turns active\n",
                               tgt->ltd_exp->exp_obd->obd_name);
                }
@@ -223,7 +223,7 @@ void lod_qos_statfs_update(const struct lu_env *env, struct lod_device *lod,
 
                if (tgt->ltd_statfs.os_bavail != avail)
                        /* recalculate weigths */
-                       ltd->ltd_qos.lq_dirty = 1;
+                       set_bit(LQ_DIRTY, &ltd->ltd_qos.lq_flags);
        }
        obd->obd_osfs_age = ktime_get_seconds();
 
@@ -262,7 +262,7 @@ static int lod_qos_calc_rr(struct lod_device *lod, struct lu_tgt_descs *ltd,
        int rc;
        ENTRY;
 
-       if (!lqr->lqr_dirty) {
+       if (!test_bit(LQ_DIRTY, &lqr->lqr_flags)) {
                LASSERT(lqr->lqr_pool.op_size);
                RETURN(0);
        }
@@ -274,7 +274,7 @@ static int lod_qos_calc_rr(struct lod_device *lod, struct lu_tgt_descs *ltd,
         * Check again. While we were sleeping on @lq_rw_sem something could
         * change.
         */
-       if (!lqr->lqr_dirty) {
+       if (!test_bit(LQ_DIRTY, &lqr->lqr_flags)) {
                LASSERT(lqr->lqr_pool.op_size);
                up_write(&ltd->ltd_qos.lq_rw_sem);
                RETURN(0);
@@ -323,7 +323,7 @@ static int lod_qos_calc_rr(struct lod_device *lod, struct lu_tgt_descs *ltd,
                }
        }
 
-       lqr->lqr_dirty = 0;
+       clear_bit(LQ_DIRTY, &lqr->lqr_flags);
        up_write(&ltd->ltd_qos.lq_rw_sem);
 
        if (placed != real_count) {
@@ -335,7 +335,7 @@ static int lod_qos_calc_rr(struct lod_device *lod, struct lu_tgt_descs *ltd,
                        LCONSOLE(D_WARNING, "rr #%d tgt idx=%d\n", i,
                                 lqr->lqr_pool.op_array[i]);
                }
-               lqr->lqr_dirty = 1;
+               set_bit(LQ_DIRTY, &lqr->lqr_flags);
                RETURN(-EAGAIN);
        }
 
@@ -607,7 +607,7 @@ static inline bool lod_should_avoid_ost(struct lod_object *lo,
                return false;
 
        /* if the OSS has been used, check whether the OST has been used */
-       if (!cfs_bitmap_check(lag->lag_ost_avoid_bitmap, index))
+       if (!test_bit(index, lag->lag_ost_avoid_bitmap))
                used = false;
        else
                QOS_DEBUG("OST%d: been used in conflicting mirror component\n",
@@ -1603,9 +1603,8 @@ static int lod_ost_alloc_qos(const struct lu_env *env, struct lod_object *lo,
                }
 
                /* makes sense to rebalance next time */
-               lod->lod_ost_descs.ltd_qos.lq_dirty = 1;
-               lod->lod_ost_descs.ltd_qos.lq_same_space = 0;
-
+               set_bit(LQ_DIRTY, &lod->lod_ost_descs.ltd_qos.lq_flags);
+               clear_bit(LQ_SAME_SPACE, &lod->lod_ost_descs.ltd_qos.lq_flags);
                rc = -EAGAIN;
        }
 
@@ -1824,8 +1823,8 @@ int lod_mdt_alloc_qos(const struct lu_env *env, struct lod_object *lo,
                }
 
                /* makes sense to rebalance next time */
-               ltd->ltd_qos.lq_dirty = 1;
-               ltd->ltd_qos.lq_same_space = 0;
+               set_bit(LQ_DIRTY, &ltd->ltd_qos.lq_flags);
+               clear_bit(LQ_SAME_SPACE, &ltd->ltd_qos.lq_flags);
 
                rc = -EAGAIN;
        } else {
@@ -1851,19 +1850,20 @@ unlock:
  *
  * \param[in] lod      LOD device
  * \param[in] lo       The lod_object
+ * \param[in] comp_idx The component id, which the amount of stripes is
+                       calculated for
  * \param[in] stripe_count     count the caller would like to use
  *
  * \retval             the maximum usable stripe count
  */
 __u16 lod_get_stripe_count(struct lod_device *lod, struct lod_object *lo,
-                          __u16 stripe_count, bool overstriping)
+                          int comp_idx, __u16 stripe_count, bool overstriping)
 {
        __u32 max_stripes = LOV_MAX_STRIPE_COUNT_OLD;
        /* max stripe count is based on OSD ea size */
        unsigned int easize = lod->lod_osd_max_easize;
        int i;
 
-
        if (!stripe_count)
                stripe_count =
                        lod->lod_ost_descs.ltd_lov_desc.ld_default_stripe_count;
@@ -1887,9 +1887,17 @@ __u16 lod_get_stripe_count(struct lod_device *lod, struct lod_object *lo,
                                lo->ldo_comp_cnt;
 
                for (i = 0; i < lo->ldo_comp_cnt; i++) {
+                       unsigned int stripes;
+
+                       if (i == comp_idx)
+                               continue;
+
                        lod_comp = &lo->ldo_comp_entries[i];
-                       comp_sz = lov_mds_md_size(lod_comp->llc_stripe_count,
-                                                 LOV_MAGIC_V3);
+                       /* Extension comp is never inited - 0 stripes on disk */
+                       stripes = lod_comp->llc_flags & LCME_FL_EXTENSION ? 0 :
+                               lod_comp->llc_stripe_count;
+
+                       comp_sz = lov_mds_md_size(stripes, LOV_MAGIC_V3);
                        total_comp_sz += comp_sz;
                        if (lod_comp->llc_flags & LCME_FL_INIT)
                                init_comp_sz += comp_sz;
@@ -2312,7 +2320,7 @@ int lod_prepare_avoidance(const struct lu_env *env, struct lod_object *lo)
 {
        struct lod_device *lod = lu2lod_dev(lo->ldo_obj.do_lu.lo_dev);
        struct lod_avoid_guide *lag = &lod_env_info(env)->lti_avoid;
-       struct cfs_bitmap *bitmap = NULL;
+       unsigned long *bitmap = NULL;
        __u32 *new_oss = NULL;
 
        lag->lag_ost_avail = lod->lod_ost_count;
@@ -2328,16 +2336,17 @@ int lod_prepare_avoidance(const struct lu_env *env, struct lod_object *lo)
 
        /* init OST avoid guide bitmap */
        if (lag->lag_ost_avoid_bitmap) {
-               if (lod->lod_ost_count <= lag->lag_ost_avoid_bitmap->size) {
-                       CFS_RESET_BITMAP(lag->lag_ost_avoid_bitmap);
+               if (lod->lod_ost_count <= lag->lag_ost_avoid_size) {
+                       bitmap_zero(lag->lag_ost_avoid_bitmap,
+                                   lag->lag_ost_avoid_size);
                } else {
-                       CFS_FREE_BITMAP(lag->lag_ost_avoid_bitmap);
+                       bitmap_free(lag->lag_ost_avoid_bitmap);
                        lag->lag_ost_avoid_bitmap = NULL;
                }
        }
 
        if (!lag->lag_ost_avoid_bitmap) {
-               bitmap = CFS_ALLOCATE_BITMAP(lod->lod_ost_count);
+               bitmap = bitmap_zalloc(lod->lod_ost_count, GFP_KERNEL);
                if (!bitmap)
                        return -ENOMEM;
        }
@@ -2351,7 +2360,7 @@ int lod_prepare_avoidance(const struct lu_env *env, struct lod_object *lo)
                 */
                OBD_ALLOC_PTR_ARRAY(new_oss, lod->lod_ost_count);
                if (!new_oss) {
-                       CFS_FREE_BITMAP(bitmap);
+                       bitmap_free(bitmap);
                        return -ENOMEM;
                }
        }
@@ -2360,8 +2369,10 @@ int lod_prepare_avoidance(const struct lu_env *env, struct lod_object *lo)
                lag->lag_oss_avoid_array = new_oss;
                lag->lag_oaa_size = lod->lod_ost_count;
        }
-       if (bitmap)
+       if (bitmap) {
                lag->lag_ost_avoid_bitmap = bitmap;
+               lag->lag_ost_avoid_size = lod->lod_ost_count;
+       }
 
        return 0;
 }
@@ -2375,7 +2386,7 @@ void lod_collect_avoidance(struct lod_object *lo, struct lod_avoid_guide *lag,
 {
        struct lod_device *lod = lu2lod_dev(lo->ldo_obj.do_lu.lo_dev);
        struct lod_layout_component *lod_comp = &lo->ldo_comp_entries[comp_idx];
-       struct cfs_bitmap *bitmap = lag->lag_ost_avoid_bitmap;
+       unsigned long *bitmap = lag->lag_ost_avoid_bitmap;
        int i, j;
 
        /* iterate mirrors */
@@ -2422,12 +2433,12 @@ void lod_collect_avoidance(struct lod_object *lo, struct lod_avoid_guide *lag,
                                ost = OST_TGT(lod, comp->llc_ost_indices[j]);
                                lsq = ost->ltd_qos.ltq_svr;
 
-                               if (cfs_bitmap_check(bitmap, ost->ltd_index))
+                               if (test_bit(ost->ltd_index, bitmap))
                                        continue;
 
                                QOS_DEBUG("OST%d used in conflicting mirror "
                                          "component\n", ost->ltd_index);
-                               cfs_bitmap_set(bitmap, ost->ltd_index);
+                               set_bit(ost->ltd_index, bitmap);
                                lag->lag_ost_avail--;
 
                                for (k = 0; k < lag->lag_oaa_count; k++) {
@@ -2500,7 +2511,7 @@ int lod_qos_prep_create(const struct lu_env *env, struct lod_object *lo,
                 * could be changed if some OSTs are [de]activated manually.
                 */
                lod_qos_statfs_update(env, d, &d->lod_ost_descs);
-               stripe_len = lod_get_stripe_count(d, lo,
+               stripe_len = lod_get_stripe_count(d, lo, comp_idx,
                                                  lod_comp->llc_stripe_count,
                                                  lod_comp->llc_pattern &
                                                  LOV_PATTERN_OVERSTRIPING);