]> git.cameronkatri.com Git - pw-darwin.git/commitdiff
Speed up pw operations that edit /etc/group or /etc/passwd
authorAlan Somers <asomers@FreeBSD.org>
Fri, 18 Nov 2016 16:07:08 +0000 (16:07 +0000)
committerAlan Somers <asomers@FreeBSD.org>
Fri, 18 Nov 2016 16:07:08 +0000 (16:07 +0000)
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

libutil/gr_util.c
libutil/pw_util.c
pw/grupd.c
pw/pw_nis.c
pw/pwupd.c

index 93b3eb2f92fc4d0693000bce7b875984e46ba0be..6153209eb2dc5b73da8f8f63a17ca3070238911a 100644 (file)
@@ -141,7 +141,7 @@ gr_tmp(int mfd)
                errno = ENAMETOOLONG;
                return (-1);
        }
-       if ((tfd = mkostemp(tempname, O_SYNC)) == -1)
+       if ((tfd = mkostemp(tempname, 0)) == -1)
                return (-1);
        if (mfd != -1) {
                while ((nr = read(mfd, buf, sizeof(buf))) > 0)
index 2838871d93f6679307814271a79077e2a715c345..d7903281d7cc96433fa5ad9fdf789511f9141502 100644 (file)
@@ -225,7 +225,7 @@ pw_tmp(int mfd)
                errno = ENAMETOOLONG;
                return (-1);
        }
-       if ((tfd = mkostemp(tempname, O_SYNC)) == -1)
+       if ((tfd = mkostemp(tempname, 0)) == -1)
                return (-1);
        if (mfd != -1) {
                while ((nr = read(mfd, buf, sizeof(buf))) > 0)
index 38d5e5bc956ce26b01dae3e2ca470e08132d485e..5d0df0263e4a8296e92f0a22fb0121bff010a50a 100644 (file)
@@ -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();
index 35b26ea5224b55eac884a0e06cac3533f7e0e90a..087c9460f3f3e4ee00bb1b95e8d0aab7b4114618 100644 (file)
@@ -67,6 +67,7 @@ pw_nisupdate(const char * path, struct passwd * pwd, char const * user)
                close(tfd);
                err(1, "pw_copy()");
        }
+       fsync(tfd);
        close(tfd);
        if (chmod(pw_tempname(), 0644) == -1)
                err(1, "chmod()");
index 3bcb95f8c4651af838cb258567c1ec358ddba622..87c3c994bada86698e0fd233f964143866ca99a4 100644 (file)
@@ -114,6 +114,7 @@ pw_update(struct passwd * pwd, char const * user)
                close(tfd);
                err(1, "pw_copy()");
        }
+       fsync(tfd);
        close(tfd);
        /*
         * in case of deletion of a user, the whole database