libafs: Rate-limit hard-mount waiting messages

Limit how often we log "hard-mount waiting for XXX" messages. Without
this, it is possible for a client with hard-mounts enabled to spam the
kernel log rather excessively (in extreme cases this can even panic
the machine on at least some Linux).

To keep things simple, just log approximately one message per volume
per hard-mount interval.

Reviewed-on: http://gerrit.openafs.org/5060
Tested-by: Derrick Brashear <shadow@dementia.org>
Reviewed-by: Derrick Brashear <shadow@dementia.org>
(cherry picked from commit 530b5ecac51cc7ce61ccddd50868c632c4a47298)

Change-Id: I566aa3d411ff100ccc6afa9a5273fb84e6172dd0
Reviewed-on: http://gerrit.openafs.org/6347
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@dementix.org>
This commit is contained in:
Andrew Deason 2011-07-20 16:50:52 -05:00 committed by Derrick Brashear
parent 7ebaf1aa6a
commit 09fe35b1f3
2 changed files with 52 additions and 5 deletions

View File

@ -521,6 +521,7 @@ struct chservinfo {
#define VRecheck 2 /* recheck volume info with server */
#define VBackup 4 /* is this a backup volume? */
#define VForeign 8 /* this is a non-afs volume */
#define VHardMount 16 /* we are hard-mount waiting for the vol */
enum repstate { not_busy, end_not_busy = 6, rd_busy, rdwr_busy, offline };

View File

@ -393,26 +393,72 @@ afs_Analyze(struct afs_conn *aconn, struct rx_connection *rxconn,
((afid && afs_IsPrimaryCellNum(afid->Cell))
|| (cellp && afs_IsPrimaryCell(cellp)))) {
if (!afid) {
afs_warnuser
("afs: hard-mount waiting for a vlserver to return to service\n");
static int afs_vl_hm = 0;
int warn = 0;
if (!afs_vl_hm) {
afs_vl_hm = warn = 1;
}
if (warn) {
afs_warnuser
("afs: hard-mount waiting for a vlserver to return to service\n");
}
VSleep(hm_retry_int);
afs_CheckServers(1, cellp);
shouldRetry = 1;
if (warn) {
afs_vl_hm = 0;
}
} else {
static int afs_unknown_vhm = 0;
int warn = 0, vp_vhm = 0;
tvp = afs_FindVolume(afid, READ_LOCK);
if (!tvp || (tvp->states & VRO)) {
shouldRetry = hm_retry_RO;
} else {
shouldRetry = hm_retry_RW;
}
/* Set 'warn' if we should afs_warnuser. Only let one
* caller call afs_warnuser per hm_retry_int interval per
* volume. */
if (shouldRetry) {
if (tvp) {
if (!(tvp->states & VHardMount)) {
tvp->states |= VHardMount;
warn = vp_vhm = 1;
}
} else {
if (!afs_unknown_vhm) {
afs_unknown_vhm = 1;
warn = 1;
}
}
}
if (tvp)
afs_PutVolume(tvp, READ_LOCK);
if (shouldRetry) {
afs_warnuser
("afs: hard-mount waiting for volume %u\n",
afid->Fid.Volume);
if (warn) {
afs_warnuser
("afs: hard-mount waiting for volume %u\n",
afid->Fid.Volume);
}
VSleep(hm_retry_int);
afs_CheckServers(1, cellp);
if (vp_vhm) {
tvp = afs_FindVolume(afid, READ_LOCK);
if (tvp) {
tvp->states &= ~VHardMount;
afs_PutVolume(tvp, READ_LOCK);
}
} else if (warn) {
afs_unknown_vhm = 0;
}
}
}
} /* if (hm_retry_int ... */