Skip to content

Commit 5e036d6

Browse files
Hrant TadevosyanHrant Tadevosyan
authored andcommitted
improved big omaps & added root folder sample
1 parent caf2907 commit 5e036d6

File tree

1 file changed

+45
-31
lines changed

1 file changed

+45
-31
lines changed

patterns/apfs.hexpat

Lines changed: 45 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1295,41 +1295,47 @@ fn keybag_is_encrypted(media_keybag_t keybag) {
12951295
};
12961296

12971297
fn 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

14171431
btree_node_phys_t<superblock.nx_block_size, 0> volume_extentref_tree @ volume.apfs_extentref_tree_oid * superblock.nx_block_size;
14181432
btree_node_phys_t<superblock.nx_block_size, 0> volume_snapshot_tree @ volume.apfs_snap_meta_tree_oid * superblock.nx_block_size;

0 commit comments

Comments
 (0)