@@ -1295,41 +1295,47 @@ fn keybag_is_encrypted(media_keybag_t keybag) {
12951295};
12961296
12971297fn omap_node_lookup(paddr_t off, u64 block_size, oid_t oid, xid_t xid) {
1298- btree_node_phys_t<block_size, 0> node @ off;
1298+ while (true) {
1299+ btree_node_phys_t<block_size, 0> node @ off;
1300+ if (node.btn_nkeys <= 0) {
1301+ return 0;
1302+ }
12991303
1300- if (node.btn_nkeys <= 0) {
1301- return 0;
1302- }
1304+ s64 beg = 0;
1305+ s64 end = node.btn_nkeys - 1;
1306+ s64 mid = 0;
1307+ s64 idx = 0;
1308+ while (beg <= end) {
1309+ mid = (beg + end) / 2;
13031310
1304- s64 beg = 0;
1305- s64 end = node.btn_nkeys - 1;
1306- s64 mid = 0;
1307- s64 idx = 0;
1308- while (beg <= end) {
1309- mid = (beg + end) / 2;
1310-
1311- omap_key_t key = node.btn_toc[mid].key;
1312- if (oid > key.ok_oid) {
1313- beg += 1;
1314- } else if (oid < key.ok_oid) {
1315- end -= 1;
1316- } else if (xid > key.ok_xid) {
1317- beg += 1;
1318- idx = mid;
1319- } else if (xid < key.ok_xid) {
1320- end -= 1;
1321- idx = mid;
1322- } else {
1323- idx = mid;
1324- break;
1311+ omap_key_t key = node.btn_toc[mid].key;
1312+ if (oid > key.ok_oid) {
1313+ beg += 1;
1314+ } else if (oid < key.ok_oid) {
1315+ end -= 1;
1316+ } else if (xid > key.ok_xid) {
1317+ beg += 1;
1318+ idx = mid;
1319+ } else if (xid < key.ok_xid) {
1320+ end -= 1;
1321+ idx = mid;
1322+ } else {
1323+ idx = mid;
1324+ break;
1325+ }
13251326 }
1326- }
13271327
1328- omap_key_t key = node.btn_toc[idx].key;
1329- if (key.ok_oid == oid) {
1330- return node.btn_toc[idx].val.ov_paddr;
1331- } else {
1332- return 0;
1328+ if (node.btn_level > 0) {
1329+ off = node.btn_toc[current].node_oid * block_size;
1330+ continue;
1331+ }
1332+
1333+ omap_key_t key = node.btn_toc[idx].key;
1334+ if (key.ok_oid == oid) {
1335+ return node.btn_toc[idx].val.ov_paddr;
1336+ } else {
1337+ return 0;
1338+ }
13331339 }
13341340};
13351341
@@ -1413,6 +1419,14 @@ btree_node_phys_t<superblock.nx_block_size, volume.apfs_incompatible_features> v
14131419 superblock.nx_block_size,
14141420 volume.apfs_root_tree_oid,
14151421 volume.apfs_o.o_xid) * superblock.nx_block_size;
1422+ j_inode_val_t volume_root_folder @ fstree_inode_lookup(
1423+ addressof (volume_root_tree),
1424+ addressof (volume_object_map_tree),
1425+ superblock.nx_block_size,
1426+ ROOT_DIR_INO_NUM,
1427+ volume.apfs_incompatible_features,
1428+ volume.apfs_o.o_xid
1429+ );
14161430
14171431btree_node_phys_t<superblock.nx_block_size, 0> volume_extentref_tree @ volume.apfs_extentref_tree_oid * superblock.nx_block_size;
14181432btree_node_phys_t<superblock.nx_block_size, 0> volume_snapshot_tree @ volume.apfs_snap_meta_tree_oid * superblock.nx_block_size;
0 commit comments