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 4515592387b..25e661105b0 100644 --- a/src/remount-fs/remount-fs.c +++ b/src/remount-fs/remount-fs.c @@ -69,41 +69,57 @@ 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; - log_setup(); - - if (argc > 1) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "This program takes no arguments."); - - umask(0022); + 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()); - } 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; + return 0; + } - r = do_remount(me->mnt_dir, false, &pids); - if (r < 0) - return r; - } + 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 (!has_root) { + 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) + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), + "This program takes no arguments."); + + umask(0022); + + 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. */ -- 2.47.3