summaryrefslogtreecommitdiffstats
path: root/pw/grupd.c
diff options
context:
space:
mode:
authorAlan Somers <asomers@FreeBSD.org>2016-11-18 16:07:08 +0000
committerAlan Somers <asomers@FreeBSD.org>2016-11-18 16:07:08 +0000
commite1c14b0cd9c2d6edd97517368ab16647191b4429 (patch)
tree3555d5daed444f6a29100f360049a9d813fc9f2b /pw/grupd.c
parentb740a3ee5598c5dd5baf65ca8dfec07737ec3e70 (diff)
downloadpw-darwin-e1c14b0cd9c2d6edd97517368ab16647191b4429.tar.gz
pw-darwin-e1c14b0cd9c2d6edd97517368ab16647191b4429.zip
Speed up pw operations that edit /etc/group or /etc/passwd
r285050 fixed a bug in pw that could lead to /etc/passwd or /etc/group corruption on power loss. However, it fixed it by opening those files with O_SYNC, which is very slow, especially on ZFS. This change replaces O_SYNC with appropriately placed fsync()s instead, which is much faster. Using a ZFS tmpdir, the time to run pw's kyua tests drops from 245s to 35s. Reviewed by: allanjude, bapt, vangyzen, garga Tested on pfSense by: garga MFC after: 4 weeks Sponsored by: Spectra Logic Corp Differential Revision: https://reviews.freebsd.org/D8319
Diffstat (limited to 'pw/grupd.c')
-rw-r--r--pw/grupd.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/pw/grupd.c b/pw/grupd.c
index 38d5e5b..5d0df02 100644
--- a/pw/grupd.c
+++ b/pw/grupd.c
@@ -77,6 +77,7 @@ gr_update(struct group * grp, char const * group)
close(tfd);
err(1, "gr_copy()");
}
+ fsync(tfd);
close(tfd);
if (gr_mkdb() == -1) {
gr_fini();