From a7f1a9fec830aeaaa02f78cfdd4d17e0f75ab848 Mon Sep 17 00:00:00 2001 From: Tom Cherry Date: Thu, 19 Nov 2020 11:39:39 -0800 Subject: [PATCH] fs_mgr: move mkdir(mount_point) to prepare_fs_for_mount() prepare_fs_for_mount() attempts to mount() the block device at the mount_point, so it must be created beforehand, as opposed to later in __mount() where it is done now. Also fix slight bugs with using fstab.mount_point instead of an alternative specified mount_point. Test: boot Change-Id: I758b6a6efe2dd99433fc1974b69cb6f7ce3bc0c2 --- fs_mgr/fs_mgr.cpp | 49 ++++++++++++++++++++++++++--------------------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/fs_mgr/fs_mgr.cpp b/fs_mgr/fs_mgr.cpp index 6294b3f4b..4c9fd9b08 100644 --- a/fs_mgr/fs_mgr.cpp +++ b/fs_mgr/fs_mgr.cpp @@ -656,7 +656,17 @@ bool fs_mgr_is_f2fs(const std::string& blk_device) { // If needed, we'll also enable (or disable) filesystem features as specified by // the fstab record. // -static int prepare_fs_for_mount(const std::string& blk_device, const FstabEntry& entry) { +static int prepare_fs_for_mount(const std::string& blk_device, const FstabEntry& entry, + const std::string& alt_mount_point = "") { + auto& mount_point = alt_mount_point.empty() ? entry.mount_point : alt_mount_point; + // We need this because sometimes we have legacy symlinks that are + // lingering around and need cleaning up. + struct stat info; + if (lstat(mount_point.c_str(), &info) == 0 && (info.st_mode & S_IFMT) == S_IFLNK) { + unlink(mount_point.c_str()); + } + mkdir(mount_point.c_str(), 0755); + int fs_stat = 0; if (is_extfs(entry.fs_type)) { @@ -684,7 +694,7 @@ static int prepare_fs_for_mount(const std::string& blk_device, const FstabEntry& if (entry.fs_mgr_flags.check || (fs_stat & (FS_STAT_UNCLEAN_SHUTDOWN | FS_STAT_QUOTA_ENABLED))) { - check_fs(blk_device, entry.fs_type, entry.mount_point, &fs_stat); + check_fs(blk_device, entry.fs_type, mount_point, &fs_stat); } if (is_extfs(entry.fs_type) && @@ -729,13 +739,6 @@ bool fs_mgr_is_device_unlocked() { // sets the underlying block device to read-only if the mount is read-only. // See "man 2 mount" for return values. static int __mount(const std::string& source, const std::string& target, const FstabEntry& entry) { - // We need this because sometimes we have legacy symlinks that are - // lingering around and need cleaning up. - struct stat info; - if (lstat(target.c_str(), &info) == 0 && (info.st_mode & S_IFMT) == S_IFLNK) { - unlink(target.c_str()); - } - mkdir(target.c_str(), 0755); errno = 0; unsigned long mountflags = entry.flags; int ret = 0; @@ -1799,17 +1802,18 @@ int fs_mgr_remount_userdata_into_checkpointing(Fstab* fstab) { // wrapper to __mount() and expects a fully prepared fstab_rec, // unlike fs_mgr_do_mount which does more things with avb / verity etc. -int fs_mgr_do_mount_one(const FstabEntry& entry, const std::string& mount_point) { +int fs_mgr_do_mount_one(const FstabEntry& entry, const std::string& alt_mount_point) { // First check the filesystem if requested. if (entry.fs_mgr_flags.wait && !WaitForFile(entry.blk_device, 20s)) { LERROR << "Skipping mounting '" << entry.blk_device << "'"; } - // Run fsck if needed - prepare_fs_for_mount(entry.blk_device, entry); + auto& mount_point = alt_mount_point.empty() ? entry.mount_point : alt_mount_point; - int ret = - __mount(entry.blk_device, mount_point.empty() ? entry.mount_point : mount_point, entry); + // Run fsck if needed + prepare_fs_for_mount(entry.blk_device, entry, mount_point); + + int ret = __mount(entry.blk_device, mount_point, entry); if (ret) { ret = (errno == EBUSY) ? FS_MGR_DOMNT_BUSY : FS_MGR_DOMNT_FAILED; } @@ -1868,7 +1872,14 @@ static int fs_mgr_do_mount_helper(Fstab* fstab, const std::string& n_name, continue; } - int fs_stat = prepare_fs_for_mount(n_blk_device, fstab_entry); + // Now mount it where requested */ + if (tmp_mount_point) { + mount_point = tmp_mount_point; + } else { + mount_point = fstab_entry.mount_point; + } + + int fs_stat = prepare_fs_for_mount(n_blk_device, fstab_entry, mount_point); if (fstab_entry.fs_mgr_flags.avb) { if (!avb_handle) { @@ -1902,12 +1913,6 @@ static int fs_mgr_do_mount_helper(Fstab* fstab, const std::string& n_name, } } - // Now mount it where requested */ - if (tmp_mount_point) { - mount_point = tmp_mount_point; - } else { - mount_point = fstab_entry.mount_point; - } int retry_count = 2; while (retry_count-- > 0) { if (!__mount(n_blk_device, mount_point, fstab_entry)) { @@ -1919,7 +1924,7 @@ static int fs_mgr_do_mount_helper(Fstab* fstab, const std::string& n_name, mount_errors++; fs_stat |= FS_STAT_FULL_MOUNT_FAILED; // try again after fsck - check_fs(n_blk_device, fstab_entry.fs_type, fstab_entry.mount_point, &fs_stat); + check_fs(n_blk_device, fstab_entry.fs_type, mount_point, &fs_stat); } } log_fs_stat(fstab_entry.blk_device, fs_stat);