X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Flod%2Flod_qos.c;h=fa7eed8a1b34e0b0a132109e32b3b5d6788b2aaf;hb=c944e6eaa7f8b98230701266641bfd9dfcb56da8;hp=af0f9dbb92b8a945fb353ca4c03e0f67506fd0d9;hpb=9fa85c69c9e582874f52473e2612407a82319cb6;p=fs%2Flustre-release.git diff --git a/lustre/lod/lod_qos.c b/lustre/lod/lod_qos.c index af0f9db..fa7eed8 100644 --- a/lustre/lod/lod_qos.c +++ b/lustre/lod/lod_qos.c @@ -23,7 +23,7 @@ * Copyright 2009 Sun Microsystems, Inc. All rights reserved * Use is subject to license terms. * - * Copyright (c) 2012, Intel Corporation. + * Copyright (c) 2012, 2013, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -175,7 +175,9 @@ static int lod_statfs_and_check(const struct lu_env *env, struct lod_device *d, spin_unlock(&d->lod_desc_lock); } else if (rc == 0 && ost->ltd_active == 0) { /* turned active? */ - LASSERT(d->lod_desc.ld_active_tgt_count < d->lod_ostnr); + 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); if (ost->ltd_active == 0) { ost->ltd_active = 1; @@ -188,7 +190,7 @@ static int lod_statfs_and_check(const struct lu_env *env, struct lod_device *d, spin_unlock(&d->lod_desc_lock); } - return rc; + RETURN(rc); } static void lod_qos_statfs_update(const struct lu_env *env, @@ -225,6 +227,7 @@ static void lod_qos_statfs_update(const struct lu_env *env, out: up_write(&lod->lod_qos.lq_rw_sem); + EXIT; } /* Recalculate per-object penalties for OSSs and OSTs, @@ -629,7 +632,7 @@ static inline int lod_qos_ost_in_use_clear(const struct lu_env *env, int stripes CERROR("can't allocate memory for ost-in-use array\n"); return -ENOMEM; } - memset(info->lti_ea_store, 0, sizeof(int) * stripes); + memset(info->lti_ea_store, -1, sizeof(int) * stripes); return 0; } @@ -657,7 +660,8 @@ static int lod_qos_is_ost_used(const struct lu_env *env, int ost, int stripes) /* Allocate objects on OSTs with round-robin algorithm */ static int lod_alloc_rr(const struct lu_env *env, struct lod_object *lo, - int flags, struct thandle *th) + struct dt_object **stripe, int flags, + struct thandle *th) { struct lod_device *m = lu2lod_dev(lo->ldo_obj.do_lu.lo_dev); struct obd_statfs *sfs = &lod_env_info(env)->lti_osfs; @@ -790,7 +794,7 @@ repeat_find: * We've successfuly declared (reserved) an object */ lod_qos_ost_in_use(env, stripe_idx, ost_idx); - lo->ldo_stripe[stripe_idx] = o; + stripe[stripe_idx] = o; stripe_idx++; } @@ -824,7 +828,8 @@ out: /* alloc objects on osts with specific stripe offset */ static int lod_alloc_specific(const struct lu_env *env, struct lod_object *lo, - int flags, struct thandle *th) + struct dt_object **stripe, int flags, + struct thandle *th) { struct lod_device *m = lu2lod_dev(lo->ldo_obj.do_lu.lo_dev); struct obd_statfs *sfs = &lod_env_info(env)->lti_osfs; @@ -916,7 +921,8 @@ repeat_find: /* * We've successfuly declared (reserved) an object */ - lo->ldo_stripe[stripe_num] = o; + lod_qos_ost_in_use(env, stripe_num, ost_idx); + stripe[stripe_num] = o; stripe_num++; /* We have enough stripes */ @@ -971,7 +977,8 @@ static inline int lod_qos_is_usable(struct lod_device *lod) - network resources (shared OSS's) */ static int lod_alloc_qos(const struct lu_env *env, struct lod_object *lo, - int flags, struct thandle *th) + struct dt_object **stripe, int flags, + struct thandle *th) { struct lod_device *m = lu2lod_dev(lo->ldo_obj.do_lu.lo_dev); struct obd_statfs *sfs = &lod_env_info(env)->lti_osfs; @@ -1132,7 +1139,7 @@ static int lod_alloc_qos(const struct lu_env *env, struct lod_object *lo, idx, (int) PTR_ERR(o)); continue; } - lo->ldo_stripe[nfound++] = o; + stripe[nfound++] = o; lod_qos_used(m, osts, idx, &total_weight); rc = 0; break; @@ -1154,9 +1161,9 @@ static int lod_alloc_qos(const struct lu_env *env, struct lod_object *lo, */ LCONSOLE_INFO("wanted %d, found %d\n", stripe_cnt, nfound); for (i = 0; i < nfound; i++) { - LASSERT(lo->ldo_stripe[i]); - lu_object_put(env, &lo->ldo_stripe[i]->do_lu); - lo->ldo_stripe[i] = NULL; + LASSERT(stripe[i] != NULL); + lu_object_put(env, &stripe[i]->do_lu); + stripe[i] = NULL; } /* makes sense to rebalance next time */ @@ -1226,13 +1233,6 @@ static int lod_use_defined_striping(const struct lu_env *env, GOTO(out, rc = -EINVAL); } - /* - * LOD shouldn't be aware of recovery at all, - * but this track recovery status (to some extent) - * to be do additional checks like this one - */ - LASSERT(d->lod_recovery_completed == 0); - mo->ldo_stripe_size = le32_to_cpu(v1->lmm_stripe_size); mo->ldo_stripenr = le16_to_cpu(v1->lmm_stripe_count); mo->ldo_layout_gen = le16_to_cpu(v1->lmm_layout_gen); @@ -1315,6 +1315,9 @@ static int lod_qos_parse_config(const struct lu_env *env, v3 = buf->lb_buf; lod_object_set_pool(lo, v3->lmm_pool_name); + /* In the function below, .hs_keycmp resolves to + * pool_hashkey_keycmp() */ + /* coverity[overrun-buffer-val] */ pool = lod_find_pool(d, v3->lmm_pool_name); if (pool != NULL) { if (lo->ldo_def_stripe_offset != @@ -1346,9 +1349,11 @@ int lod_qos_prep_create(const struct lu_env *env, struct lod_object *lo, struct lu_attr *attr, const struct lu_buf *buf, struct thandle *th) { - struct lod_device *d = lu2lod_dev(lod2lu_obj(lo)->lo_dev); - int flag = LOV_USES_ASSIGNED_STRIPE; - int i, rc = 0; + struct lod_device *d = lu2lod_dev(lod2lu_obj(lo)->lo_dev); + struct dt_object **stripe; + int stripe_len; + int flag = LOV_USES_ASSIGNED_STRIPE; + int i, rc; ENTRY; LASSERT(lo); @@ -1376,24 +1381,42 @@ int lod_qos_prep_create(const struct lu_env *env, struct lod_object *lo, * no striping has been created so far */ LASSERT(lo->ldo_stripenr > 0); + /* + * statfs and check OST targets now, since ld_active_tgt_count + * could be changed if some OSTs are [de]activated manually. + */ + lod_qos_statfs_update(env, d); lo->ldo_stripenr = lod_get_stripecnt(d, LOV_MAGIC, lo->ldo_stripenr); - i = sizeof(struct dt_object *) * lo->ldo_stripenr; - OBD_ALLOC(lo->ldo_stripe, i); - if (lo->ldo_stripe == NULL) + + stripe_len = lo->ldo_stripenr; + OBD_ALLOC(stripe, sizeof(stripe[0]) * stripe_len); + if (stripe == NULL) GOTO(out, rc = -ENOMEM); - lo->ldo_stripes_allocated = lo->ldo_stripenr; lod_getref(&d->lod_ost_descs); /* XXX: support for non-0 files w/o objects */ + CDEBUG(D_OTHER, "tgt_count %d stripenr %d\n", + d->lod_desc.ld_tgt_count, stripe_len); if (lo->ldo_def_stripe_offset >= d->lod_desc.ld_tgt_count) { - lod_qos_statfs_update(env, d); - rc = lod_alloc_qos(env, lo, flag, th); + rc = lod_alloc_qos(env, lo, stripe, flag, th); if (rc == -EAGAIN) - rc = lod_alloc_rr(env, lo, flag, th); - } else - rc = lod_alloc_specific(env, lo, flag, th); + rc = lod_alloc_rr(env, lo, stripe, flag, th); + } else { + rc = lod_alloc_specific(env, lo, stripe, flag, th); + } lod_putref(d, &d->lod_ost_descs); + + if (rc < 0) { + for (i = 0; i < stripe_len; i++) + if (stripe[i] != NULL) + lu_object_put(env, &stripe[i]->do_lu); + + OBD_FREE(stripe, sizeof(stripe[0]) * stripe_len); + } else { + lo->ldo_stripe = stripe; + lo->ldo_stripes_allocated = stripe_len; + } } else { /* * lod_qos_parse_config() found supplied buf as a predefined