probes_producer: Convert block_device_ids for maps to align

Currently pretending they are all uint32_t and will update all
to uint64_t in separate CL that will be much larger.

Bug: 73625480
Change-Id: Ic1c1271dac892deee80bbedc08a2fa336111a44e
diff --git a/src/traced/probes/filesystem/inode_file_data_source.cc b/src/traced/probes/filesystem/inode_file_data_source.cc
index 0bdf781..49e1147 100644
--- a/src/traced/probes/filesystem/inode_file_data_source.cc
+++ b/src/traced/probes/filesystem/inode_file_data_source.cc
@@ -17,6 +17,7 @@
 #include "src/traced/probes/filesystem/inode_file_data_source.h"
 
 #include <dirent.h>
+#include <sys/stat.h>
 #include <sys/types.h>
 #include <unistd.h>
 #include <queue>
@@ -29,8 +30,6 @@
 
 namespace perfetto {
 
-using BlockDeviceID = decltype(stat::st_dev);
-
 void CreateDeviceToInodeMap(
     const std::string& root_directory,
     std::map<BlockDeviceID, std::map<Inode, InodeMapValue>>* block_device_map) {
@@ -48,13 +47,11 @@
       std::string filename = entry->d_name;
       if (filename == "." || filename == "..")
         continue;
-      Inode inode_number = entry->d_ino;
+      Inode inode_number = static_cast<Inode>(entry->d_ino);
       struct stat buf;
       if (lstat(filepath.c_str(), &buf) != 0)
         continue;
-      BlockDeviceID block_device_id = buf.st_dev;
-      std::map<Inode, InodeMapValue>& inode_map =
-          (*block_device_map)[block_device_id];
+      BlockDeviceID block_device_id = static_cast<BlockDeviceID>(buf.st_dev);
       // Default
       protos::pbzero::InodeFileMap_Entry_Type type =
           protos::pbzero::InodeFileMap_Entry_Type_UNKNOWN;
@@ -66,6 +63,10 @@
       } else if (entry->d_type == DT_REG || S_ISREG(buf.st_mode)) {
         type = protos::pbzero::InodeFileMap_Entry_Type_FILE;
       }
+
+      // Update map
+      std::map<Inode, InodeMapValue>& inode_map =
+          (*block_device_map)[block_device_id];
       inode_map[inode_number].SetType(type);
       inode_map[inode_number].AddPath(filepath + filename);
     }
@@ -75,55 +76,80 @@
 
 InodeFileDataSource::InodeFileDataSource(
     TracingSessionID id,
-    std::map<BlockDeviceID, std::map<Inode, InodeMapValue>>* file_system_inodes,
+    std::map<BlockDeviceID, std::map<Inode, InodeMapValue>>*
+        system_partition_files,
     std::unique_ptr<TraceWriter> writer)
     : session_id_(id),
-      file_system_inodes_(file_system_inodes),
+      system_partition_files_(system_partition_files),
       writer_(std::move(writer)),
       weak_factory_(this) {}
 
-void InodeFileDataSource::WriteInodes(
-    const std::vector<std::pair<uint64_t, uint32_t>>& inodes) {
-  PERFETTO_DLOG("Write Inodes start");
+bool InodeFileDataSource::AddInodeFileMapEntry(
+    InodeFileMap* inode_file_map,
+    BlockDeviceID block_device_id,
+    Inode inode_number,
+    const std::map<BlockDeviceID, std::map<Inode, InodeMapValue>>&
+        current_partition_map) {
+  auto block_device_entry = current_partition_map.find(block_device_id);
+  if (block_device_entry != current_partition_map.end()) {
+    auto inode_map = block_device_entry->second.find(inode_number);
+    if (inode_map != block_device_entry->second.end()) {
+      auto* entry = inode_file_map->add_entries();
+      entry->set_inode_number(inode_number);
+      entry->set_type(inode_map->second.type());
+      for (const auto& path : inode_map->second.paths())
+        entry->add_paths(path.c_str());
+      return true;
+    }
+  }
+  return false;
+}
+
+void InodeFileDataSource::OnInodes(
+    const std::vector<std::pair<Inode, BlockDeviceID>>& inodes) {
+  PERFETTO_DLOG("Saw FtraceBundle with %zu inodes.", inodes.size());
 
   if (mount_points_.empty()) {
     mount_points_ = ParseMounts();
   }
   // Group inodes from FtraceMetadata by block device
   std::map<BlockDeviceID, std::set<Inode>> inode_file_maps;
-  for (const auto& inode : inodes) {
-    BlockDeviceID block_device_id = inode.first;
-    Inode inode_number = inode.second;
+  for (const auto& inodes_pair : inodes) {
+    Inode inode_number = inodes_pair.first;
+    BlockDeviceID block_device_id = inodes_pair.second;
     inode_file_maps[block_device_id].emplace(inode_number);
   }
   // Write a TracePacket with an InodeFileMap proto for each block device id
   for (const auto& inode_file_map_data : inode_file_maps) {
+    BlockDeviceID block_device_id = inode_file_map_data.first;
+    std::set<Inode> inode_numbers = inode_file_map_data.second;
+
+    // New TracePacket for each InodeFileMap
     auto trace_packet = writer_->NewTracePacket();
     auto inode_file_map = trace_packet->set_inode_file_map();
+
     // Add block device id
-    BlockDeviceID block_device_id = inode_file_map_data.first;
     inode_file_map->set_block_device_id(block_device_id);
+
     // Add mount points
     auto range = mount_points_.equal_range(block_device_id);
     for (std::multimap<BlockDeviceID, std::string>::iterator it = range.first;
-         it != range.second; ++it) {
+         it != range.second; ++it)
       inode_file_map->add_mount_points(it->second.c_str());
-    }
-    // Add entries for each inode number
-    std::set<Inode> inode_numbers = inode_file_map_data.second;
+
+    // Add entries for inodes in system
+    std::map<BlockDeviceID, std::set<Inode>> data_partition_inodes;
     for (const auto& inode_number : inode_numbers) {
-      auto* entry = inode_file_map->add_entries();
-      entry->set_inode_number(inode_number);
-      auto block_device_map = file_system_inodes_->find(block_device_id);
-      if (block_device_map != file_system_inodes_->end()) {
-        auto inode_map = block_device_map->second.find(inode_number);
-        if (inode_map != block_device_map->second.end()) {
-          entry->set_type(inode_map->second.type());
-          for (const auto& path : inode_map->second.paths())
-            entry->add_paths(path.c_str());
-        }
+      // Search in /system partition and add to InodeFileMap if found
+      bool in_system =
+          AddInodeFileMapEntry(inode_file_map, block_device_id, inode_number,
+                               *system_partition_files_);
+      if (!in_system) {
+        // TODO(fmayer): Add LRU and check before adding inode for full scan
+        data_partition_inodes[block_device_id].emplace(inode_number);
       }
     }
+
     trace_packet->Finalize();
   }
 }
@@ -132,9 +158,4 @@
   return weak_factory_.GetWeakPtr();
 }
 
-void InodeFileDataSource::OnInodes(
-    const std::vector<std::pair<uint64_t, uint32_t>>& inodes) {
-  PERFETTO_DLOG("Saw FtraceBundle with %zu inodes.", inodes.size());
-}
-
 }  // namespace perfetto