aboutsummaryrefslogtreecommitdiff
path: root/lib/libc/db/hash
diff options
context:
space:
mode:
authorDavid Malone <dwmalone@FreeBSD.org>2016-02-23 15:21:13 +0000
committerDavid Malone <dwmalone@FreeBSD.org>2016-02-23 15:21:13 +0000
commitefb7dae251ee63197bf5492fb086cdbc0251feea (patch)
tree64aa91f86322c7b4d544cbccff777e912218cfc2 /lib/libc/db/hash
parentecc7ce0f3ebaf41be0aaae5b6b19f31c14bf10de (diff)
downloadsrc-efb7dae251ee63197bf5492fb086cdbc0251feea.tar.gz
src-efb7dae251ee63197bf5492fb086cdbc0251feea.zip
If we close or sync a hash-based db file, make sure to call fsync to
make sure the changes are on disk. The people at pfSense noticed that it didn't always make it to the disk soon enough with soft updates. Differential Revision: https://reviews.freebsd.org/D5186 Reviewed by: garga, vangyzen, bapt, se MFC after: 1 week
Notes
Notes: svn path=/head/; revision=295924
Diffstat (limited to 'lib/libc/db/hash')
-rw-r--r--lib/libc/db/hash/hash.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/lib/libc/db/hash/hash.c b/lib/libc/db/hash/hash.c
index e6da5fea4786..02503ee1b558 100644
--- a/lib/libc/db/hash/hash.c
+++ b/lib/libc/db/hash/hash.c
@@ -422,8 +422,10 @@ hdestroy(HTAB *hashp)
if (hashp->tmp_buf)
free(hashp->tmp_buf);
- if (hashp->fp != -1)
+ if (hashp->fp != -1) {
+ (void)_fsync(hashp->fp);
(void)_close(hashp->fp);
+ }
free(hashp);
@@ -458,6 +460,8 @@ hash_sync(const DB *dbp, u_int32_t flags)
return (0);
if (__buf_free(hashp, 0, 1) || flush_meta(hashp))
return (ERROR);
+ if (hashp->fp != -1 && _fsync(hashp->fp) != 0)
+ return (ERROR);
hashp->new_file = 0;
return (0);
}