8
8
#include < purefs/blkdev/disk_manager.hpp>
9
9
#include < purefs/vfs_subsystem.hpp>
10
10
#include < purefs/vfs_subsystem_internal.hpp>
11
+ #include < hal/boot_reason.h>
12
+ #include < hal/boot_control.h>
11
13
#include < purefs/fs/thread_local_cwd.hpp>
12
14
#include < log/log.hpp>
13
15
#include < purefs/filesystem_paths.hpp>
@@ -40,30 +42,6 @@ namespace purefs::subsystem
40
42
std::weak_ptr<fs::filesystem> g_fs_core;
41
43
} // namespace
42
44
43
- namespace
44
- {
45
- int read_mbr_lfs_erase_size (std::shared_ptr<blkdev::disk_manager> disk_mngr,
46
- std::string_view dev_name,
47
- int part_no)
48
- {
49
- static constexpr auto MBR_ERASE_BLK_OFFSET = 0x00E0 ;
50
- if (part_no <= 0 ) {
51
- return -EINVAL;
52
- }
53
- const auto sect_size = disk_mngr->get_info (dev_name, blkdev::info_type::sector_size);
54
- if (sect_size <= MBR_ERASE_BLK_OFFSET + part_no) {
55
- return (sect_size > 0 ) ? (-ERANGE) : (sect_size);
56
- }
57
- auto mbr_buf = std::make_unique<char []>(sect_size);
58
- int err = disk_mngr->read (dev_name, mbr_buf.get (), 0 , 1 );
59
- if (err < 0 ) {
60
- return err;
61
- }
62
- return mbr_buf[MBR_ERASE_BLK_OFFSET + part_no];
63
- }
64
-
65
- } // namespace
66
-
67
45
auto initialize (std::unique_ptr<DeviceFactory> deviceFactory)
68
46
-> std::tuple<std::shared_ptr<blkdev::disk_manager>, std::shared_ptr<fs::filesystem>>
69
47
{
@@ -128,8 +106,24 @@ namespace purefs::subsystem
128
106
LOG_FATAL (" Unknown partitions layout part size is %u" , (unsigned )(parts.size ()));
129
107
return -EIO;
130
108
}
131
- const auto &boot_part = parts[boot_part_index];
109
+
110
+ auto vfs = g_fs_core.lock ();
111
+ if (!vfs) {
112
+ LOG_FATAL (" Unable to lock vfs core" );
113
+ return -EIO;
114
+ }
115
+
132
116
const auto &user_part = parts[user_part_index];
117
+
118
+ vfs->mount (user_part.name , purefs::dir::getUserDiskPath ().string (), " auto" );
119
+
120
+ auto ret = boot_control_init (purefs::dir::getBootJSONPath ().string ().c_str ());
121
+ if (ret != 0 ) {
122
+ LOG_FATAL (" Unable to init boot.json handling" );
123
+ return -ENOENT;
124
+ }
125
+
126
+ const auto &boot_part = parts[(get_current_slot () == Slot_A) ? 0 : 1 ];
133
127
if ((boot_part.type != fat_part_code) && (boot_part.type != linux_part_code)) {
134
128
LOG_FATAL (" Invalid boot partition type expected code: %02X or %02X current code: %02X" ,
135
129
fat_part_code,
@@ -142,38 +136,21 @@ namespace purefs::subsystem
142
136
" Invalid user partition type expected code: %02X current code: %02X" , linux_part_code, user_part.type );
143
137
return -EIO;
144
138
}
145
- auto vfs = g_fs_core.lock ();
146
- if (!vfs) {
147
- LOG_FATAL (" Unable to lock vfs core" );
148
- return -EIO;
149
- }
139
+
150
140
auto err = vfs->mount (boot_part.name , purefs::dir::getSystemDiskPath ().string (), " auto" );
151
- if (err) {
141
+ if (err != 0 ) {
152
142
return err;
153
143
}
154
- if (user_part.type == lfs_part_code) {
155
- const int lfs_block_log2 = read_mbr_lfs_erase_size (disk, default_blkdev_name, user_part.physical_number );
156
- uint32_t lfs_block_size = 0 ;
157
- uint32_t *lfs_block_size_ptr = nullptr ;
158
- if (lfs_block_log2 >= block_size_min_shift && lfs_block_log2 <= block_size_max_shift) {
159
- lfs_block_size = 1U << lfs_block_log2;
160
- lfs_block_size_ptr = &lfs_block_size;
161
- }
162
- err =
163
- vfs->mount (user_part.name , purefs::dir::getUserDiskPath ().string (), " littlefs" , 0 , lfs_block_size_ptr);
164
- }
165
- else {
166
- err = vfs->mount (user_part.name , purefs::dir::getUserDiskPath ().string (), " ext4" );
167
- }
168
- fs::internal::set_default_thread_cwd (dir::getSystemDiskPath ().string ());
144
+
145
+ fs::internal::set_default_thread_cwd (purefs::dir::getSystemDiskPath ().string ());
169
146
170
147
// Mount NVRAM memory
171
148
err = vfs->mount (default_nvrom_name,
172
149
purefs::dir::getMfgConfPath ().c_str (),
173
150
" littlefs" ,
174
151
fs::mount_flags::read_only,
175
152
&nvrom_lfs_block_size);
176
- if (err) {
153
+ if (err != 0 ) {
177
154
LOG_WARN (" Unable to mount NVROM partition err %i. Possible: NVROM unavailable" , err);
178
155
err = 0 ;
179
156
}
0 commit comments