On Thu, Apr 30, 2015 at 08:50:38PM +0200, Michael Olbrich wrote: > 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. Applied, with some small changes, see below.
> > 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; > + } I reverted the condition, because it seems safer to whitelist instead of blacklisting. Also, if the condition didn't succeed, we'd do stat twice. Please check that it still works as intended. > } > > 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; Zbyszek _______________________________________________ systemd-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/systemd-devel
