1
0
mirror of https://github.com/systemd/systemd.git synced 2025-03-14 04:58:28 +03:00

remount-fs: split-out remount_by_fstab()

No functional change, just refactoring and preparation for later
commits.
This commit is contained in:
Yu Watanabe 2023-08-09 01:57:16 +09:00
parent b564224b37
commit 1be6f21320

View File

@ -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. */