Currently, if writing out a log entry fails, we unlink that log entry from our

internal list of logfiles. So if writev(2) fails for potentially transient
errors like ENOSPC, syslogd requires a restart, even if the filesystem has
purged.

This change allows syslogd to ignore ENOSPC space errors, so that when the
filesystem is cleaned up, syslogd will automatically start logging again
without requiring the reset. This makes syslogd(8) a bit more reliable.

MFC after:	1 week
This commit is contained in:
Christian S.J. Peron 2006-03-30 21:04:52 +00:00
parent cd70100e5d
commit ae4f0fc3a9
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=157311

View File

@ -1227,11 +1227,18 @@ fprintlog(struct filed *f, int flags, const char *msg)
v->iov_base = lf;
v->iov_len = 1;
if (writev(f->f_file, iov, 7) < 0) {
int e = errno;
(void)close(f->f_file);
f->f_type = F_UNUSED;
errno = e;
logerror(f->f_un.f_fname);
/*
* If writev(2) fails for potentially transient errors
* like the * filesystem being full, ignore it.
* Otherwise remove * this logfile from the list.
*/
if (errno != ENOSPC) {
int e = errno;
(void)close(f->f_file);
f->f_type = F_UNUSED;
errno = e;
logerror(f->f_un.f_fname);
}
} else if ((flags & SYNC_FILE) && (f->f_flags & FFLAG_SYNC)) {
f->f_flags |= FFLAG_NEEDSYNC;
needdofsync = 1;