diff --git a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h index 957c26c10..5c276b4c0 100644 --- a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h +++ b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h @@ -230,8 +230,14 @@ class SnapshotManager final { // devices; // - CreateResult::ERROR if a fatal error occurred, mounting /system should // be aborted. + // This function mounts /metadata when called, and unmounts /metadata upon + // return. CreateResult RecoveryCreateSnapshotDevices(); + // Same as RecoveryCreateSnapshotDevices(), but does not auto mount/umount + // /metadata. + CreateResult RecoveryCreateSnapshotDevices(const std::unique_ptr& metadata_device); + // Dump debug information. bool Dump(std::ostream& os); diff --git a/fs_mgr/libsnapshot/snapshot.cpp b/fs_mgr/libsnapshot/snapshot.cpp index 7e84c48bd..2d59f0c1c 100644 --- a/fs_mgr/libsnapshot/snapshot.cpp +++ b/fs_mgr/libsnapshot/snapshot.cpp @@ -2584,6 +2584,20 @@ CreateResult SnapshotManager::RecoveryCreateSnapshotDevices() { LOG(ERROR) << "Couldn't mount Metadata."; return CreateResult::NOT_CREATED; } + return RecoveryCreateSnapshotDevices(mount); +} + +CreateResult SnapshotManager::RecoveryCreateSnapshotDevices( + const std::unique_ptr& metadata_device) { + if (!device_->IsRecovery()) { + LOG(ERROR) << __func__ << " is only allowed in recovery."; + return CreateResult::NOT_CREATED; + } + + if (metadata_device == nullptr || !metadata_device->HasDevice()) { + LOG(ERROR) << "Metadata not mounted."; + return CreateResult::NOT_CREATED; + } auto state_file = GetStateFilePath(); if (access(state_file.c_str(), F_OK) != 0 && errno == ENOENT) {