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 23a8d7981314926e2d657ea164fbbf2ee6feab21..910bbc1df729aef2159e242f04123cdd6bf20a97 100644
(file)
--- a/
src/fstab-generator/fstab-generator.c
+++ b/
src/fstab-generator/fstab-generator.c
@@
-191,6
+191,14
@@
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,
int passno, bool noauto, bool nofail, bool automount, bool isbind, bool isnetwork,
const char *source) {
static int add_mount(const char *what, const char *where, const char *type, const char *opts,
int passno, bool noauto, bool nofail, bool automount, bool isbind, bool isnetwork,
const char *source) {
@@
-342,13
+350,14
@@
static int add_mount(const char *what, const char *where, const char *type, cons
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);
post,
where);
@@
-373,18
+382,20
@@
static int add_mount(const char *what, const char *where, const char *type, cons
return 0;
}
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;
}
return -errno;
}
@@
-392,8
+403,11
@@
static int parse_fstab(void) {
char _cleanup_free_ *where = NULL, *what = NULL;
int k;
char _cleanup_free_ *where = NULL, *what = NULL;
int k;
+ if (initrd && !mount_in_initrd(me))
+ continue;
+
what = fstab_node_to_udev_node(me->mnt_fsname);
what = fstab_node_to_udev_node(me->mnt_fsname);
- where = str
dup(me->mnt_dir
);
+ where = str
join(prefix, me->mnt_dir, NULL
);
if (!what || !where) {
r = log_oom();
goto finish;
if (!what || !where) {
r = log_oom();
goto finish;
@@
-419,7
+433,7
@@
static int parse_fstab(void) {
k = add_mount(what, where, me->mnt_type, me->mnt_opts,
me->mnt_passno, noauto, nofail, automount,
k = add_mount(what, where, me->mnt_type, me->mnt_opts,
me->mnt_passno, noauto, nofail, automount,
- isbind, isnetwork,
"/etc/fstab"
);
+ isbind, isnetwork,
fstab_path
);
}
if (k < 0)
}
if (k < 0)
@@
-488,18
+502,21
@@
static int parse_new_root_from_proc_cmdline(void) {
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=/sysroot type=%s", what, type);
- r = add_mount(what, "/sysroot", type, opts, 0, 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) {
@@
-552,7
+569,7
@@
static int parse_proc_cmdline(void) {
}
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.");
@@
-572,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;
}
}