Whamcloud - gitweb
git://git.whamcloud.com
/
fs
/
lustre-release.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
LU-8498 nodemap: new zfs index files not properly initialized
[fs/lustre-release.git]
/
lustre
/
ptlrpc
/
nodemap_storage.c
diff --git
a/lustre/ptlrpc/nodemap_storage.c
b/lustre/ptlrpc/nodemap_storage.c
index
c94d4ec
..
fb12f09
100644
(file)
--- a/
lustre/ptlrpc/nodemap_storage.c
+++ b/
lustre/ptlrpc/nodemap_storage.c
@@
-779,20
+779,30
@@
static int nodemap_load_entries(const struct lu_env *env,
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_
lock
, rc);
+ GOTO(out_
iops_put
, rc);
}
}
- do {
+ /* 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;
@@
-800,11
+810,11
@@
static int nodemap_load_entries(const struct lu_env *env,
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_
lock
, rc);
+ 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_
lock
, rc);
+ GOTO(out_
nodemap_config
, rc);
if (rc == NODEMAP_GLOBAL_IDX)
loaded_global_idx = true;
}
if (rc == NODEMAP_GLOBAL_IDX)
loaded_global_idx = true;
}
@@
-812,19
+822,20
@@
static int nodemap_load_entries(const struct lu_env *env,
do
rc = iops->next(env, it);
while (rc == -ESTALE);
do
rc = iops->next(env, it);
while (rc == -ESTALE);
- }
while (rc == 0);
+ }
if (rc > 0)
rc = 0;
if (rc > 0)
rc = 0;
-out_
lock
:
+out_
nodemap_config
:
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;
-out_iops:
+out_iops
_put
:
iops->put(env, it);
iops->put(env, it);
+out_iops_fini:
iops->fini(env, it);
out:
dt_read_unlock(env, nodemap_idx);
iops->fini(env, it);
out:
dt_read_unlock(env, nodemap_idx);