viced: Relax "h_TossStuff_r failed" warnings

Currently, h_TossStuff_r bails out and logs a message if we detect
that somebody grabbed a reference or locked the host while we tried to
h_NBLock_r. The reasoning for this is that it is not legal for anyone
to h_Hold_r a host that has HOSTDELETED set (but the error is
detectable and recoverable); callers are supposed to check for
HOSTDELETED and not hold a host in that case.

However, HOSTDELETED may not be set when h_TossStuff_r is called,
since we call it if either HOSTDELETED _or_ CLIENTDELETED are set. If
CLIENTDELETED is set and HOSTDELETED is not, it's perfectly fine (and
necessary) for callers to grab a reference to the host. So, if that's
what is going on, don't log a message, since that's normal behavior.

Check for HOSTDELETED before we h_NBLock_r, since it is technically
possible (and legal) for someone to grab a reference to the host and
somehow set HOSTDELETED while we wait for h_NBLock_r to return. Also
log the flags when we see this message.

Change-Id: Ie50a0617de094bb1c721da28f100ed4b31aa849f
Reviewed-on: http://gerrit.openafs.org/6733
Reviewed-by: Alistair Ferguson <alistair.ferguson@mac.com>
Reviewed-by: Derrick Brashear <shadow@dementix.org>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
This commit is contained in:
Andrew Deason 2012-02-17 17:12:46 -06:00 committed by Derrick Brashear
parent f52c33ea10
commit fe4e52655c

View File

@ -804,6 +804,11 @@ h_TossStuff_r(struct host *host)
{
struct client **cp, *client;
int code;
int wasdeleted = 0;
if ((host->hostFlags & HOSTDELETED)) {
wasdeleted = 1;
}
/* make sure host doesn't go away over h_NBLock_r */
h_Hold_r(host);
@ -816,9 +821,13 @@ h_TossStuff_r(struct host *host)
/* if somebody still has this host locked */
if (code != 0) {
char hoststr[16];
ViceLog(0,
("Warning: h_TossStuff_r failed; Host %" AFS_PTR_FMT " (%s:%d) was locked.\n",
host, afs_inet_ntoa_r(host->host, hoststr), ntohs(host->port)));
if (wasdeleted) {
/* someone locked the host while HOSTDELETED was set; that is bad */
ViceLog(0, ("Warning: h_TossStuff_r failed; Host %" AFS_PTR_FMT
" (%s:%d flags 0x%x) was locked.\n",
host, afs_inet_ntoa_r(host->host, hoststr), ntohs(host->port),
(unsigned)host->hostFlags));
}
return;
} else {
h_Unlock_r(host);
@ -829,9 +838,13 @@ h_TossStuff_r(struct host *host)
* reacquire H_LOCK */
if (host->refCount > 0) {
char hoststr[16];
ViceLog(0,
("Warning: h_TossStuff_r failed; Host %" AFS_PTR_FMT " (%s:%d) was held.\n",
host, afs_inet_ntoa_r(host->host, hoststr), ntohs(host->port)));
if (wasdeleted) {
/* someone grabbed a ref while HOSTDELETED was set; that is bad */
ViceLog(0, ("Warning: h_TossStuff_r failed; Host %" AFS_PTR_FMT
" (%s:%d flags 0x%x) was held.\n",
host, afs_inet_ntoa_r(host->host, hoststr), ntohs(host->port),
(unsigned)host->hostFlags));
}
return;
}