#include "mount-setup.h"
#include "special.h"
#include "mkdir.h"
-#include "virt.h"
#include "fileio.h"
static const char *arg_dest = "/tmp";
streq(me->mnt_dir, "/usr");
}
+static int add_fsck(FILE *f, const char *what, const char *where, const char *type, int passno) {
+ assert(f);
+
+ if (passno == 0)
+ return 0;
+
+ if (!is_device_path(what)) {
+ log_warning("Checking was requested for \"%s\", but it is not a device.", what);
+ return 0;
+ }
+
+ if (type && !streq(type, "auto")) {
+ int r;
+ const char *checker;
+
+ checker = strappenda("/sbin/fsck.", type);
+ r = access(checker, X_OK);
+ if (r < 0) {
+ log_warning("Checking was requested for %s, but %s cannot be used: %m", what, checker);
+
+ /* treat missing check as essentially OK */
+ return errno == ENOENT ? 0 : -errno;
+ }
+ }
+
+ if (streq(where, "/")) {
+ char *lnk;
+
+ lnk = strappenda(arg_dest, "/" SPECIAL_LOCAL_FS_TARGET ".wants/systemd-fsck-root.service");
+ mkdir_parents_label(lnk, 0755);
+ if (symlink(SYSTEM_DATA_UNIT_PATH "/systemd-fsck-root.service", lnk) < 0) {
+ log_error("Failed to create symlink %s: %m", lnk);
+ return -errno;
+ }
+ } else {
+ _cleanup_free_ char *fsck = NULL;
+
+ fsck = unit_name_from_path_instance("systemd-fsck", what, ".service");
+ if (!fsck)
+ return log_oom();
+
+ fprintf(f,
+ "RequiresOverridable=%s\n"
+ "After=%s\n",
+ fsck,
+ fsck);
+ }
+
+ return 0;
+}
+
static int add_mount(
const char *what,
const char *where,
*name = NULL, *unit = NULL, *lnk = NULL,
*automount_name = NULL, *automount_unit = NULL;
_cleanup_fclose_ FILE *f = NULL;
+ int r;
assert(what);
assert(where);
"Before=%s\n",
post);
+ r = add_fsck(f, what, where, type, passno);
+ if (r < 0)
+ return r;
+
fprintf(f,
"\n"
"[Mount]\n"
"What=%s\n"
"Where=%s\n"
- "Type=%s\n"
- "FsckPassNo=%i\n",
+ "Type=%s\n",
what,
where,
- type,
- passno);
+ type);
if (!isempty(opts) &&
!streq(opts, "defaults"))
static int parse_new_root_from_proc_cmdline(void) {
_cleanup_free_ char *what = NULL, *type = NULL, *opts = NULL, *line = NULL;
+ bool noauto, nofail;
char *w, *state;
- int r;
size_t l;
- bool noauto, nofail;
+ int r;
- r = read_one_line_file("/proc/cmdline", &line);
- if (r < 0) {
- log_error("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
+ r = proc_cmdline(&line);
+ if (r < 0)
+ log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
+ if (r <= 0)
return 0;
- }
opts = strdup("ro");
type = strdup("auto");
return (r < 0) ? r : 0;
}
-static int parse_proc_cmdline(void) {
- _cleanup_free_ char *line = NULL;
- char *w, *state;
+static int parse_proc_cmdline_word(const char *word) {
int r;
- size_t l;
-
- if (detect_container(NULL) > 0)
- return 0;
-
- r = read_one_line_file("/proc/cmdline", &line);
- if (r < 0) {
- log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
- return 0;
- }
- FOREACH_WORD_QUOTED(w, l, line, state) {
- _cleanup_free_ char *word = NULL;
+ if (startswith(word, "fstab=")) {
+ r = parse_boolean(word + 6);
+ if (r < 0)
+ log_warning("Failed to parse fstab switch %s. Ignoring.", word + 6);
+ else
+ arg_enabled = r;
- word = strndup(w, l);
- if (!word)
- return log_oom();
+ } else if (startswith(word, "rd.fstab=")) {
- if (startswith(word, "fstab=")) {
- r = parse_boolean(word + 6);
+ if (in_initrd()) {
+ r = parse_boolean(word + 9);
if (r < 0)
- log_warning("Failed to parse fstab switch %s. Ignoring.", word + 6);
+ log_warning("Failed to parse fstab switch %s. Ignoring.", word + 9);
else
arg_enabled = r;
+ }
- } else if (startswith(word, "rd.fstab=")) {
-
- if (in_initrd()) {
- r = parse_boolean(word + 9);
- if (r < 0)
- log_warning("Failed to parse fstab switch %s. Ignoring.", word + 9);
- else
- arg_enabled = r;
- }
-
- } else if (startswith(word, "fstab.") ||
- (in_initrd() && startswith(word, "rd.fstab."))) {
+ } else if (startswith(word, "fstab.") ||
+ (in_initrd() && startswith(word, "rd.fstab."))) {
- log_warning("Unknown kernel switch %s. Ignoring.", word);
- }
+ log_warning("Unknown kernel switch %s. Ignoring.", word);
}
return 0;
umask(0022);
- if (parse_proc_cmdline() < 0)
+ if (parse_proc_cmdline(parse_proc_cmdline_word) < 0)
return EXIT_FAILURE;
if (in_initrd())