static struct dt_object *lod_qos_declare_object_on(const struct lu_env *env,
struct lod_device *d,
__u32 ost_idx,
+ bool can_block,
struct thandle *th)
{
+ struct dt_allocation_hint *ah = &lod_env_info(env)->lti_ah;
struct lod_tgt_desc *ost;
struct lu_object *o, *n;
struct lu_device *nd;
dt = container_of(n, struct dt_object, do_lu);
- rc = lod_sub_declare_create(env, dt, NULL, NULL, NULL, th);
+ ah->dah_can_block = can_block;
+ rc = lod_sub_declare_create(env, dt, NULL, ah, NULL, th);
if (rc < 0) {
CDEBUG(D_OTHER, "can't declare creation on #%u: %d\n",
ost_idx, rc);
RETURN(rc);
}
- o = lod_qos_declare_object_on(env, lod, ost_idx, th);
+ o = lod_qos_declare_object_on(env, lod, ost_idx, true, th);
if (IS_ERR(o)) {
CDEBUG(D_OTHER, "can't declare new object on #%u: %d\n",
ost_idx, (int) PTR_ERR(o));
if (rc < 0) /* this OSP doesn't feel well */
break;
- o = lod_qos_declare_object_on(env, m, ost_idx, th);
+ o = lod_qos_declare_object_on(env, m, ost_idx, true, th);
if (IS_ERR(o)) {
rc = PTR_ERR(o);
CDEBUG(D_OTHER,
if (i && !tgt->ltd_statfs.os_fprecreated && !speed)
continue;
- o = lod_qos_declare_object_on(env, m, ost_idx, th);
+ o = lod_qos_declare_object_on(env, m, ost_idx, true, th);
if (IS_ERR(o)) {
CDEBUG(D_OTHER, "can't declare new object on #%u: %d\n",
ost_idx, (int) PTR_ERR(o));
__u32 nfound, good_osts, stripe_count, stripe_count_min;
bool overstriped = false;
int stripes_per_ost = 1;
+ bool slow = false;
int rc = 0;
ENTRY;
*/
for (i = 0; i < osts->op_count; i++) {
__u32 idx = osts->op_array[i];
+ struct lod_tgt_desc *ost = OST_TGT(lod, idx);
if (lod_should_avoid_ost(lo, lag, idx))
continue;
continue;
}
- o = lod_qos_declare_object_on(env, lod, idx, th);
+ o = lod_qos_declare_object_on(env, lod, idx, slow, th);
if (IS_ERR(o)) {
QOS_DEBUG("can't declare object on #%u: %d\n",
idx, (int) PTR_ERR(o));
break;
}
+ if (rc && !slow && nfound < stripe_count) {
+ /* couldn't allocate using precreated objects
+ * so try to wait for new precreations */
+ slow = true;
+ rc = 0;
+ }
+
if (rc) {
/* no OST found on this iteration, give up */
break;
}
pool_name = NULL;
+ if (def_pool[0] != '\0')
+ pool_name = def_pool;
+
if (v1->lmm_magic == LOV_USER_MAGIC_V3 ||
v1->lmm_magic == LOV_USER_MAGIC_SPECIFIC) {
v3 = (struct lov_user_md_v3 *)v1;
+
if (v3->lmm_pool_name[0] != '\0')
pool_name = v3->lmm_pool_name;
rc = lod_comp_copy_ost_lists(lod_comp, v3);
if (rc)
GOTO(free_comp, rc);
+
+ pool_name = NULL;
}
}
- if (pool_name == NULL && def_pool[0] != '\0')
- pool_name = def_pool;
-
if (v1->lmm_pattern == 0)
v1->lmm_pattern = LOV_PATTERN_RAID0;
if (lov_pattern(v1->lmm_pattern) != LOV_PATTERN_RAID0 &&