chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Revert "fstab-generator: place initrd /sysroot mounts in initrd-fs.target"
[elogind.git]
/
src
/
fstab-generator
/
fstab-generator.c
diff --git
a/src/fstab-generator/fstab-generator.c
b/src/fstab-generator/fstab-generator.c
index a0173d821eb9f17a0d42e808725fb39ff0a2ce83..910bbc1df729aef2159e242f04123cdd6bf20a97 100644
(file)
--- a/
src/fstab-generator/fstab-generator.c
+++ b/
src/fstab-generator/fstab-generator.c
@@
-33,6
+33,7
@@
#include "special.h"
#include "mkdir.h"
#include "virt.h"
#include "special.h"
#include "mkdir.h"
#include "virt.h"
+#include "fileio.h"
static const char *arg_dest = "/tmp";
static bool arg_enabled = true;
static const char *arg_dest = "/tmp";
static bool arg_enabled = true;
@@
-79,8
+80,8
@@
static int mount_find_pri(struct mntent *me, int *ret) {
}
static int add_swap(const char *what, struct mntent *me) {
}
static int add_swap(const char *what, struct mntent *me) {
- char *name = NULL, *unit = NULL, *lnk = NULL, *device = NULL;
- FILE *f = NULL;
+ char
_cleanup_free_
*name = NULL, *unit = NULL, *lnk = NULL, *device = NULL;
+ FILE
_cleanup_fclose_
*f = NULL;
bool noauto, nofail;
int r, pri = -1;
bool noauto, nofail;
int r, pri = -1;
@@
-97,25
+98,20
@@
static int add_swap(const char *what, struct mntent *me) {
nofail = !!hasmntopt(me, "nofail");
name = unit_name_from_path(what, ".swap");
nofail = !!hasmntopt(me, "nofail");
name = unit_name_from_path(what, ".swap");
- if (!name) {
- r = log_oom();
- goto finish;
- }
+ if (!name)
+ return log_oom();
unit = strjoin(arg_dest, "/", name, NULL);
unit = strjoin(arg_dest, "/", name, NULL);
- if (!unit) {
- r = log_oom();
- goto finish;
- }
+ if (!unit)
+ return log_oom();
f = fopen(unit, "wxe");
if (!f) {
f = fopen(unit, "wxe");
if (!f) {
- r = -errno;
if (errno == EEXIST)
log_error("Failed to create swap unit file %s, as it already exists. Duplicate entry in /etc/fstab?", unit);
else
log_error("Failed to create unit file %s: %m", unit);
if (errno == EEXIST)
log_error("Failed to create swap unit file %s, as it already exists. Duplicate entry in /etc/fstab?", unit);
else
log_error("Failed to create unit file %s: %m", unit);
-
goto finish
;
+
return -errno
;
}
fputs("# Automatically generated by systemd-fstab-generator\n\n"
}
fputs("# Automatically generated by systemd-fstab-generator\n\n"
@@
-142,56
+138,39
@@
static int add_swap(const char *what, struct mntent *me) {
fflush(f);
if (ferror(f)) {
log_error("Failed to write unit file %s: %m", unit);
fflush(f);
if (ferror(f)) {
log_error("Failed to write unit file %s: %m", unit);
- r = -errno;
- goto finish;
+ return -errno;
}
if (!noauto) {
lnk = strjoin(arg_dest, "/" SPECIAL_SWAP_TARGET ".wants/", name, NULL);
}
if (!noauto) {
lnk = strjoin(arg_dest, "/" SPECIAL_SWAP_TARGET ".wants/", name, NULL);
- if (!lnk) {
- r = log_oom();
- goto finish;
- }
+ if (!lnk)
+ return log_oom();
mkdir_parents_label(lnk, 0755);
if (symlink(unit, lnk) < 0) {
log_error("Failed to create symlink %s: %m", lnk);
mkdir_parents_label(lnk, 0755);
if (symlink(unit, lnk) < 0) {
log_error("Failed to create symlink %s: %m", lnk);
- r = -errno;
- goto finish;
+ return -errno;
}
r = device_name(what, &device);
if (r < 0)
}
r = device_name(what, &device);
if (r < 0)
-
goto finish
;
+
return r
;
if (r > 0) {
free(lnk);
lnk = strjoin(arg_dest, "/", device, ".wants/", name, NULL);
if (r > 0) {
free(lnk);
lnk = strjoin(arg_dest, "/", device, ".wants/", name, NULL);
- if (!lnk) {
- r = log_oom();
- goto finish;
- }
+ if (!lnk)
+ return log_oom();
mkdir_parents_label(lnk, 0755);
if (symlink(unit, lnk) < 0) {
log_error("Failed to create symlink %s: %m", lnk);
mkdir_parents_label(lnk, 0755);
if (symlink(unit, lnk) < 0) {
log_error("Failed to create symlink %s: %m", lnk);
- r = -errno;
- goto finish;
+ return -errno;
}
}
}
}
}
}
- r = 0;
-finish:
- if (f)
- fclose(f);
-
- free(unit);
- free(lnk);
- free(name);
- free(device);
-
- return r;
+ return 0;
}
static bool mount_is_bind(struct mntent *me) {
}
static bool mount_is_bind(struct mntent *me) {
@@
-199,7
+178,9
@@
static bool mount_is_bind(struct mntent *me) {
return
hasmntopt(me, "bind") ||
return
hasmntopt(me, "bind") ||
- streq(me->mnt_type, "bind");
+ streq(me->mnt_type, "bind") ||
+ hasmntopt(me, "rbind") ||
+ streq(me->mnt_type, "rbind");
}
static bool mount_is_network(struct mntent *me) {
}
static bool mount_is_network(struct mntent *me) {
@@
-210,11
+191,21
@@
static bool mount_is_network(struct mntent *me) {
fstype_is_network(me->mnt_type);
}
fstype_is_network(me->mnt_type);
}
+static bool mount_in_initrd(struct mntent *me) {
+ assert(me);
+
+ return
+ hasmntopt(me, "x-initrd.mount") ||
+ streq(me->mnt_dir, "/usr");
+}
+
static int add_mount(const char *what, const char *where, const char *type, const char *opts,
static int add_mount(const char *what, const char *where, const char *type, const char *opts,
- int passno, bool
wait, bool
noauto, bool nofail, bool automount, bool isbind, bool isnetwork,
+ int passno, bool noauto, bool nofail, bool automount, bool isbind, bool isnetwork,
const char *source) {
const char *source) {
- char *name = NULL, *unit = NULL, *lnk = NULL, *device = NULL, *automount_name = NULL, *automount_unit = NULL;
- FILE *f = NULL;
+ char _cleanup_free_
+ *name = NULL, *unit = NULL, *lnk = NULL, *device = NULL,
+ *automount_name = NULL, *automount_unit = NULL;
+ FILE _cleanup_fclose_ *f = NULL;
int r;
const char *post, *pre;
int r;
const char *post, *pre;
@@
-245,25
+236,20
@@
static int add_mount(const char *what, const char *where, const char *type, cons
}
name = unit_name_from_path(where, ".mount");
}
name = unit_name_from_path(where, ".mount");
- if (!name) {
- r = log_oom();
- goto finish;
- }
+ if (!name)
+ return log_oom();
unit = strjoin(arg_dest, "/", name, NULL);
unit = strjoin(arg_dest, "/", name, NULL);
- if (!unit) {
- r = log_oom();
- goto finish;
- }
+ if (!unit)
+ return log_oom();
f = fopen(unit, "wxe");
if (!f) {
f = fopen(unit, "wxe");
if (!f) {
- r = -errno;
if (errno == EEXIST)
log_error("Failed to create mount unit file %s, as it already exists. Duplicate entry in /etc/fstab?", unit);
else
log_error("Failed to create unit file %s: %m", unit);
if (errno == EEXIST)
log_error("Failed to create mount unit file %s, as it already exists. Duplicate entry in /etc/fstab?", unit);
else
log_error("Failed to create unit file %s: %m", unit);
-
goto finish
;
+
return -errno
;
}
fprintf(f,
}
fprintf(f,
@@
-306,29
+292,21
@@
static int add_mount(const char *what, const char *where, const char *type, cons
"Options=%s\n",
opts);
"Options=%s\n",
opts);
- if (wait)
- fprintf(f,
- "TimeoutSec=0\n");
-
fflush(f);
if (ferror(f)) {
log_error("Failed to write unit file %s: %m", unit);
fflush(f);
if (ferror(f)) {
log_error("Failed to write unit file %s: %m", unit);
- r = -errno;
- goto finish;
+ return -errno;
}
if (!noauto) {
lnk = strjoin(arg_dest, "/", post, nofail || automount ? ".wants/" : ".requires/", name, NULL);
}
if (!noauto) {
lnk = strjoin(arg_dest, "/", post, nofail || automount ? ".wants/" : ".requires/", name, NULL);
- if (!lnk) {
- r = log_oom();
- goto finish;
- }
+ if (!lnk)
+ return log_oom();
mkdir_parents_label(lnk, 0755);
if (symlink(unit, lnk) < 0) {
log_error("Failed to create symlink %s: %m", lnk);
mkdir_parents_label(lnk, 0755);
if (symlink(unit, lnk) < 0) {
log_error("Failed to create symlink %s: %m", lnk);
- r = -errno;
- goto finish;
+ return -errno;
}
if (!isbind &&
}
if (!isbind &&
@@
-336,21
+314,18
@@
static int add_mount(const char *what, const char *where, const char *type, cons
r = device_name(what, &device);
if (r < 0)
r = device_name(what, &device);
if (r < 0)
-
goto finish
;
+
return r
;
if (r > 0) {
free(lnk);
lnk = strjoin(arg_dest, "/", device, ".wants/", name, NULL);
if (r > 0) {
free(lnk);
lnk = strjoin(arg_dest, "/", device, ".wants/", name, NULL);
- if (!lnk) {
- r = log_oom();
- goto finish;
- }
+ if (!lnk)
+ return log_oom();
mkdir_parents_label(lnk, 0755);
if (symlink(unit, lnk) < 0) {
log_error("Failed to create symlink %s: %m", lnk);
mkdir_parents_label(lnk, 0755);
if (symlink(unit, lnk) < 0) {
log_error("Failed to create symlink %s: %m", lnk);
- r = -errno;
- goto finish;
+ return -errno;
}
}
}
}
}
}
@@
-358,104
+333,83
@@
static int add_mount(const char *what, const char *where, const char *type, cons
if (automount && !path_equal(where, "/")) {
automount_name = unit_name_from_path(where, ".automount");
if (automount && !path_equal(where, "/")) {
automount_name = unit_name_from_path(where, ".automount");
- if (!name) {
- r = log_oom();
- goto finish;
- }
+ if (!name)
+ return log_oom();
automount_unit = strjoin(arg_dest, "/", automount_name, NULL);
automount_unit = strjoin(arg_dest, "/", automount_name, NULL);
- if (!automount_unit) {
- r = log_oom();
- goto finish;
- }
+ if (!automount_unit)
+ return log_oom();
fclose(f);
f = fopen(automount_unit, "wxe");
if (!f) {
fclose(f);
f = fopen(automount_unit, "wxe");
if (!f) {
- r = -errno;
log_error("Failed to create unit file %s: %m", automount_unit);
log_error("Failed to create unit file %s: %m", automount_unit);
-
goto finish
;
+
return -errno
;
}
fprintf(f,
"# Automatically generated by systemd-fstab-generator\n\n"
"[Unit]\n"
}
fprintf(f,
"# Automatically generated by systemd-fstab-generator\n\n"
"[Unit]\n"
- "SourcePath=
/etc/fstab
\n"
+ "SourcePath=
%s
\n"
"DefaultDependencies=no\n"
"Conflicts=" SPECIAL_UMOUNT_TARGET "\n"
"Before=" SPECIAL_UMOUNT_TARGET " %s\n"
"\n"
"[Automount]\n"
"Where=%s\n",
"DefaultDependencies=no\n"
"Conflicts=" SPECIAL_UMOUNT_TARGET "\n"
"Before=" SPECIAL_UMOUNT_TARGET " %s\n"
"\n"
"[Automount]\n"
"Where=%s\n",
+ source,
post,
where);
fflush(f);
if (ferror(f)) {
log_error("Failed to write unit file %s: %m", automount_unit);
post,
where);
fflush(f);
if (ferror(f)) {
log_error("Failed to write unit file %s: %m", automount_unit);
- r = -errno;
- goto finish;
+ return -errno;
}
free(lnk);
lnk = strjoin(arg_dest, "/", post, nofail ? ".wants/" : ".requires/", automount_name, NULL);
}
free(lnk);
lnk = strjoin(arg_dest, "/", post, nofail ? ".wants/" : ".requires/", automount_name, NULL);
- if (!lnk) {
- r = log_oom();
- goto finish;
- }
+ if (!lnk)
+ return log_oom();
mkdir_parents_label(lnk, 0755);
if (symlink(automount_unit, lnk) < 0) {
log_error("Failed to create symlink %s: %m", lnk);
mkdir_parents_label(lnk, 0755);
if (symlink(automount_unit, lnk) < 0) {
log_error("Failed to create symlink %s: %m", lnk);
- r = -errno;
- goto finish;
+ return -errno;
}
}
}
}
- r = 0;
-finish:
- if (f)
- fclose(f);
-
- free(unit);
- free(lnk);
- free(name);
- free(device);
- free(automount_name);
- free(automount_unit);
-
- return r;
+ return 0;
}
}
-static int parse_fstab(
voi
d) {
+static int parse_fstab(
const char *prefix, bool initr
d) {
FILE *f;
FILE *f;
+ _cleanup_free_ char *fstab_path = NULL;
int r = 0;
struct mntent *me;
errno = 0;
int r = 0;
struct mntent *me;
errno = 0;
- f = setmntent("/etc/fstab", "r");
+ fstab_path = strjoin(prefix, "/etc/fstab", NULL);
+ f = setmntent(fstab_path, "r");
if (!f) {
if (errno == ENOENT)
return 0;
if (!f) {
if (errno == ENOENT)
return 0;
- log_error("Failed to open
/etc/fstab: %m"
);
+ log_error("Failed to open
%s/etc/fstab: %m", prefix
);
return -errno;
}
while ((me = getmntent(f))) {
return -errno;
}
while ((me = getmntent(f))) {
- char
*where, *what
;
+ char
_cleanup_free_ *where = NULL, *what = NULL
;
int k;
int k;
- what = fstab_node_to_udev_node(me->mnt_fsname);
- if (!what) {
- r = log_oom();
- goto finish;
- }
+ if (initrd && !mount_in_initrd(me))
+ continue;
- where = strdup(me->mnt_dir);
- if (!where) {
+ what = fstab_node_to_udev_node(me->mnt_fsname);
+ where = strjoin(prefix, me->mnt_dir, NULL);
+ if (!what || !where) {
r = log_oom();
r = log_oom();
- free(what);
goto finish;
}
goto finish;
}
@@
-478,14
+432,10
@@
static int parse_fstab(void) {
isnetwork = mount_is_network(me);
k = add_mount(what, where, me->mnt_type, me->mnt_opts,
isnetwork = mount_is_network(me);
k = add_mount(what, where, me->mnt_type, me->mnt_opts,
- me->mnt_passno, false, noauto, nofail,
- automount, isbind, isnetwork,
- "/etc/fstab");
+ me->mnt_passno, noauto, nofail, automount,
+ isbind, isnetwork, fstab_path);
}
}
- free(what);
- free(where);
-
if (k < 0)
r = k;
}
if (k < 0)
r = k;
}
@@
-500,7
+450,6
@@
static int parse_new_root_from_proc_cmdline(void) {
_cleanup_free_ char *what = NULL, *type = NULL, *opts = NULL, *line = NULL;
int r;
size_t l;
_cleanup_free_ char *what = NULL, *type = NULL, *opts = NULL, *line = NULL;
int r;
size_t l;
- bool wait = false;
r = read_one_line_file("/proc/cmdline", &line);
if (r < 0) {
r = read_one_line_file("/proc/cmdline", &line);
if (r < 0) {
@@
-508,15
+457,13
@@
static int parse_new_root_from_proc_cmdline(void) {
return 0;
}
return 0;
}
- opts = strdup("defaults");
- if (!opts)
- return log_oom();
+ opts = strdup("ro");
type = strdup("auto");
type = strdup("auto");
- if (!type)
+ if (!
opts || !
type)
return log_oom();
return log_oom();
- /* root= and roofstype= may occur more than once, the last instance should take precedence.
- * In the case of multiple rootflags= the arguments should be concatenated */
+
/* root= and roofstype= may occur more than once, the last instance should take precedence.
+
* In the case of multiple rootflags= the arguments should be concatenated */
FOREACH_WORD_QUOTED(w, l, line, state) {
char *word, *tmp_word;
FOREACH_WORD_QUOTED(w, l, line, state) {
char *word, *tmp_word;
@@
-550,28
+497,31
@@
static int parse_new_root_from_proc_cmdline(void) {
if (!opts)
return log_oom();
if (!opts)
return log_oom();
- } else if (streq(word, "rootwait"))
- wait = true;
+ }
free(word);
}
free(word);
}
- if (what) {
+ if (!what) {
+ log_error("Could not find a root= entry on the kernel commandline.");
+ return 0;
+ }
- log_debug("Found entry what=%s where=/new_root type=%s", what, type);
- r = add_mount(what, "/new_root", type, opts, 0, wait, false, false,
- false, false, false, "/proc/cmdline");
+ if (what[0] != '/') {
+ log_debug("Skipping entry what=%s where=/sysroot type=%s", what, type);
+ return 0;
+ }
- if (r < 0)
- return r;
- } else
- log_error("Could not find a root= entry on the kernel commandline.");
+ log_debug("Found entry what=%s where=/sysroot type=%s", what, type);
+ r = add_mount(what, "/sysroot", type, opts, 0, false, false, false,
+ false, false, "/proc/cmdline");
- return 0;
+ return
(r < 0) ? r :
0;
}
static int parse_proc_cmdline(void) {
}
static int parse_proc_cmdline(void) {
- char *line, *w, *state;
+ char _cleanup_free_ *line = NULL;
+ char *w, *state;
int r;
size_t l;
int r;
size_t l;
@@
-585,13
+535,11
@@
static int parse_proc_cmdline(void) {
}
FOREACH_WORD_QUOTED(w, l, line, state) {
}
FOREACH_WORD_QUOTED(w, l, line, state) {
- char
*word
;
+ char
_cleanup_free_ *word = NULL
;
word = strndup(w, l);
word = strndup(w, l);
- if (!word) {
- r = log_oom();
- goto finish;
- }
+ if (!word)
+ return log_oom();
if (startswith(word, "fstab=")) {
r = parse_boolean(word + 6);
if (startswith(word, "fstab=")) {
r = parse_boolean(word + 6);
@@
-615,19
+563,13
@@
static int parse_proc_cmdline(void) {
log_warning("Unknown kernel switch %s. Ignoring.", word);
}
log_warning("Unknown kernel switch %s. Ignoring.", word);
}
-
- free(word);
}
}
- r = 0;
-
-finish:
- free(line);
- return r;
+ return 0;
}
int main(int argc, char *argv[]) {
}
int main(int argc, char *argv[]) {
- int r
, k
= 0;
+ int r
= 0, k, l
= 0;
if (argc > 1 && argc != 4) {
log_error("This program takes three or no arguments.");
if (argc > 1 && argc != 4) {
log_error("This program takes three or no arguments.");
@@
-647,12
+589,15
@@
int main(int argc, char *argv[]) {
return EXIT_FAILURE;
if (in_initrd())
return EXIT_FAILURE;
if (in_initrd())
-
k
= parse_new_root_from_proc_cmdline();
+
r
= parse_new_root_from_proc_cmdline();
if (!arg_enabled)
if (!arg_enabled)
- return EXIT_SUCCESS;
+ return
(r < 0) ? EXIT_FAILURE :
EXIT_SUCCESS;
- r = parse_fstab();
+ k = parse_fstab("", false);
+
+ if (in_initrd())
+ l = parse_fstab("/sysroot", true);
- return (r < 0) || (k < 0) ? EXIT_FAILURE : EXIT_SUCCESS;
+ return (r < 0) || (k < 0)
|| (l < 0)
? EXIT_FAILURE : EXIT_SUCCESS;
}
}