DAFS: Skip hosts with invalid flags on restore

Host entries with HWHO_INPROGRESS set or ALTADDR unset do not have
valid state, since those flags indicate that the fileserver was in the
middle of identifying the host when the host struct was serialized.
Skip entries from the on-disk host data that have such invalid flags
set when restoring state, so we do not load invalid data.

Change-Id: I26b88256679f4596598e6e3e6b68af7e8e5e387d
Reviewed-on: http://gerrit.openafs.org/5527
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@dementix.org>
This commit is contained in:
Andrew Deason 2011-09-29 16:04:54 -05:00 committed by Derrick Brashear
parent d54a9994d3
commit 6e7b31ef0a
3 changed files with 17 additions and 0 deletions

View File

@ -41,6 +41,7 @@
/* values for the 'valid' field in idx_map_entry_t */
#define FS_STATE_IDX_VALID 1
#define FS_STATE_IDX_SKIPPED 2
/*
* on-disk structures

View File

@ -2456,6 +2456,12 @@ cb_stateRestoreCBs(struct fs_dump_state * state, struct FileEntry * fe,
for (idx = 0; idx < niovecs; idx++) {
cbdsk = (struct CBDiskEntry *) iov[idx].iov_base;
if (cbdsk->cb.hhead < state->h_map.len &&
state->h_map.entries[cbdsk->cb.hhead].valid == FS_STATE_IDX_SKIPPED) {
continue;
}
if ((cb = GetCB()) == NULL) {
ViceLog(0, ("cb_stateRestoreCBs: ran out of free CallBack structures\n"));
ret = 1;

View File

@ -3367,6 +3367,16 @@ h_stateRestoreHost(struct fs_dump_state * state)
osi_Assert(hcps != NULL);
}
if ((hdsk.hostFlags & HWHO_INPROGRESS) || !(hdsk.hostFlags & ALTADDR)) {
char hoststr[16];
ViceLog(0, ("h_stateRestoreHost: skipping host %s:%d due to invalid flags 0x%x\n",
afs_inet_ntoa_r(hdsk.host, hoststr), (int)ntohs(hdsk.port),
(unsigned)hdsk.hostFlags));
bail = 0;
state->h_map.entries[hdsk.index].valid = FS_STATE_IDX_SKIPPED;
goto done;
}
/* for restoring state, we better be able to get a host! */
host = GetHT();
osi_Assert(host != NULL);