| From e93b40346183b48df82d4a1a89ffe3a25a397a47 Mon Sep 17 00:00:00 2001 |
| From: Dongjin Kim <dongjin_.kim@samsung.com> |
| Date: Mon, 24 May 2021 15:38:02 +0900 |
| Subject: [PATCH] [f2fs] Enable f2fs to be tested by fs_test |
| |
| Add f2fs dependency for fs_management and fs_test |
| Add f2fs options for fs_test |
| |
| Change-Id: I7f311852576223da06293977c639771d5154cf40 |
| --- |
| src/lib/storage/fs_management/cpp/BUILD.gn | 1 + |
| src/storage/fs_test/BUILD.gn | 2 + |
| src/storage/fs_test/fs_test.cc | 69 +++++++++++++++++++++- |
| src/storage/fs_test/fs_test.h | 29 +++++++++ |
| 4 files changed, 100 insertions(+), 1 deletion(-) |
| |
| diff --git a/src/lib/storage/fs_management/cpp/BUILD.gn b/src/lib/storage/fs_management/cpp/BUILD.gn |
| index 62845d92d5a..5d9a915b25b 100644 |
| --- a/src/lib/storage/fs_management/cpp/BUILD.gn |
| +++ b/src/lib/storage/fs_management/cpp/BUILD.gn |
| @@ -102,6 +102,7 @@ test("fs-management-test") { |
| "//src/storage/bin/blobfs", |
| "//src/storage/bin/minfs", |
| "//src/storage/bin/minfs", |
| + "//third_party/f2fs/tools:f2fs", |
| "//zircon/third_party/uapp/fsck-msdosfs", |
| "//zircon/third_party/uapp/mkfs-msdosfs", |
| ] |
| diff --git a/src/storage/fs_test/BUILD.gn b/src/storage/fs_test/BUILD.gn |
| index 371e7beed17..6d0bf087145 100644 |
| --- a/src/storage/fs_test/BUILD.gn |
| +++ b/src/storage/fs_test/BUILD.gn |
| @@ -587,6 +587,7 @@ fuchsia_test_package("fs-tests") { |
| deps = [ |
| "//src/storage/bin/blobfs", |
| "//src/storage/bin/minfs", |
| + "//third_party/f2fs/tools:f2fs", |
| "//zircon/third_party/uapp/fsck-msdosfs", |
| "//zircon/third_party/uapp/mkfs-msdosfs", |
| ] |
| @@ -660,6 +661,7 @@ fuchsia_test_package("large-fs-tests") { |
| ] |
| deps = [ |
| "//src/storage/bin/minfs", |
| + "//third_party/f2fs/tools:f2fs", |
| "//zircon/third_party/uapp/fsck-msdosfs", |
| "//zircon/third_party/uapp/mkfs-msdosfs", |
| ] |
| diff --git a/src/storage/fs_test/fs_test.cc b/src/storage/fs_test/fs_test.cc |
| index 217cc152638..8352002c309 100644 |
| --- a/src/storage/fs_test/fs_test.cc |
| +++ b/src/storage/fs_test/fs_test.cc |
| @@ -408,6 +408,14 @@ TestFilesystemOptions TestFilesystemOptions::BlobfsWithoutFvm() { |
| return blobfs_with_no_fvm; |
| } |
| |
| +TestFilesystemOptions TestFilesystemOptions::F2fsWithoutFvm() { |
| + return TestFilesystemOptions{.description = "F2fs", |
| + .use_fvm = false, |
| + .device_block_size = 512, |
| + .device_block_count = 2'097'152, |
| + .filesystem = &F2fsFilesystem::SharedInstance()}; |
| +} |
| + |
| std::ostream& operator<<(std::ostream& out, const TestFilesystemOptions& options) { |
| return out << options.description; |
| } |
| @@ -424,7 +432,11 @@ std::vector<TestFilesystemOptions> AllTestFilesystems() { |
| TestFilesystemOptions::DefaultMinfs(), TestFilesystemOptions::MinfsWithoutFvm(), |
| TestFilesystemOptions::DefaultMemfs(), TestFilesystemOptions::DefaultFatfs(), |
| #if 0 // Change to 1 to enable testing for Fxfs |
| - DefaultFxfsTestOptions() |
| + DefaultFxfsTestOptions(), |
| +#endif |
| +// TODO(unknown): set default value to 0 |
| +#if 1 // Change to 1 to enable testing for F2fs |
| + TestFilesystemOptions::F2fsWithoutFvm() |
| #endif |
| }; |
| } |
| @@ -689,6 +701,61 @@ zx::status<std::unique_ptr<FilesystemInstance>> BlobfsFilesystem::Open( |
| return zx::ok(std::make_unique<BlobfsInstance>(std::move(ram_nand), std::move(device_path))); |
| } |
| |
| +// -- F2fs -- |
| + |
| +class F2fsInstance : public FilesystemInstance { |
| + public: |
| + F2fsInstance(RamDevice device, std::string device_path) |
| + : device_(std::move(device)), device_path_(std::move(device_path)) {} |
| + |
| + virtual zx::status<> Format(const TestFilesystemOptions& options) override { |
| + return FsFormat(device_path_, DISK_FORMAT_F2FS, default_mkfs_options); |
| + } |
| + |
| + zx::status<> Mount(const std::string& mount_path, const mount_options_t& options) override { |
| + return FsMount(device_path_, mount_path, DISK_FORMAT_F2FS, options); |
| + } |
| + |
| + zx::status<> Fsck() override { |
| + // TODO(unknown): Set appropriate options for F2fs |
| + fsck_options_t options{ |
| + .verbose = false, |
| + .never_modify = true, |
| + .always_modify = false, |
| + .force = true, |
| + }; |
| + return zx::make_status( |
| + fsck(device_path_.c_str(), DISK_FORMAT_F2FS, &options, launch_stdio_sync)); |
| + } |
| + |
| + zx::status<std::string> DevicePath() const override { return zx::ok(std::string(device_path_)); } |
| + |
| + storage::RamDisk* GetRamDisk() override { return std::get_if<storage::RamDisk>(&device_); } |
| + |
| + ramdevice_client::RamNand* GetRamNand() override { |
| + return std::get_if<ramdevice_client::RamNand>(&device_); |
| + } |
| + |
| + private: |
| + RamDevice device_; |
| + std::string device_path_; |
| +}; |
| + |
| +std::unique_ptr<FilesystemInstance> F2fsFilesystem::Create(RamDevice device, |
| + std::string device_path) const { |
| + return std::make_unique<F2fsInstance>(std::move(device), std::move(device_path)); |
| +} |
| + |
| +zx::status<std::unique_ptr<FilesystemInstance>> F2fsFilesystem::Open( |
| + const TestFilesystemOptions& options) const { |
| + auto result = OpenRamNand(options); |
| + if (result.is_error()) { |
| + return result.take_error(); |
| + } |
| + auto [ram_nand, device_path] = std::move(result).value(); |
| + return zx::ok(std::make_unique<F2fsInstance>(std::move(ram_nand), std::move(device_path))); |
| +} |
| + |
| // -- |
| |
| zx::status<TestFilesystem> TestFilesystem::FromInstance( |
| diff --git a/src/storage/fs_test/fs_test.h b/src/storage/fs_test/fs_test.h |
| index e819f7f2537..90e7c5bd03c 100644 |
| --- a/src/storage/fs_test/fs_test.h |
| +++ b/src/storage/fs_test/fs_test.h |
| @@ -43,6 +43,7 @@ struct TestFilesystemOptions { |
| static TestFilesystemOptions DefaultFatfs(); |
| static TestFilesystemOptions DefaultBlobfs(); |
| static TestFilesystemOptions BlobfsWithoutFvm(); |
| + static TestFilesystemOptions F2fsWithoutFvm(); |
| |
| std::string description; |
| bool use_ram_nand = false; |
| @@ -210,6 +211,34 @@ class FatFilesystem : public FilesystemImpl<FatFilesystem> { |
| } |
| }; |
| |
| +// Support for F2fs. |
| +class F2fsFilesystem : public FilesystemImplWithDefaultMake<F2fsFilesystem> { |
| + public: |
| + const Traits& GetTraits() const override { |
| + static Traits traits{ |
| + .name = "f2fs", |
| + .can_unmount = true, |
| + .timestamp_granularity = zx::nsec(1), |
| + .supports_hard_links = false, |
| + .supports_mmap = false, |
| + .supports_resize = false, |
| + // TODO(unknown): Get value from f2fs header |
| + .max_file_size = 4'329'690'886'144, |
| + .in_memory = false, |
| + .is_case_sensitive = true, |
| + .supports_sparse_files = true, |
| + .supports_fsck_after_every_transaction = false, |
| + }; |
| + return traits; |
| + } |
| + |
| + std::unique_ptr<FilesystemInstance> Create(RamDevice device, |
| + std::string device_path) const override; |
| + |
| + zx::status<std::unique_ptr<FilesystemInstance>> Open( |
| + const TestFilesystemOptions& options) const override; |
| +}; |
| + |
| // Helper that creates a test file system with the given options and will clean-up upon destruction. |
| class TestFilesystem { |
| public: |
| -- |
| 2.25.1 |
| |