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: ");
                }
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to