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:
parent
39852ce89e
commit
12daf727f6
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=225832
@ -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;
|
||||||
|
|
||||||
|
@ -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';
|
||||||
|
@ -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): ",
|
||||||
|
@ -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: ");
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user