If the underlying provider doesn't support BIO_FLUSH, log it only once

and don't bother trying in the future.

MFC after:	3 days
This commit is contained in:
Pawel Jakub Dawidek 2011-09-28 13:19:47 +00:00
parent 39852ce89e
commit 12daf727f6
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=225832
4 changed files with 24 additions and 4 deletions

View File

@ -167,6 +167,8 @@ struct hast_resource {
off_t hr_local_mediasize; off_t hr_local_mediasize;
/* Sector size of local provider. */ /* Sector size of local provider. */
unsigned int hr_local_sectorsize; unsigned int hr_local_sectorsize;
/* Is flushing write cache supported by the local provider? */
bool hr_localflush;
/* Flush write cache on metadata updates? */ /* Flush write cache on metadata updates? */
int hr_metaflush; int hr_metaflush;

View File

@ -788,6 +788,7 @@ resource_start: STR
curres->hr_provname[0] = '\0'; curres->hr_provname[0] = '\0';
curres->hr_localpath[0] = '\0'; curres->hr_localpath[0] = '\0';
curres->hr_localfd = -1; curres->hr_localfd = -1;
curres->hr_localflush = true;
curres->hr_metaflush = -1; curres->hr_metaflush = -1;
curres->hr_remoteaddr[0] = '\0'; curres->hr_remoteaddr[0] = '\0';
curres->hr_sourceaddr[0] = '\0'; curres->hr_sourceaddr[0] = '\0';

View File

@ -1304,8 +1304,15 @@ local_send_thread(void *arg)
} }
break; break;
case BIO_FLUSH: case BIO_FLUSH:
if (!res->hr_localflush) {
ret = -1;
errno = EOPNOTSUPP;
break;
}
ret = g_flush(res->hr_localfd); ret = g_flush(res->hr_localfd);
if (ret < 0) { if (ret < 0) {
if (errno == EOPNOTSUPP)
res->hr_localflush = false;
hio->hio_errors[ncomp] = errno; hio->hio_errors[ncomp] = errno;
reqlog(LOG_WARNING, 0, ggio, reqlog(LOG_WARNING, 0, ggio,
"Local request failed (%s): ", "Local request failed (%s): ",

View File

@ -664,7 +664,7 @@ disk_thread(void *arg)
struct hast_resource *res = arg; struct hast_resource *res = arg;
struct hio *hio; struct hio *hio;
ssize_t ret; ssize_t ret;
bool clear_activemap; bool clear_activemap, logerror;
clear_activemap = true; clear_activemap = true;
@ -702,6 +702,7 @@ disk_thread(void *arg)
break; break;
} }
reqlog(LOG_DEBUG, 2, -1, hio, "disk: (%p) Got request: ", hio); reqlog(LOG_DEBUG, 2, -1, hio, "disk: (%p) Got request: ", hio);
logerror = true;
/* Handle the actual request. */ /* Handle the actual request. */
switch (hio->hio_cmd) { switch (hio->hio_cmd) {
case HIO_READ: case HIO_READ:
@ -736,14 +737,23 @@ disk_thread(void *arg)
hio->hio_error = 0; hio->hio_error = 0;
break; break;
case HIO_FLUSH: case HIO_FLUSH:
if (!res->hr_localflush) {
ret = -1;
hio->hio_error = EOPNOTSUPP;
logerror = false;
break;
}
ret = g_flush(res->hr_localfd); ret = g_flush(res->hr_localfd);
if (ret < 0) if (ret < 0) {
if (errno == EOPNOTSUPP)
res->hr_localflush = false;
hio->hio_error = errno; hio->hio_error = errno;
else } else {
hio->hio_error = 0; hio->hio_error = 0;
}
break; break;
} }
if (hio->hio_error != 0) { if (logerror && hio->hio_error != 0) {
reqlog(LOG_ERR, 0, hio->hio_error, hio, reqlog(LOG_ERR, 0, hio->hio_error, hio,
"Request failed: "); "Request failed: ");
} }