From: John L. Hammond Date: Wed, 4 Apr 2018 15:13:16 +0000 (-0500) Subject: LU-10850 fld: handle empty ranges in fld_index_init() X-Git-Tag: 2.11.52~23 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=9b5337b695be699ce289d5f509436286d4d7185c LU-10850 fld: handle empty ranges in fld_index_init() In fld_index_init(), ignore the empty range corresponding to the zeroed-out phantom record that is included in newly created ldiskfs IAM indexes. (This phantom record will be removed in a subseuent patch.) Ensure that lfs_new will be set when the FLD index was empty of valid ranges. (Previously it was properly set on ZFS backed targets but not on ldiskfs.) Signed-off-by: John L. Hammond Change-Id: I9850eac686e1488ffbd627f100075ce6f29200d8 Reviewed-on: https://review.whamcloud.com/31871 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Fan Yong Reviewed-by: Mike Pershin Reviewed-by: Alex Zhuravlev Reviewed-by: Oleg Drokin --- diff --git a/lustre/fld/fld_index.c b/lustre/fld/fld_index.c index ab0ae6d..7399206 100644 --- a/lustre/fld/fld_index.c +++ b/lustre/fld/fld_index.c @@ -335,6 +335,7 @@ int fld_index_init(const struct lu_env *env, struct lu_server_fld *fld, const struct dt_it_ops *iops; int rc; __u32 index; + int range_count = 0; ENTRY; info = lu_context_key_get(&env->le_ctx, &fld_thread_key); @@ -388,26 +389,39 @@ int fld_index_init(const struct lu_env *env, struct lu_server_fld *fld, GOTO(out, rc = PTR_ERR(it)); rc = iops->load(env, it, 0); + if (rc > 0) + rc = 0; + else if (rc == 0) + rc = iops->next(env, it); + if (rc < 0) GOTO(out_it_fini, rc); - if (rc > 0) { - /* Load FLD entry into server cache */ - do { - rc = iops->rec(env, it, (struct dt_rec *)range, 0); - if (rc != 0) - GOTO(out_it_put, rc); - LASSERT(range != NULL); - range_be_to_cpu(range, range); + while (rc == 0) { + rc = iops->rec(env, it, (struct dt_rec *)range, 0); + if (rc != 0) + GOTO(out_it_put, rc); + + range_be_to_cpu(range, range); + + /* Newly created ldiskfs IAM indexes may include a + * zeroed-out key and record. Ignore it here. */ + if (range->lsr_start < range->lsr_end) { rc = fld_cache_insert(fld->lsf_cache, range); if (rc != 0) GOTO(out_it_put, rc); - rc = iops->next(env, it); - } while (rc == 0); - } else { - fld->lsf_new = 1; + + range_count++; + } + + rc = iops->next(env, it); + if (rc < 0) + GOTO(out_it_fini, rc); } + if (range_count == 0) + fld->lsf_new = 1; + rc = fld_name_to_index(fld->lsf_name, &index); if (rc < 0) GOTO(out_it_put, rc);