On read-only filesystems trying to create the target will not fail with EEXIST but with EROFS. Handle EROFS by checking if the target already exists, and if empty when truncating. This avoids reporting errors if tmpfiles doesn't actually needs to do anything. ---
This is a rework of a patch I wrote some time ago[1]. This time reacting to EROFS instead of preempting it. Michael [1] http://lists.freedesktop.org/archives/systemd-devel/2014-August/022158.html src/tmpfiles/tmpfiles.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c index 218d55051410..4473bf019911 100644 --- a/src/tmpfiles/tmpfiles.c +++ b/src/tmpfiles/tmpfiles.c @@ -983,9 +983,11 @@ static int write_one_file(Item *i, const char *path) { log_debug_errno(errno, "Not writing \"%s\": %m", path); return 0; } - - log_error_errno(errno, "Failed to create file %s: %m", path); - return -errno; + r = -errno; + if (i->argument || r != -EROFS || stat(path, &st) < 0 || (i->type == TRUNCATE_FILE && st.st_size > 0)) { + log_error_errno(r, "Failed to create file %s: %m", path); + return r; + } } if (i->argument) { @@ -1154,6 +1156,10 @@ static int create_item(Item *i) { log_debug("Copying tree \"%s\" to \"%s\".", resolved, i->path); r = copy_tree(resolved, i->path, false); + + if (r == -EROFS && stat(i->path, &st) == 0) + r = -EEXIST; + if (r < 0) { struct stat a, b; -- 2.1.4 _______________________________________________ systemd-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/systemd-devel
