mirror of
https://git.openafs.org/openafs.git
synced 2025-01-21 08:20:16 +00:00
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:
parent
f52c33ea10
commit
fe4e52655c
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user