file: defer checking the tmpfile until it is actually needed.
authorFelix Fietkau <nbd@openwrt.org>
Mon, 11 Jan 2016 12:27:26 +0000 (13:27 +0100)
committerFelix Fietkau <nbd@openwrt.org>
Mon, 11 Jan 2016 12:27:53 +0000 (13:27 +0100)
Avoids creating useless entries in the kernel dentry cache

Signed-off-by: Felix Fietkau <nbd@openwrt.org>
file.c

diff --git a/file.c b/file.c
index 341a7065cddd4e352aae360d596e651d694359c6..8e6052c70c168eab23be093bde4174c91d1c3076 100644 (file)
--- a/file.c
+++ b/file.c
@@ -735,17 +735,6 @@ static void uci_file_commit(struct uci_context *ctx, struct uci_package **packag
        if ((asprintf(&filename, "%s/.%s.uci-XXXXXX", ctx->confdir, p->e.name) < 0) || !filename)
                UCI_THROW(ctx, UCI_ERR_MEM);
 
-       if (!mktemp(filename))
-               *filename = 0;
-
-       if (!*filename) {
-               free(filename);
-               UCI_THROW(ctx, UCI_ERR_IO);
-       }
-
-       if ((stat(filename, &statbuf) == 0) && ((statbuf.st_mode & S_IFMT) != S_IFREG))
-               UCI_THROW(ctx, UCI_ERR_IO);
-
        /* open the config file for writing now, so that it is locked */
        f1 = uci_open_stream(ctx, p->path, NULL, SEEK_SET, true, true);
 
@@ -780,6 +769,17 @@ static void uci_file_commit(struct uci_context *ctx, struct uci_package **packag
                        goto done;
        }
 
+       if (!mktemp(filename))
+               *filename = 0;
+
+       if (!*filename) {
+               free(filename);
+               UCI_THROW(ctx, UCI_ERR_IO);
+       }
+
+       if ((stat(filename, &statbuf) == 0) && ((statbuf.st_mode & S_IFMT) != S_IFREG))
+               UCI_THROW(ctx, UCI_ERR_IO);
+
        f2 = uci_open_stream(ctx, filename, p->path, SEEK_SET, true, true);
        uci_export(ctx, f2, p, false);