Calling index ->next on a new zfs returns a non-zero RC, but ldiskfs
indexes start with a blank record. This change modifies the config
load code to always write the default nodemap to an empty index file.
Signed-off-by: Kit Westneat <kit.westneat@gmail.com>
Change-Id: I30a365f65463979889f09f7ad5ffcdacc83fa868
Reviewed-on: http://review.whamcloud.com/21939
Reviewed-by: Fan Yong <fan.yong@intel.com>
Reviewed-by: Nathaniel Clark <nathaniel.l.clark@intel.com>
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
GOTO(out, rc = PTR_ERR(it));
rc = iops->load(env, it, hash);
GOTO(out, rc = PTR_ERR(it));
rc = iops->load(env, it, hash);
+ if (rc < 0)
+ GOTO(out_iops_fini, rc);
+
+ /* rc == 0 means we need to advance to record */
if (rc == 0) {
rc = iops->next(env, it);
if (rc == 0) {
rc = iops->next(env, it);
- if (rc != 0)
- GOTO(out_iops, rc = 0);
+
+ if (rc < 0)
+ GOTO(out_iops_put, rc);
+ /* rc > 0 is eof, will be checked in while below */
+ } else {
+ /* rc == 1, we found initial record and can process below */
+ rc = 0;
}
new_config = nodemap_config_alloc();
if (IS_ERR(new_config)) {
rc = PTR_ERR(new_config);
new_config = NULL;
}
new_config = nodemap_config_alloc();
if (IS_ERR(new_config)) {
rc = PTR_ERR(new_config);
new_config = NULL;
+ GOTO(out_iops_put, rc);
+ /* rc > 0 is eof, check initial iops->next here as well */
+ while (rc == 0) {
struct nodemap_key *key;
union nodemap_rec rec;
struct nodemap_key *key;
union nodemap_rec rec;
rc = iops->rec(env, it, (struct dt_rec *)&rec, 0);
if (rc != -ESTALE) {
if (rc != 0)
rc = iops->rec(env, it, (struct dt_rec *)&rec, 0);
if (rc != -ESTALE) {
if (rc != 0)
+ GOTO(out_nodemap_config, rc);
rc = nodemap_process_keyrec(new_config, key, &rec,
&recent_nodemap);
if (rc < 0)
rc = nodemap_process_keyrec(new_config, key, &rec,
&recent_nodemap);
if (rc < 0)
+ GOTO(out_nodemap_config, rc);
if (rc == NODEMAP_GLOBAL_IDX)
loaded_global_idx = true;
}
if (rc == NODEMAP_GLOBAL_IDX)
loaded_global_idx = true;
}
do
rc = iops->next(env, it);
while (rc == -ESTALE);
do
rc = iops->next(env, it);
while (rc == -ESTALE);
if (rc != 0)
nodemap_config_dealloc(new_config);
else
/* creating new default needs to be done outside dt read lock */
activate_nodemap = true;
if (rc != 0)
nodemap_config_dealloc(new_config);
else
/* creating new default needs to be done outside dt read lock */
activate_nodemap = true;
iops->fini(env, it);
out:
dt_read_unlock(env, nodemap_idx);
iops->fini(env, it);
out:
dt_read_unlock(env, nodemap_idx);