svn commit: r225832 - head/sbin/hastd
Pawel Jakub Dawidek
pjd at FreeBSD.org
Wed Sep 28 13:19:48 UTC 2011
Author: pjd
Date: Wed Sep 28 13:19:47 2011
New Revision: 225832
URL: http://svn.freebsd.org/changeset/base/225832
Log:
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
Modified:
head/sbin/hastd/hast.h
head/sbin/hastd/parse.y
head/sbin/hastd/primary.c
head/sbin/hastd/secondary.c
Modified: head/sbin/hastd/hast.h
==============================================================================
--- head/sbin/hastd/hast.h Wed Sep 28 13:13:43 2011 (r225831)
+++ head/sbin/hastd/hast.h Wed Sep 28 13:19:47 2011 (r225832)
@@ -167,6 +167,8 @@ struct hast_resource {
off_t hr_local_mediasize;
/* Sector size of local provider. */
unsigned int hr_local_sectorsize;
+ /* Is flushing write cache supported by the local provider? */
+ bool hr_localflush;
/* Flush write cache on metadata updates? */
int hr_metaflush;
Modified: head/sbin/hastd/parse.y
==============================================================================
--- head/sbin/hastd/parse.y Wed Sep 28 13:13:43 2011 (r225831)
+++ head/sbin/hastd/parse.y Wed Sep 28 13:19:47 2011 (r225832)
@@ -788,6 +788,7 @@ resource_start: STR
curres->hr_provname[0] = '\0';
curres->hr_localpath[0] = '\0';
curres->hr_localfd = -1;
+ curres->hr_localflush = true;
curres->hr_metaflush = -1;
curres->hr_remoteaddr[0] = '\0';
curres->hr_sourceaddr[0] = '\0';
Modified: head/sbin/hastd/primary.c
==============================================================================
--- head/sbin/hastd/primary.c Wed Sep 28 13:13:43 2011 (r225831)
+++ head/sbin/hastd/primary.c Wed Sep 28 13:19:47 2011 (r225832)
@@ -1304,8 +1304,15 @@ local_send_thread(void *arg)
}
break;
case BIO_FLUSH:
+ if (!res->hr_localflush) {
+ ret = -1;
+ errno = EOPNOTSUPP;
+ break;
+ }
ret = g_flush(res->hr_localfd);
if (ret < 0) {
+ if (errno == EOPNOTSUPP)
+ res->hr_localflush = false;
hio->hio_errors[ncomp] = errno;
reqlog(LOG_WARNING, 0, ggio,
"Local request failed (%s): ",
Modified: head/sbin/hastd/secondary.c
==============================================================================
--- head/sbin/hastd/secondary.c Wed Sep 28 13:13:43 2011 (r225831)
+++ head/sbin/hastd/secondary.c Wed Sep 28 13:19:47 2011 (r225832)
@@ -664,7 +664,7 @@ disk_thread(void *arg)
struct hast_resource *res = arg;
struct hio *hio;
ssize_t ret;
- bool clear_activemap;
+ bool clear_activemap, logerror;
clear_activemap = true;
@@ -702,6 +702,7 @@ disk_thread(void *arg)
break;
}
reqlog(LOG_DEBUG, 2, -1, hio, "disk: (%p) Got request: ", hio);
+ logerror = true;
/* Handle the actual request. */
switch (hio->hio_cmd) {
case HIO_READ:
@@ -736,14 +737,23 @@ disk_thread(void *arg)
hio->hio_error = 0;
break;
case HIO_FLUSH:
+ if (!res->hr_localflush) {
+ ret = -1;
+ hio->hio_error = EOPNOTSUPP;
+ logerror = false;
+ break;
+ }
ret = g_flush(res->hr_localfd);
- if (ret < 0)
+ if (ret < 0) {
+ if (errno == EOPNOTSUPP)
+ res->hr_localflush = false;
hio->hio_error = errno;
- else
+ } else {
hio->hio_error = 0;
+ }
break;
}
- if (hio->hio_error != 0) {
+ if (logerror && hio->hio_error != 0) {
reqlog(LOG_ERR, 0, hio->hio_error, hio,
"Request failed: ");
}
More information about the svn-src-head
mailing list