From 1be6f21320de1992abf45d893bc23dc187b112df Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Wed, 9 Aug 2023 01:57:16 +0900 Subject: [PATCH] remount-fs: split-out remount_by_fstab() No functional change, just refactoring and preparation for later commits. --- src/remount-fs/remount-fs.c | 58 +++++++++++++++++++++++-------------- 1 file changed, 37 insertions(+), 21 deletions(-) diff --git a/src/remount-fs/remount-fs.c b/src/remount-fs/remount-fs.c index 4515592387..25e661105b 100644 --- a/src/remount-fs/remount-fs.c +++ b/src/remount-fs/remount-fs.c @@ -69,13 +69,45 @@ static int do_remount(const char *path, bool force_rw, Hashmap **pids) { return track_pid(pids, path, pid); } -static int run(int argc, char *argv[]) { +static int remount_by_fstab(Hashmap **ret_pids) { _cleanup_hashmap_free_free_ Hashmap *pids = NULL; _cleanup_endmntent_ FILE *f = NULL; bool has_root = false; struct mntent* me; int r; + assert(ret_pids); + + f = setmntent(fstab_path(), "re"); + if (!f) { + if (errno != ENOENT) + return log_error_errno(errno, "Failed to open %s: %m", fstab_path()); + + return 0; + } + + while ((me = getmntent(f))) { + /* Remount the root fs, /usr, and all API VFSs */ + if (!mount_point_is_api(me->mnt_dir) && + !PATH_IN_SET(me->mnt_dir, "/", "/usr")) + continue; + + if (path_equal(me->mnt_dir, "/")) + has_root = true; + + r = do_remount(me->mnt_dir, false, &pids); + if (r < 0) + return r; + } + + *ret_pids = TAKE_PTR(pids); + return has_root; +} + +static int run(int argc, char *argv[]) { + _cleanup_hashmap_free_free_ Hashmap *pids = NULL; + int r; + log_setup(); if (argc > 1) @@ -84,26 +116,10 @@ static int run(int argc, char *argv[]) { umask(0022); - f = setmntent(fstab_path(), "re"); - if (!f) { - if (errno != ENOENT) - return log_error_errno(errno, "Failed to open %s: %m", fstab_path()); - } else - while ((me = getmntent(f))) { - /* Remount the root fs, /usr, and all API VFSs */ - if (!mount_point_is_api(me->mnt_dir) && - !PATH_IN_SET(me->mnt_dir, "/", "/usr")) - continue; - - if (path_equal(me->mnt_dir, "/")) - has_root = true; - - r = do_remount(me->mnt_dir, false, &pids); - if (r < 0) - return r; - } - - if (!has_root) { + r = remount_by_fstab(&pids); + if (r < 0) + return r; + if (r == 0) { /* The $SYSTEMD_REMOUNT_ROOT_RW environment variable is set by systemd-gpt-auto-generator to tell us * whether to remount things. We honour it only if there's no explicit line in /etc/fstab configured * which takes precedence. */