[zircon] Revert "[zircon] Reformat zxcrypt and minfs partitions when the partition is"
This reverts commit 2dcfdba2e3fe666404a8b8fafc5574cfed66056c.
Reason for revert: Failed boot on vim2
Original change's description:
> [zircon] Reformat zxcrypt and minfs partitions when the partition is
> missing. Added a unit test that failed without the changes.
>
> Change-Id: Idaf9913bf9006384e021f39047df1e8e8a855369
TBR=smklein@google.com,aarongreen@google.com,abarth@google.com,zarvox@google.com,jseibert@google.com
Change-Id: I0e755d84dc4839e8968308ca753aa1d9c9c5038b
diff --git a/zircon/system/core/devmgr/fshost/block-watcher.cpp b/zircon/system/core/devmgr/fshost/block-watcher.cpp
index 77e518e..7aa1582c 100644
--- a/zircon/system/core/devmgr/fshost/block-watcher.cpp
+++ b/zircon/system/core/devmgr/fshost/block-watcher.cpp
@@ -494,53 +494,6 @@
return 0;
}
-disk_format_t ReformatDataPartition(fbl::unique_fd fd, zx_handle_t disk_channel,
- const char* device_path) {
- zx_status_t call_status;
- fbl::StringBuffer<PATH_MAX> path;
- path.Resize(path.capacity());
- size_t path_len;
- // Both the zxcrypt and minfs partitions have the same gpt guid, so here we
- // determine which one we actually need to format. We do this by looking up
- // the topological path, if it is the zxcrypt driver, then we format it as
- // minfs, otherwise as zxcrypt.
- if (fuchsia_device_ControllerGetTopologicalPath(disk_channel, &call_status, path.data(),
- path.capacity(), &path_len) != ZX_OK) {
- return DISK_FORMAT_UNKNOWN;
- }
- const fbl::StringPiece kZxcryptPath("/zxcrypt/unsealed/block");
- if (fbl::StringPiece(path.begin() + path_len - kZxcryptPath.length()).compare(kZxcryptPath) == 0) {
- printf("fshost: Minfs data partition is corrupt. Will attempt to reformat %s\n", device_path);
- if (mkfs(device_path, DISK_FORMAT_MINFS, launch_stdio_sync, &default_mkfs_options) == ZX_OK) {
- return DISK_FORMAT_MINFS;
- }
- } else {
- printf("fshost: zxcrypt volume is corrupt. Will attempt to reformat %s\n", device_path);
- if (zxcrypt::FdioVolume::CreateWithDeviceKey(std::move(fd), nullptr) == ZX_OK) {
- return DISK_FORMAT_ZXCRYPT;
- }
- }
- return DISK_FORMAT_UNKNOWN;
-}
-
-// Attempts to reformat the partition at the device path. Returns the specific
-// disk format if successful and unknown otherwise. Currently only works for
-// minfs and zxcrypt data partitions.
-disk_format_t ReformatPartition(fbl::unique_fd fd, zx_handle_t disk_channel,
- const char* device_path) {
- zx_status_t call_status, io_status;
- fuchsia_hardware_block_partition_GUID guid;
- io_status = fuchsia_hardware_block_partition_PartitionGetTypeGuid(disk_channel, &call_status,
- &guid);
- if (io_status != ZX_OK || call_status != ZX_OK) {
- return DISK_FORMAT_UNKNOWN;
- }
- if (gpt_is_data_guid(guid.value, GPT_GUID_LEN)) {
- return ReformatDataPartition(std::move(fd), disk_channel, device_path);
- }
- return DISK_FORMAT_UNKNOWN;
-}
-
zx_status_t FormatMinfs(const fbl::unique_fd& block_device,
const fuchsia_hardware_block_BlockInfo& info) {
@@ -590,10 +543,6 @@
return ZX_OK;
}
- if (df == DISK_FORMAT_UNKNOWN && !watcher->Netbooting()) {
- df = ReformatPartition(fd.duplicate(), disk->get(), device_path);
- }
-
if (info.flags & BLOCK_FLAG_BOOTPART) {
fuchsia_device_ControllerBind(disk->get(), BOOTPART_DRIVER_LIB,
STRLEN(BOOTPART_DRIVER_LIB), &call_status);
diff --git a/zircon/system/ulib/kms-stateless/include/kms-stateless/kms-stateless.h b/zircon/system/ulib/kms-stateless/include/kms-stateless/kms-stateless.h
index f0960fb..7d93c82 100644
--- a/zircon/system/ulib/kms-stateless/include/kms-stateless/kms-stateless.h
+++ b/zircon/system/ulib/kms-stateless/include/kms-stateless/kms-stateless.h
@@ -11,7 +11,7 @@
// The callback called when a hardware key is successfully derived. Arguments to the callback
// is a unique_ptr of the key buffer and the key size.
- using GetHardwareDerivedKeyCallback = fbl::Function<zx_status_t(fbl::unique_ptr<uint8_t[]>,
+ using GetHardwareDerivedKeyCallback = fbl::Function<zx_status_t(fbl::unique_ptr<uint8_t>,
size_t)>;
// Get a hardware derived key using
diff --git a/zircon/system/ulib/kms-stateless/kms-stateless.cpp b/zircon/system/ulib/kms-stateless/kms-stateless.cpp
index f5d68ec..fe7d295 100644
--- a/zircon/system/ulib/kms-stateless/kms-stateless.cpp
+++ b/zircon/system/ulib/kms-stateless/kms-stateless.cpp
@@ -148,7 +148,7 @@
fbl::StringBuffer<kMaxPathLen> device_path;
device_path.Append(kDeviceClass).Append("/").Append(filename);
// Hardware derived key is expected to be 128-bit AES key.
- fbl::unique_ptr<uint8_t[]> key_buffer(new uint8_t[kDerivedKeySize]);
+ fbl::unique_ptr<uint8_t> key_buffer(new uint8_t[kDerivedKeySize]);
size_t key_size = 0;
WatchTeeArgs* args = reinterpret_cast<WatchTeeArgs*>(cookie);
if (!GetKeyFromTeeDevice(device_path.c_str(), std::move(args->key_info), args->key_info_size,
diff --git a/zircon/system/ulib/zxcrypt/fdio-volume.cpp b/zircon/system/ulib/zxcrypt/fdio-volume.cpp
index 291f222..b97dd2f 100644
--- a/zircon/system/ulib/zxcrypt/fdio-volume.cpp
+++ b/zircon/system/ulib/zxcrypt/fdio-volume.cpp
@@ -77,7 +77,7 @@
}
}
-zx_status_t DoWithHardwareKey(fbl::Function<zx_status_t(fbl::unique_ptr<uint8_t[]>, size_t)>
+zx_status_t DoWithHardwareKey(fbl::Function<zx_status_t(fbl::unique_ptr<uint8_t>, size_t)>
callback) {
KeySource source;
zx_status_t rc;
@@ -91,13 +91,13 @@
uint8_t key_info[kms_stateless::kExpectedKeyInfoSize] = {0};
memcpy(key_info, kHardwareKeyInfo, sizeof(kHardwareKeyInfo));
return kms_stateless::GetHardwareDerivedKey([&](
- fbl::unique_ptr<uint8_t[]> key_buffer, size_t key_size) {
+ fbl::unique_ptr<uint8_t> key_buffer, size_t key_size) {
return callback(std::move(key_buffer), key_size);
}, key_info);
}
case NullSource: {
// If we don't have secure storage for the root key, just use the null key
- fbl::unique_ptr<uint8_t[]> key_buffer(new uint8_t[kKeyLength]);
+ fbl::unique_ptr<uint8_t> key_buffer(new uint8_t[kKeyLength]);
memset(key_buffer.get(), 0, kKeyLength);
return callback(std::move(key_buffer), kKeyLength);
}
@@ -125,7 +125,7 @@
}
zx_status_t FdioVolumeManager::UnsealWithDeviceKey(uint8_t slot) {
- return DoWithHardwareKey([&](fbl::unique_ptr<uint8_t[]> key_buffer, size_t key_size) {
+ return DoWithHardwareKey([&](fbl::unique_ptr<uint8_t> key_buffer, size_t key_size) {
return Unseal(key_buffer.release(), key_size, slot);
});
}
@@ -199,7 +199,7 @@
zx_status_t FdioVolume::CreateWithDeviceKey(fbl::unique_fd&& fd,
fbl::unique_ptr<FdioVolume>* out) {
- return DoWithHardwareKey([&](fbl::unique_ptr<uint8_t[]> key_buffer, size_t key_size) {
+ return DoWithHardwareKey([&](fbl::unique_ptr<uint8_t> key_buffer, size_t key_size) {
crypto::Secret secret;
zx_status_t rc;
uint8_t* inner;
@@ -235,7 +235,7 @@
zx_status_t FdioVolume::UnlockWithDeviceKey(fbl::unique_fd fd,
key_slot_t slot,
fbl::unique_ptr<FdioVolume>* out) {
- return DoWithHardwareKey([&](fbl::unique_ptr<uint8_t[]> key_buffer, size_t key_size) {
+ return DoWithHardwareKey([&](fbl::unique_ptr<uint8_t> key_buffer, size_t key_size) {
crypto::Secret secret;
zx_status_t rc;
uint8_t* inner;
diff --git a/zircon/system/utest/BUILD.gn b/zircon/system/utest/BUILD.gn
index 32d31a0..f2513f3 100644
--- a/zircon/system/utest/BUILD.gn
+++ b/zircon/system/utest/BUILD.gn
@@ -107,7 +107,6 @@
"fs",
"fs-bench",
"fs-management",
- "fs-recovery",
"fs-test-utils",
"fs-vnode",
"futex-ownership",
diff --git a/zircon/system/utest/fs-recovery/BUILD.gn b/zircon/system/utest/fs-recovery/BUILD.gn
deleted file mode 100644
index 4911a286..0000000
--- a/zircon/system/utest/fs-recovery/BUILD.gn
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2019 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("$zx/public/gn/resource.gni")
-
-generated_resource("zxcrypt_config.txt") {
- testonly = true
- contents = "null"
- outputs = [
- "config/zxcrypt",
- ]
-}
-
-
-test("fs-recovery") {
- sources = [
- "recovery.cpp",
- ]
- deps = [
- "$zx/system/ulib/devmgr-integration-test",
- "$zx/system/ulib/fbl",
- "$zx/system/ulib/fdio",
- "$zx/system/ulib/fs-management",
- "$zx/system/ulib/fvm",
- "$zx/system/fidl/fuchsia-hardware-ramdisk:c",
- "$zx/system/ulib/unittest",
- "$zx/system/ulib/zx",
- ":zxcrypt_config.txt",
- ]
-}
diff --git a/zircon/system/utest/fs-recovery/recovery.cpp b/zircon/system/utest/fs-recovery/recovery.cpp
deleted file mode 100644
index bb69561..0000000
--- a/zircon/system/utest/fs-recovery/recovery.cpp
+++ /dev/null
@@ -1,175 +0,0 @@
-// Copyright 2019 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fcntl.h>
-
-#include <fs-management/fvm.h>
-#include <fs-management/mount.h>
-#include <fuchsia/hardware/ramdisk/c/fidl.h>
-#include <fvm/format.h>
-#include <lib/devmgr-integration-test/fixture.h>
-#include <lib/fdio/fd.h>
-#include <lib/fdio/fdio.h>
-#include <lib/zx/vmo.h>
-#include <unittest/unittest.h>
-
-namespace {
-
-using devmgr_integration_test::IsolatedDevmgr;
-
-const uint32_t kBlockCount = 1024 * 256;
-const uint32_t kBlockSize = 512;
-const uint32_t kSliceSize = (1 << 20);
-const size_t kDeviceSize = kBlockCount * kBlockSize;
-const char* kDataName = "fs-recovery-data";
-const char* kRamdiskPath = "misc/ramctl";
-
-// Test fixture that builds a ramdisk and destroys it when destructed.
-class FsRecoveryTest {
-public:
- // Create an IsolatedDevmgr that can load device drivers such as fvm,
- // zxcrypt, etc.
- bool Initialize() {
- BEGIN_HELPER;
- auto args = IsolatedDevmgr::DefaultArgs();
- args.disable_block_watcher = false;
- args.sys_device_driver = devmgr_integration_test::IsolatedDevmgr::kSysdevDriver;
- args.load_drivers.push_back(devmgr_integration_test::IsolatedDevmgr::kSysdevDriver);
- args.driver_search_paths.push_back("/boot/driver");
- ASSERT_EQ(IsolatedDevmgr::Create(std::move(args), &devmgr_), ZX_OK);
- END_HELPER;
- }
-
- // Create a ram disk that is back by a VMO, which is formatted to look like
- // an FVM volume.
- bool CreateFvmRamdisk(size_t device_size, size_t block_size) {
- BEGIN_HELPER;
-
- // Calculate total size of data + metadata.
- device_size = fbl::round_up(device_size, fvm::kBlockSize);
- size_t old_meta = fvm::MetadataSize(device_size, fvm::kBlockSize);
- size_t new_meta = fvm::MetadataSize(old_meta + device_size, fvm::kBlockSize);
- while (old_meta != new_meta) {
- old_meta = new_meta;
- new_meta = fvm::MetadataSize(old_meta + device_size, fvm::kBlockSize);
- }
- device_size = device_size + (new_meta * 2);
-
- zx::vmo disk;
- ASSERT_EQ(zx::vmo::create(device_size, 0, &disk), ZX_OK);
- int fd = -1;
- ASSERT_EQ(fdio_fd_create(disk.get(), &fd), ZX_OK);
- ASSERT_GE(fd, 0);
- ASSERT_EQ(fvm_init_with_size(fd, device_size, kSliceSize), ZX_OK);
-
- fbl::unique_fd ramdisk;
- ASSERT_TRUE(WaitForDevice(kRamdiskPath, &ramdisk));
-
- zx_handle_t ramctl;
- ASSERT_EQ(fdio_get_service_handle(ramdisk.get(), &ramctl), ZX_OK);
-
- size_t name_len = 0;
- zx_status_t status;
- ASSERT_EQ(fuchsia_hardware_ramdisk_RamdiskControllerCreateFromVmo(
- ramctl, disk.release(), &status, ramdisk_name_,
- sizeof(ramdisk_name_) - 1, &name_len),
- ZX_OK);
- ASSERT_EQ(status, ZX_OK);
- END_HELPER;
- }
-
- // Create a partition in the FVM volume that has the data guid.
- bool CreateFvmPartition(char* fvm_path) {
- BEGIN_HELPER;
-
- snprintf(fvm_path, PATH_MAX, "%s/%s/block/fvm", kRamdiskPath, ramdisk_name_);
- fbl::unique_fd fvm_fd;
- ASSERT_TRUE(WaitForDevice(fvm_path, &fvm_fd));
-
- // Allocate a FVM partition with the data guid but don't actually format the
- // partition.
- alloc_req_t req;
- memset(&req, 0, sizeof(alloc_req_t));
- req.slice_count = 1;
- static const uint8_t data_guid[GPT_GUID_LEN] = GUID_DATA_VALUE;
- memcpy(req.type, data_guid, GUID_LEN);
- snprintf(req.name, NAME_LEN, "%s", kDataName);
- // This attempts to return an fd to a partition under /dev/class/block
- // which is not running under the IsolatedDevmgr, thus we do not check
- // its return value.
- fvm_allocate_partition(fvm_fd.get(), &req);
-
- END_HELPER;
- }
-
- // Wait for the device to be available and then check to make sure it is
- // formatted of the passed in type. Since formatting can take some time
- // after the device becomes available, we must recheck.
- bool WaitForDiskFormat(const char* path, disk_format_t format, zx::duration deadline) {
- fbl::unique_fd fd;
- if (!WaitForDevice(path, &fd)) {
- return false;
- }
- while (deadline.get() > 0) {
- fd.reset(openat(devmgr_.devfs_root().get(), path, O_RDONLY));
- if (detect_disk_format(fd.get()) == format)
- return true;
- sleep(1);
- deadline -= zx::duration(ZX_SEC(1));
- }
- return false;
- }
-
-private:
- bool WaitForDevice(const char* path, fbl::unique_fd* fd) {
- BEGIN_HELPER;
- printf("Wait for device %s\n", path);
- ASSERT_EQ(devmgr_integration_test::RecursiveWaitForFile(devmgr_.devfs_root(), path,
- zx::deadline_after(zx::sec(5)), fd),
- ZX_OK);
-
- ASSERT_TRUE(*fd);
- END_HELPER;
- }
-
- char ramdisk_name_[fuchsia_hardware_ramdisk_MAX_NAME_LENGTH + 1];
- devmgr_integration_test::IsolatedDevmgr devmgr_;
-};
-
-bool EmptyPartitionRecoveryTest() {
- BEGIN_TEST;
-
- char fvm_path[PATH_MAX];
- fbl::unique_ptr<FsRecoveryTest> recovery(new FsRecoveryTest());
- ASSERT_TRUE(recovery->Initialize());
- // Creates an FVM partition under an isolated devmgr, but does not properly
- // create the data partitions.
- ASSERT_TRUE(recovery->CreateFvmRamdisk(kDeviceSize, kBlockSize));
- ASSERT_TRUE(recovery->CreateFvmPartition(fvm_path));
-
- // We then expect the devmgr to self-recover, i.e., format the zxcrypt/data
- // partitions as expected from the FVM partition.
-
- // First, wait for the zxcrypt partition to be formatted.
- char fvm_block_path[PATH_MAX];
- snprintf(fvm_block_path, sizeof(fvm_block_path),
- "%s/%s-p-1/block", fvm_path, kDataName);
- EXPECT_TRUE(recovery->WaitForDiskFormat(fvm_block_path, DISK_FORMAT_ZXCRYPT,
- zx::duration(ZX_SEC(3))));
-
- // Second, wait for the data partition to be formatted.
- char data_path[PATH_MAX];
- snprintf(data_path, sizeof(data_path),
- "%s/zxcrypt/unsealed/block", fvm_block_path);
- EXPECT_TRUE(recovery->WaitForDiskFormat(data_path, DISK_FORMAT_MINFS,
- zx::duration(ZX_SEC(3))));
-
- END_TEST;
-}
-
-BEGIN_TEST_CASE(FsRecoveryTest)
-RUN_TEST(EmptyPartitionRecoveryTest)
-END_TEST_CASE(FsRecoveryTest)
-
-} // namespace