Whamcloud - gitweb
LU-8751 kernel: kernel update RHEL7.2 [3.10.0-327.36.3.el7]
[fs/lustre-release.git] / lustre / lod / lod_qos.c
index 8022335..1288bab 100644 (file)
@@ -199,6 +199,11 @@ static int lod_statfs_and_check(const struct lu_env *env, struct lod_device *d,
        LASSERT(ost);
 
        rc = dt_statfs(env, ost->ltd_ost, sfs);
+
+       if (rc == 0 && ((sfs->os_state & OS_STATE_ENOSPC) ||
+           (sfs->os_state & OS_STATE_ENOINO && sfs->os_fprecreated == 0)))
+               RETURN(-ENOSPC);
+
        if (rc && rc != -ENOTCONN)
                CERROR("%s: statfs: rc = %d\n", lod2obd(d)->obd_name, rc);
 
@@ -209,7 +214,7 @@ static int lod_statfs_and_check(const struct lu_env *env, struct lod_device *d,
        /* check whether device has changed state (active, inactive) */
        if (rc != 0 && ost->ltd_active) {
                /* turned inactive? */
-               spin_lock(&d->lod_desc_lock);
+               spin_lock(&d->lod_lock);
                if (ost->ltd_active) {
                        ost->ltd_active = 0;
                        if (rc == -ENOTCONN)
@@ -222,13 +227,13 @@ static int lod_statfs_and_check(const struct lu_env *env, struct lod_device *d,
                        CDEBUG(D_CONFIG, "%s: turns inactive\n",
                               ost->ltd_exp->exp_obd->obd_name);
                }
-               spin_unlock(&d->lod_desc_lock);
+               spin_unlock(&d->lod_lock);
        } else if (rc == 0 && ost->ltd_active == 0) {
                /* turned active? */
                LASSERTF(d->lod_desc.ld_active_tgt_count < d->lod_ostnr,
                         "active tgt count %d, ost nr %d\n",
                         d->lod_desc.ld_active_tgt_count, d->lod_ostnr);
-               spin_lock(&d->lod_desc_lock);
+               spin_lock(&d->lod_lock);
                if (ost->ltd_active == 0) {
                        ost->ltd_active = 1;
                        ost->ltd_connecting = 0;
@@ -238,7 +243,7 @@ static int lod_statfs_and_check(const struct lu_env *env, struct lod_device *d,
                        CDEBUG(D_CONFIG, "%s: turns active\n",
                               ost->ltd_exp->exp_obd->obd_name);
                }
-               spin_unlock(&d->lod_desc_lock);
+               spin_unlock(&d->lod_lock);
        }
 
        RETURN(rc);
@@ -517,9 +522,9 @@ static int lod_qos_used(struct lod_device *lod, struct ost_pool *osts,
                if (ost->ltd_qos.ltq_usable)
                        *total_wt += ost->ltd_qos.ltq_weight;
 
-               QOS_DEBUG("recalc tgt %d usable=%d avail="LPU64
-                         " ostppo="LPU64" ostp="LPU64" ossppo="LPU64
-                         " ossp="LPU64" wt="LPU64"\n",
+               QOS_DEBUG("recalc tgt %d usable=%d avail=%llu"
+                         " ostppo=%llu ostp=%llu ossppo=%llu"
+                         " ossp=%llu wt=%llu\n",
                          i, ost->ltd_qos.ltq_usable, TGT_BAVAIL(i) >> 10,
                          ost->ltd_qos.ltq_penalty_per_obj >> 10,
                          ost->ltd_qos.ltq_penalty >> 10,
@@ -742,30 +747,6 @@ static int min_stripe_count(__u32 stripe_cnt, int flags)
 #define LOV_CREATE_RESEED_MIN  2000
 
 /**
- * Check if an OST is full.
- *
- * Check whether an OST should be considered full based
- * on the given statfs data.
- *
- * \param[in] msfs     statfs data
- *
- * \retval false       not full
- * \retval true                full
- */
-static int inline lod_qos_dev_is_full(struct obd_statfs *msfs)
-{
-       __u64 used;
-       int   bs = msfs->os_bsize;
-
-       LASSERT(((bs - 1) & bs) == 0);
-
-       /* the minimum of 0.1% used blocks and 1GB bytes. */
-       used = min_t(__u64, (msfs->os_blocks - msfs->os_bfree) >> 10,
-                       1 << (31 - ffs(bs)));
-       return (msfs->os_bavail < used);
-}
-
-/**
  * Initialize temporary OST-in-use array.
  *
  * Allocate or extend the array used to mark targets already assigned to a new
@@ -856,14 +837,6 @@ static int lod_check_and_reserve_ost(const struct lu_env *env,
        }
 
        /*
-        * skip full devices
-        */
-       if (lod_qos_dev_is_full(sfs)) {
-               QOS_DEBUG("#%d is full\n", ost_idx);
-               goto out_return;
-       }
-
-       /*
         * We expect number of precreated objects in f_ffree at
         * the first iteration, skip OSPs with no objects ready
         */
@@ -883,7 +856,7 @@ static int lod_check_and_reserve_ost(const struct lu_env *env,
        /*
         * do not put >1 objects on a single OST
         */
-       if (speed && lod_qos_is_ost_used(env, ost_idx, stripe_idx))
+       if (lod_qos_is_ost_used(env, ost_idx, stripe_idx))
                goto out_return;
 
        o = lod_qos_declare_object_on(env, m, ost_idx, th);
@@ -899,6 +872,7 @@ static int lod_check_and_reserve_ost(const struct lu_env *env,
         */
        lod_qos_ost_in_use(env, stripe_idx, ost_idx);
        stripe[stripe_idx] = o;
+       OBD_FAIL_TIMEOUT(OBD_FAIL_MDS_LOV_CREATE_RACE, 2);
        stripe_idx++;
        *s_idx = stripe_idx;
 
@@ -1105,7 +1079,7 @@ static int lod_alloc_ost_list(const struct lu_env *env,
 
        v3 = (struct lov_user_md_v3 *)lum;
        for (i = 0; i < lo->ldo_stripenr; i++) {
-               if (v3->lmm_objects[i].l_ost_idx == lo->ldo_def_stripe_offset) {
+               if (v3->lmm_objects[i].l_ost_idx == lo->ldo_stripe_offset) {
                        array_idx = i;
                        break;
                }
@@ -1113,7 +1087,7 @@ static int lod_alloc_ost_list(const struct lu_env *env,
        if (i == lo->ldo_stripenr) {
                CDEBUG(D_OTHER,
                       "%s: start index %d not in the specified list of OSTs\n",
-                      lod2obd(m)->obd_name, lo->ldo_def_stripe_offset);
+                      lod2obd(m)->obd_name, lo->ldo_stripe_offset);
                RETURN(-EINVAL);
        }
 
@@ -1161,7 +1135,7 @@ static int lod_alloc_ost_list(const struct lu_env *env,
 /**
  * Allocate a striping on a predefined set of OSTs.
  *
- * Allocates new layout starting from OST index in lo->ldo_def_stripe_offset.
+ * Allocates new layout starting from OST index in lo->ldo_stripe_offset.
  * Full OSTs are not considered. The exact order of OSTs is not important and
  * varies depending on OST status. The allocation procedure prefers the targets
  * with precreated objects ready. The number of stripes needed and stripe
@@ -1217,15 +1191,14 @@ repeat_find:
        /* search loi_ost_idx in ost array */
        array_idx = 0;
        for (i = 0; i < ost_count; i++) {
-               if (osts->op_array[i] == lo->ldo_def_stripe_offset) {
+               if (osts->op_array[i] == lo->ldo_stripe_offset) {
                        array_idx = i;
                        break;
                }
        }
        if (i == ost_count) {
                CERROR("Start index %d not found in pool '%s'\n",
-                      lo->ldo_def_stripe_offset,
-                      lo->ldo_pool ? lo->ldo_pool : "");
+                      lo->ldo_stripe_offset, lo->ldo_pool ?: "");
                GOTO(out, rc = -EINVAL);
        }
 
@@ -1432,16 +1405,16 @@ static int lod_alloc_qos(const struct lu_env *env, struct lod_object *lo,
                if (!cfs_bitmap_check(lod->lod_ost_bitmap, osts->op_array[i]))
                        continue;
 
+               ost = OST_TGT(lod, osts->op_array[i]);
+               ost->ltd_qos.ltq_usable = 0;
+
                rc = lod_statfs_and_check(env, lod, osts->op_array[i], sfs);
                if (rc) {
                        /* this OSP doesn't feel well */
                        continue;
                }
 
-               /*
-                * skip full devices
-                */
-               if (lod_qos_dev_is_full(sfs))
+               if (sfs->os_state & OS_STATE_DEGRADED)
                        continue;
 
                /* Fail Check before osc_precreate() is called
@@ -1450,7 +1423,6 @@ static int lod_alloc_qos(const struct lu_env *env, struct lod_object *lo,
                                   osts->op_array[i] == 0)
                        continue;
 
-               ost = OST_TGT(lod, osts->op_array[i]);
                ost->ltd_qos.ltq_usable = 1;
                lod_qos_calc_weight(lod, osts->op_array[i]);
                total_weight += ost->ltd_qos.ltq_weight;
@@ -1514,8 +1486,8 @@ static int lod_alloc_qos(const struct lu_env *env, struct lod_object *lo,
                                continue;
 
                        cur_weight += ost->ltd_qos.ltq_weight;
-                       QOS_DEBUG("stripe_cnt=%d nfound=%d cur_weight="LPU64
-                                 " rand="LPU64" total_weight="LPU64"\n",
+                       QOS_DEBUG("stripe_cnt=%d nfound=%d cur_weight=%llu"
+                                 " rand=%llu total_weight=%llu\n",
                                  stripe_cnt, nfound, cur_weight, rand,
                                  total_weight);
 
@@ -1786,7 +1758,7 @@ static int lod_qos_parse_config(const struct lu_env *env,
        if (v1->lmm_stripe_count > 0)
                lo->ldo_stripenr = v1->lmm_stripe_count;
 
-       lo->ldo_def_stripe_offset = v1->lmm_stripe_offset;
+       lo->ldo_stripe_offset = v1->lmm_stripe_offset;
 
        lod_object_set_pool(lo, NULL);
        if (pool_name != NULL) {
@@ -1797,14 +1769,14 @@ static int lod_qos_parse_config(const struct lu_env *env,
                /* coverity[overrun-buffer-val] */
                pool = lod_find_pool(d, pool_name);
                if (pool != NULL) {
-                       if (lo->ldo_def_stripe_offset != LOV_OFFSET_DEFAULT) {
+                       if (lo->ldo_stripe_offset != LOV_OFFSET_DEFAULT) {
                                rc = lod_check_index_in_pool(
-                                              lo->ldo_def_stripe_offset, pool);
+                                               lo->ldo_stripe_offset, pool);
                                if (rc < 0) {
                                        lod_pool_putref(pool);
                                        CERROR("%s: invalid offset, %u\n",
                                               lod2obd(d)->obd_name,
-                                              lo->ldo_def_stripe_offset);
+                                              lo->ldo_stripe_offset);
                                        RETURN(-EINVAL);
                                }
                        }
@@ -1911,7 +1883,7 @@ int lod_qos_prep_create(const struct lu_env *env, struct lod_object *lo,
 
                if (lum != NULL && lum->lmm_magic == LOV_USER_MAGIC_SPECIFIC) {
                        rc = lod_alloc_ost_list(env, lo, stripe, lum, th);
-               } else if (lo->ldo_def_stripe_offset == LOV_OFFSET_DEFAULT) {
+               } else if (lo->ldo_stripe_offset == LOV_OFFSET_DEFAULT) {
                        rc = lod_alloc_qos(env, lo, stripe, flag, th);
                        if (rc == -EAGAIN)
                                rc = lod_alloc_rr(env, lo, stripe, flag, th);