Merge "Don't build trace_to_text when building in Chrome"
diff --git a/docs/running_perfetto.md b/docs/running_perfetto.md
index 54ed96b..ba59432 100644
--- a/docs/running_perfetto.md
+++ b/docs/running_perfetto.md
@@ -16,12 +16,11 @@
 
 
 ## Instructions:
+Make sure that Perfetto daemons (`traced` / `traced_probes`) are started.
+They are enabled by default on Pixel and Pixel 2 (walleye, taimen, marlin,
+sailfish). On other devices start them manually by doing:
 ```
-# TODO(primiano): this is temporary until we fix SELinux policies.
-adb shell su root setenforce 0
-
-adb shell su root start traced
-adb shell su root start traced_probes
+adb shell setprop persist.traced.enable 1
 ```
 
 If this works you will see something like:
@@ -36,48 +35,61 @@
 At which point you can grab a trace by doing:
 
 ```
-$ adb shell perfetto --config :test --out /data/local/tmp/trace
+$ adb shell perfetto --config :test --out /data/misc/perfetto-traces/trace
 ```
 
-or to save it to [Android's Dropbox][dropbox]:
+Note: If the output file is not under `/data/misc/perfetto-traces`, it might
+fail due to SELinux (shell is allowed to read that directory).
+
+Alternatively, it can be saved to [Android's Dropbox][dropbox]
+(to test the uploader):
 
 ```
 $ adb shell perfetto --config :test --dropbox perfetto
 ```
 
+### Trace config
 `--config :test` uses a hard-coded test trace config. It is possible to pass
 an arbitrary trace config by doing the following:
 ```
 cat > /tmp/config.txpb <<EOF
 # This is a text-encoded protobuf for /protos/perfetto/config/trace_config.proto
-duration_ms: 2000
+duration_ms: 10000
+
 buffers {
-  size_kb: 1024
-  optimize_for: ONE_SHOT_READ
-  fill_policy: RING_BUFFER
+  size_kb: 10240
 }
+
 data_sources {
   config {
     name: "com.google.perfetto.ftrace"
     target_buffer: 0
     ftrace_config {
-      event_names: "sched_switch"
+      buffer_size_kb: 40 # Kernel ftrace buffer size.
+      ftrace_events: "sched_switch"
+      ftrace_events: "print"
     }
   }
 }
+
+data_sources {
+  config {
+    name: "com.google.perfetto.process_stats"
+    target_buffer: 0
+  }
+}
 EOF
 
 protoc=$(pwd)/out/android/gcc_like_host/protoc
 
 $protoc --encode=perfetto.protos.TraceConfig \
         -I$(pwd)/external/perfetto/protos \
-        $(pwd)/external/perfetto/protos/perfetto/config/trace_config.proto \
+        $(pwd)/external/perfetto/protos/perfetto/config/perfetto_config.proto \
         < /tmp/config.txpb \
         > /tmp/config.pb
 
-adb push /tmp/config.pb /data/local/tmp/
-adb shell perfetto -c /data/local/tmp/config.pb -o /data/local/tmp/trace.pb
-adb pull /data/local/tmp/trace.pb /tmp/
+cat /tmp/config.pb | adb shell perfetto -c - -o /data/misc/perfetto-traces/trace.pb
+adb pull /data/misc/perfetto-traces/trace.pb /tmp/
 out/android/trace_to_text systrace < /tmp/trace.pb > /tmp/trace.json
 
 # The file can now be viewed in chrome://tracing
diff --git a/include/perfetto/ftrace_reader/BUILD.gn b/include/perfetto/ftrace_reader/BUILD.gn
index fecb7cd..4fba481 100644
--- a/include/perfetto/ftrace_reader/BUILD.gn
+++ b/include/perfetto/ftrace_reader/BUILD.gn
@@ -15,6 +15,7 @@
 source_set("ftrace_reader") {
   public_deps = [
     "../base",
+    "../traced",
   ]
   sources = [
     "format_parser.h",
diff --git a/include/perfetto/ftrace_reader/ftrace_controller.h b/include/perfetto/ftrace_reader/ftrace_controller.h
index 90d2bc5..4953b37 100644
--- a/include/perfetto/ftrace_reader/ftrace_controller.h
+++ b/include/perfetto/ftrace_reader/ftrace_controller.h
@@ -19,6 +19,7 @@
 
 #include <unistd.h>
 
+#include <sys/stat.h>
 #include <bitset>
 #include <condition_variable>
 #include <map>
@@ -34,21 +35,25 @@
 #include "perfetto/base/weak_ptr.h"
 #include "perfetto/ftrace_reader/ftrace_config.h"
 #include "perfetto/protozero/message_handle.h"
+#include "perfetto/traced/data_source_types.h"
 
 namespace perfetto {
 
+using BlockDeviceID = decltype(stat::st_dev);
+using Inode = decltype(stat::st_ino);
+
 struct FtraceMetadata {
   FtraceMetadata();
 
   size_t overwrite_count;
-  uint32_t last_seen_device_id;
+  BlockDeviceID last_seen_device_id;
 
   // A vector not a set to keep the writer_fast.
-  std::vector<std::pair<uint64_t, uint32_t>> inodes;
+  std::vector<std::pair<Inode, BlockDeviceID>> inode_and_device;
   std::vector<int32_t> pids;
 
-  void AddDevice(uint32_t);
-  void AddInode(uint64_t);
+  void AddDevice(BlockDeviceID);
+  void AddInode(Inode);
   void AddPid(int32_t);
   void Clear();
 };
diff --git a/include/perfetto/traced/BUILD.gn b/include/perfetto/traced/BUILD.gn
index 4d9fe0c..fefc5fa 100644
--- a/include/perfetto/traced/BUILD.gn
+++ b/include/perfetto/traced/BUILD.gn
@@ -14,6 +14,7 @@
 
 source_set("traced") {
   sources = [
+    "data_source_types.h",
     "traced.h",
   ]
 }
diff --git a/include/perfetto/traced/data_source_types.h b/include/perfetto/traced/data_source_types.h
new file mode 100644
index 0000000..1c4f1b0
--- /dev/null
+++ b/include/perfetto/traced/data_source_types.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef INCLUDE_PERFETTO_TRACED_DATA_SOURCE_TYPES_H_
+#define INCLUDE_PERFETTO_TRACED_DATA_SOURCE_TYPES_H_
+
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+namespace perfetto {
+
+// On ARM, st_ino is not ino_t but unsigned long long.
+using Inode = decltype(stat::st_ino);
+
+// On ARM, st_dev is not dev_t but unsigned long long.
+using BlockDeviceID = decltype(stat::st_dev);
+
+}  // namespace perfetto
+
+#endif  // INCLUDE_PERFETTO_TRACED_DATA_SOURCE_TYPES_H_
diff --git a/protos/perfetto/trace/ftrace/block_bio_backmerge.proto b/protos/perfetto/trace/ftrace/block_bio_backmerge.proto
index ffc4c26..4ced370 100644
--- a/protos/perfetto/trace/ftrace/block_bio_backmerge.proto
+++ b/protos/perfetto/trace/ftrace/block_bio_backmerge.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message BlockBioBackmergeFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 sector = 2;
   optional uint32 nr_sector = 3;
   optional string rwbs = 4;
diff --git a/protos/perfetto/trace/ftrace/block_bio_bounce.proto b/protos/perfetto/trace/ftrace/block_bio_bounce.proto
index b8c3c54..052bbca 100644
--- a/protos/perfetto/trace/ftrace/block_bio_bounce.proto
+++ b/protos/perfetto/trace/ftrace/block_bio_bounce.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message BlockBioBounceFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 sector = 2;
   optional uint32 nr_sector = 3;
   optional string rwbs = 4;
diff --git a/protos/perfetto/trace/ftrace/block_bio_complete.proto b/protos/perfetto/trace/ftrace/block_bio_complete.proto
index 3e60f48..49d7ad4 100644
--- a/protos/perfetto/trace/ftrace/block_bio_complete.proto
+++ b/protos/perfetto/trace/ftrace/block_bio_complete.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message BlockBioCompleteFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 sector = 2;
   optional uint32 nr_sector = 3;
   optional int32 error = 4;
diff --git a/protos/perfetto/trace/ftrace/block_bio_frontmerge.proto b/protos/perfetto/trace/ftrace/block_bio_frontmerge.proto
index 1f065a8..603b3cc 100644
--- a/protos/perfetto/trace/ftrace/block_bio_frontmerge.proto
+++ b/protos/perfetto/trace/ftrace/block_bio_frontmerge.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message BlockBioFrontmergeFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 sector = 2;
   optional uint32 nr_sector = 3;
   optional string rwbs = 4;
diff --git a/protos/perfetto/trace/ftrace/block_bio_queue.proto b/protos/perfetto/trace/ftrace/block_bio_queue.proto
index c531f14..aa414d8 100644
--- a/protos/perfetto/trace/ftrace/block_bio_queue.proto
+++ b/protos/perfetto/trace/ftrace/block_bio_queue.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message BlockBioQueueFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 sector = 2;
   optional uint32 nr_sector = 3;
   optional string rwbs = 4;
diff --git a/protos/perfetto/trace/ftrace/block_bio_remap.proto b/protos/perfetto/trace/ftrace/block_bio_remap.proto
index 6f82a22..8dcafe8 100644
--- a/protos/perfetto/trace/ftrace/block_bio_remap.proto
+++ b/protos/perfetto/trace/ftrace/block_bio_remap.proto
@@ -7,10 +7,10 @@
 package perfetto.protos;
 
 message BlockBioRemapFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 sector = 2;
   optional uint32 nr_sector = 3;
-  optional uint32 old_dev = 4;
+  optional uint64 old_dev = 4;
   optional uint64 old_sector = 5;
   optional string rwbs = 6;
 }
diff --git a/protos/perfetto/trace/ftrace/block_dirty_buffer.proto b/protos/perfetto/trace/ftrace/block_dirty_buffer.proto
index f59bfe5..3e736d7 100644
--- a/protos/perfetto/trace/ftrace/block_dirty_buffer.proto
+++ b/protos/perfetto/trace/ftrace/block_dirty_buffer.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message BlockDirtyBufferFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 sector = 2;
   optional uint64 size = 3;
 }
diff --git a/protos/perfetto/trace/ftrace/block_getrq.proto b/protos/perfetto/trace/ftrace/block_getrq.proto
index 2b52d52..a757b38 100644
--- a/protos/perfetto/trace/ftrace/block_getrq.proto
+++ b/protos/perfetto/trace/ftrace/block_getrq.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message BlockGetrqFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 sector = 2;
   optional uint32 nr_sector = 3;
   optional string rwbs = 4;
diff --git a/protos/perfetto/trace/ftrace/block_rq_abort.proto b/protos/perfetto/trace/ftrace/block_rq_abort.proto
index fdaba4d..a15d1b6 100644
--- a/protos/perfetto/trace/ftrace/block_rq_abort.proto
+++ b/protos/perfetto/trace/ftrace/block_rq_abort.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message BlockRqAbortFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 sector = 2;
   optional uint32 nr_sector = 3;
   optional int32 errors = 4;
diff --git a/protos/perfetto/trace/ftrace/block_rq_complete.proto b/protos/perfetto/trace/ftrace/block_rq_complete.proto
index 98f410b..1d285eb 100644
--- a/protos/perfetto/trace/ftrace/block_rq_complete.proto
+++ b/protos/perfetto/trace/ftrace/block_rq_complete.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message BlockRqCompleteFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 sector = 2;
   optional uint32 nr_sector = 3;
   optional int32 errors = 4;
diff --git a/protos/perfetto/trace/ftrace/block_rq_insert.proto b/protos/perfetto/trace/ftrace/block_rq_insert.proto
index 9cb4c8f..4ae6470 100644
--- a/protos/perfetto/trace/ftrace/block_rq_insert.proto
+++ b/protos/perfetto/trace/ftrace/block_rq_insert.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message BlockRqInsertFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 sector = 2;
   optional uint32 nr_sector = 3;
   optional uint32 bytes = 4;
diff --git a/protos/perfetto/trace/ftrace/block_rq_issue.proto b/protos/perfetto/trace/ftrace/block_rq_issue.proto
index e266c37..aea840f 100644
--- a/protos/perfetto/trace/ftrace/block_rq_issue.proto
+++ b/protos/perfetto/trace/ftrace/block_rq_issue.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message BlockRqIssueFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 sector = 2;
   optional uint32 nr_sector = 3;
   optional uint32 bytes = 4;
diff --git a/protos/perfetto/trace/ftrace/block_rq_remap.proto b/protos/perfetto/trace/ftrace/block_rq_remap.proto
index 5491f09..250e0d7 100644
--- a/protos/perfetto/trace/ftrace/block_rq_remap.proto
+++ b/protos/perfetto/trace/ftrace/block_rq_remap.proto
@@ -7,10 +7,10 @@
 package perfetto.protos;
 
 message BlockRqRemapFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 sector = 2;
   optional uint32 nr_sector = 3;
-  optional uint32 old_dev = 4;
+  optional uint64 old_dev = 4;
   optional uint64 old_sector = 5;
   optional uint32 nr_bios = 6;
   optional string rwbs = 7;
diff --git a/protos/perfetto/trace/ftrace/block_rq_requeue.proto b/protos/perfetto/trace/ftrace/block_rq_requeue.proto
index 4a1a9b2..a749787 100644
--- a/protos/perfetto/trace/ftrace/block_rq_requeue.proto
+++ b/protos/perfetto/trace/ftrace/block_rq_requeue.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message BlockRqRequeueFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 sector = 2;
   optional uint32 nr_sector = 3;
   optional int32 errors = 4;
diff --git a/protos/perfetto/trace/ftrace/block_sleeprq.proto b/protos/perfetto/trace/ftrace/block_sleeprq.proto
index f00c291..36234f1 100644
--- a/protos/perfetto/trace/ftrace/block_sleeprq.proto
+++ b/protos/perfetto/trace/ftrace/block_sleeprq.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message BlockSleeprqFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 sector = 2;
   optional uint32 nr_sector = 3;
   optional string rwbs = 4;
diff --git a/protos/perfetto/trace/ftrace/block_split.proto b/protos/perfetto/trace/ftrace/block_split.proto
index c00b19b..d0ac0dd 100644
--- a/protos/perfetto/trace/ftrace/block_split.proto
+++ b/protos/perfetto/trace/ftrace/block_split.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message BlockSplitFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 sector = 2;
   optional uint64 new_sector = 3;
   optional string rwbs = 4;
diff --git a/protos/perfetto/trace/ftrace/block_touch_buffer.proto b/protos/perfetto/trace/ftrace/block_touch_buffer.proto
index 63908cf..9a82669 100644
--- a/protos/perfetto/trace/ftrace/block_touch_buffer.proto
+++ b/protos/perfetto/trace/ftrace/block_touch_buffer.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message BlockTouchBufferFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 sector = 2;
   optional uint64 size = 3;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_alloc_da_blocks.proto b/protos/perfetto/trace/ftrace/ext4_alloc_da_blocks.proto
index 633a636..c80946f 100644
--- a/protos/perfetto/trace/ftrace/ext4_alloc_da_blocks.proto
+++ b/protos/perfetto/trace/ftrace/ext4_alloc_da_blocks.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4AllocDaBlocksFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint32 data_blocks = 3;
   optional uint32 meta_blocks = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_allocate_blocks.proto b/protos/perfetto/trace/ftrace/ext4_allocate_blocks.proto
index 450ea71..8ac8189 100644
--- a/protos/perfetto/trace/ftrace/ext4_allocate_blocks.proto
+++ b/protos/perfetto/trace/ftrace/ext4_allocate_blocks.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4AllocateBlocksFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint64 block = 3;
   optional uint32 len = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_allocate_inode.proto b/protos/perfetto/trace/ftrace/ext4_allocate_inode.proto
index f158a4e..eeb3fee 100644
--- a/protos/perfetto/trace/ftrace/ext4_allocate_inode.proto
+++ b/protos/perfetto/trace/ftrace/ext4_allocate_inode.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4AllocateInodeFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint64 dir = 3;
   optional uint32 mode = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_begin_ordered_truncate.proto b/protos/perfetto/trace/ftrace/ext4_begin_ordered_truncate.proto
index 9dec91f..2bff30a 100644
--- a/protos/perfetto/trace/ftrace/ext4_begin_ordered_truncate.proto
+++ b/protos/perfetto/trace/ftrace/ext4_begin_ordered_truncate.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4BeginOrderedTruncateFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional int64 new_size = 3;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_collapse_range.proto b/protos/perfetto/trace/ftrace/ext4_collapse_range.proto
index b8a2068..b3894c9 100644
--- a/protos/perfetto/trace/ftrace/ext4_collapse_range.proto
+++ b/protos/perfetto/trace/ftrace/ext4_collapse_range.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4CollapseRangeFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional int64 offset = 3;
   optional int64 len = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_da_release_space.proto b/protos/perfetto/trace/ftrace/ext4_da_release_space.proto
index 08bde5e..d54c947 100644
--- a/protos/perfetto/trace/ftrace/ext4_da_release_space.proto
+++ b/protos/perfetto/trace/ftrace/ext4_da_release_space.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4DaReleaseSpaceFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint64 i_blocks = 3;
   optional int32 freed_blocks = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_da_reserve_space.proto b/protos/perfetto/trace/ftrace/ext4_da_reserve_space.proto
index 5815f7d..841fa55 100644
--- a/protos/perfetto/trace/ftrace/ext4_da_reserve_space.proto
+++ b/protos/perfetto/trace/ftrace/ext4_da_reserve_space.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4DaReserveSpaceFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint64 i_blocks = 3;
   optional int32 reserved_data_blocks = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_da_update_reserve_space.proto b/protos/perfetto/trace/ftrace/ext4_da_update_reserve_space.proto
index c1c2f15..c13354e 100644
--- a/protos/perfetto/trace/ftrace/ext4_da_update_reserve_space.proto
+++ b/protos/perfetto/trace/ftrace/ext4_da_update_reserve_space.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4DaUpdateReserveSpaceFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint64 i_blocks = 3;
   optional int32 used_blocks = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_da_write_begin.proto b/protos/perfetto/trace/ftrace/ext4_da_write_begin.proto
index 25237cb..3b2e1bd 100644
--- a/protos/perfetto/trace/ftrace/ext4_da_write_begin.proto
+++ b/protos/perfetto/trace/ftrace/ext4_da_write_begin.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4DaWriteBeginFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional int64 pos = 3;
   optional uint32 len = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_da_write_end.proto b/protos/perfetto/trace/ftrace/ext4_da_write_end.proto
index 6972d17..70199f8 100644
--- a/protos/perfetto/trace/ftrace/ext4_da_write_end.proto
+++ b/protos/perfetto/trace/ftrace/ext4_da_write_end.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4DaWriteEndFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional int64 pos = 3;
   optional uint32 len = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_da_write_pages.proto b/protos/perfetto/trace/ftrace/ext4_da_write_pages.proto
index 3c7b96e..1d3c076 100644
--- a/protos/perfetto/trace/ftrace/ext4_da_write_pages.proto
+++ b/protos/perfetto/trace/ftrace/ext4_da_write_pages.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4DaWritePagesFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint64 first_page = 3;
   optional int64 nr_to_write = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_da_write_pages_extent.proto b/protos/perfetto/trace/ftrace/ext4_da_write_pages_extent.proto
index 7a13f9d..3756157 100644
--- a/protos/perfetto/trace/ftrace/ext4_da_write_pages_extent.proto
+++ b/protos/perfetto/trace/ftrace/ext4_da_write_pages_extent.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4DaWritePagesExtentFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint64 lblk = 3;
   optional uint32 len = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_direct_IO_enter.proto b/protos/perfetto/trace/ftrace/ext4_direct_IO_enter.proto
index 59688c9..21bbcaf 100644
--- a/protos/perfetto/trace/ftrace/ext4_direct_IO_enter.proto
+++ b/protos/perfetto/trace/ftrace/ext4_direct_IO_enter.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4DirectIOEnterFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional int64 pos = 3;
   optional uint64 len = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_direct_IO_exit.proto b/protos/perfetto/trace/ftrace/ext4_direct_IO_exit.proto
index b58f6ca..9b77ab7 100644
--- a/protos/perfetto/trace/ftrace/ext4_direct_IO_exit.proto
+++ b/protos/perfetto/trace/ftrace/ext4_direct_IO_exit.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4DirectIOExitFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional int64 pos = 3;
   optional uint64 len = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_discard_blocks.proto b/protos/perfetto/trace/ftrace/ext4_discard_blocks.proto
index 2b3e777..6e14a50 100644
--- a/protos/perfetto/trace/ftrace/ext4_discard_blocks.proto
+++ b/protos/perfetto/trace/ftrace/ext4_discard_blocks.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4DiscardBlocksFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 blk = 2;
   optional uint64 count = 3;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_discard_preallocations.proto b/protos/perfetto/trace/ftrace/ext4_discard_preallocations.proto
index 4152887..8cb43c2 100644
--- a/protos/perfetto/trace/ftrace/ext4_discard_preallocations.proto
+++ b/protos/perfetto/trace/ftrace/ext4_discard_preallocations.proto
@@ -7,6 +7,6 @@
 package perfetto.protos;
 
 message Ext4DiscardPreallocationsFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_drop_inode.proto b/protos/perfetto/trace/ftrace/ext4_drop_inode.proto
index f9785b7..c5744df 100644
--- a/protos/perfetto/trace/ftrace/ext4_drop_inode.proto
+++ b/protos/perfetto/trace/ftrace/ext4_drop_inode.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4DropInodeFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional int32 drop = 3;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_es_cache_extent.proto b/protos/perfetto/trace/ftrace/ext4_es_cache_extent.proto
index 95408f6..502e3a8 100644
--- a/protos/perfetto/trace/ftrace/ext4_es_cache_extent.proto
+++ b/protos/perfetto/trace/ftrace/ext4_es_cache_extent.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4EsCacheExtentFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint32 lblk = 3;
   optional uint32 len = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_es_find_delayed_extent_range_enter.proto b/protos/perfetto/trace/ftrace/ext4_es_find_delayed_extent_range_enter.proto
index fda9034..07d1fc0 100644
--- a/protos/perfetto/trace/ftrace/ext4_es_find_delayed_extent_range_enter.proto
+++ b/protos/perfetto/trace/ftrace/ext4_es_find_delayed_extent_range_enter.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4EsFindDelayedExtentRangeEnterFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint32 lblk = 3;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_es_find_delayed_extent_range_exit.proto b/protos/perfetto/trace/ftrace/ext4_es_find_delayed_extent_range_exit.proto
index 21630d3..fd50288 100644
--- a/protos/perfetto/trace/ftrace/ext4_es_find_delayed_extent_range_exit.proto
+++ b/protos/perfetto/trace/ftrace/ext4_es_find_delayed_extent_range_exit.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4EsFindDelayedExtentRangeExitFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint32 lblk = 3;
   optional uint32 len = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_es_insert_extent.proto b/protos/perfetto/trace/ftrace/ext4_es_insert_extent.proto
index c29641c..aca9db7 100644
--- a/protos/perfetto/trace/ftrace/ext4_es_insert_extent.proto
+++ b/protos/perfetto/trace/ftrace/ext4_es_insert_extent.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4EsInsertExtentFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint32 lblk = 3;
   optional uint32 len = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_es_lookup_extent_enter.proto b/protos/perfetto/trace/ftrace/ext4_es_lookup_extent_enter.proto
index 2f82152..7f52999 100644
--- a/protos/perfetto/trace/ftrace/ext4_es_lookup_extent_enter.proto
+++ b/protos/perfetto/trace/ftrace/ext4_es_lookup_extent_enter.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4EsLookupExtentEnterFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint32 lblk = 3;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_es_lookup_extent_exit.proto b/protos/perfetto/trace/ftrace/ext4_es_lookup_extent_exit.proto
index df475fb..e7ca8e4 100644
--- a/protos/perfetto/trace/ftrace/ext4_es_lookup_extent_exit.proto
+++ b/protos/perfetto/trace/ftrace/ext4_es_lookup_extent_exit.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4EsLookupExtentExitFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint32 lblk = 3;
   optional uint32 len = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_es_remove_extent.proto b/protos/perfetto/trace/ftrace/ext4_es_remove_extent.proto
index 7e67019..f853608 100644
--- a/protos/perfetto/trace/ftrace/ext4_es_remove_extent.proto
+++ b/protos/perfetto/trace/ftrace/ext4_es_remove_extent.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4EsRemoveExtentFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional int64 lblk = 3;
   optional int64 len = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_es_shrink.proto b/protos/perfetto/trace/ftrace/ext4_es_shrink.proto
index 3ef83a7..41f449c 100644
--- a/protos/perfetto/trace/ftrace/ext4_es_shrink.proto
+++ b/protos/perfetto/trace/ftrace/ext4_es_shrink.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4EsShrinkFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional int32 nr_shrunk = 2;
   optional uint64 scan_time = 3;
   optional int32 nr_skipped = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_es_shrink_count.proto b/protos/perfetto/trace/ftrace/ext4_es_shrink_count.proto
index aac2143..c4daf6e 100644
--- a/protos/perfetto/trace/ftrace/ext4_es_shrink_count.proto
+++ b/protos/perfetto/trace/ftrace/ext4_es_shrink_count.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4EsShrinkCountFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional int32 nr_to_scan = 2;
   optional int32 cache_cnt = 3;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_es_shrink_scan_enter.proto b/protos/perfetto/trace/ftrace/ext4_es_shrink_scan_enter.proto
index a98ab0b..d4435e0 100644
--- a/protos/perfetto/trace/ftrace/ext4_es_shrink_scan_enter.proto
+++ b/protos/perfetto/trace/ftrace/ext4_es_shrink_scan_enter.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4EsShrinkScanEnterFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional int32 nr_to_scan = 2;
   optional int32 cache_cnt = 3;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_es_shrink_scan_exit.proto b/protos/perfetto/trace/ftrace/ext4_es_shrink_scan_exit.proto
index a959b40..bf31648 100644
--- a/protos/perfetto/trace/ftrace/ext4_es_shrink_scan_exit.proto
+++ b/protos/perfetto/trace/ftrace/ext4_es_shrink_scan_exit.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4EsShrinkScanExitFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional int32 nr_shrunk = 2;
   optional int32 cache_cnt = 3;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_evict_inode.proto b/protos/perfetto/trace/ftrace/ext4_evict_inode.proto
index 763a916..ae0e42d 100644
--- a/protos/perfetto/trace/ftrace/ext4_evict_inode.proto
+++ b/protos/perfetto/trace/ftrace/ext4_evict_inode.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4EvictInodeFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional int32 nlink = 3;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_ext_convert_to_initialized_enter.proto b/protos/perfetto/trace/ftrace/ext4_ext_convert_to_initialized_enter.proto
index 18d000a..5d16860 100644
--- a/protos/perfetto/trace/ftrace/ext4_ext_convert_to_initialized_enter.proto
+++ b/protos/perfetto/trace/ftrace/ext4_ext_convert_to_initialized_enter.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4ExtConvertToInitializedEnterFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint32 m_lblk = 3;
   optional uint32 m_len = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_ext_convert_to_initialized_fastpath.proto b/protos/perfetto/trace/ftrace/ext4_ext_convert_to_initialized_fastpath.proto
index f25d01f..54c2418 100644
--- a/protos/perfetto/trace/ftrace/ext4_ext_convert_to_initialized_fastpath.proto
+++ b/protos/perfetto/trace/ftrace/ext4_ext_convert_to_initialized_fastpath.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4ExtConvertToInitializedFastpathFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint32 m_lblk = 3;
   optional uint32 m_len = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_ext_handle_unwritten_extents.proto b/protos/perfetto/trace/ftrace/ext4_ext_handle_unwritten_extents.proto
index 6a84188..b2f9eb5 100644
--- a/protos/perfetto/trace/ftrace/ext4_ext_handle_unwritten_extents.proto
+++ b/protos/perfetto/trace/ftrace/ext4_ext_handle_unwritten_extents.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4ExtHandleUnwrittenExtentsFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional int32 flags = 3;
   optional uint32 lblk = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_ext_in_cache.proto b/protos/perfetto/trace/ftrace/ext4_ext_in_cache.proto
index ee61bc6..47c2bf9 100644
--- a/protos/perfetto/trace/ftrace/ext4_ext_in_cache.proto
+++ b/protos/perfetto/trace/ftrace/ext4_ext_in_cache.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4ExtInCacheFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint32 lblk = 3;
   optional int32 ret = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_ext_load_extent.proto b/protos/perfetto/trace/ftrace/ext4_ext_load_extent.proto
index 070c6d6..45ecb56 100644
--- a/protos/perfetto/trace/ftrace/ext4_ext_load_extent.proto
+++ b/protos/perfetto/trace/ftrace/ext4_ext_load_extent.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4ExtLoadExtentFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint64 pblk = 3;
   optional uint32 lblk = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_ext_map_blocks_enter.proto b/protos/perfetto/trace/ftrace/ext4_ext_map_blocks_enter.proto
index f561978..0d8a15f 100644
--- a/protos/perfetto/trace/ftrace/ext4_ext_map_blocks_enter.proto
+++ b/protos/perfetto/trace/ftrace/ext4_ext_map_blocks_enter.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4ExtMapBlocksEnterFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint32 lblk = 3;
   optional uint32 len = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_ext_map_blocks_exit.proto b/protos/perfetto/trace/ftrace/ext4_ext_map_blocks_exit.proto
index a0c6a50..4cdc00d 100644
--- a/protos/perfetto/trace/ftrace/ext4_ext_map_blocks_exit.proto
+++ b/protos/perfetto/trace/ftrace/ext4_ext_map_blocks_exit.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4ExtMapBlocksExitFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint32 flags = 3;
   optional uint64 pblk = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_ext_put_in_cache.proto b/protos/perfetto/trace/ftrace/ext4_ext_put_in_cache.proto
index 58ad6b0..eff3942 100644
--- a/protos/perfetto/trace/ftrace/ext4_ext_put_in_cache.proto
+++ b/protos/perfetto/trace/ftrace/ext4_ext_put_in_cache.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4ExtPutInCacheFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint32 lblk = 3;
   optional uint32 len = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_ext_remove_space.proto b/protos/perfetto/trace/ftrace/ext4_ext_remove_space.proto
index 93d9bf3..d6564e9 100644
--- a/protos/perfetto/trace/ftrace/ext4_ext_remove_space.proto
+++ b/protos/perfetto/trace/ftrace/ext4_ext_remove_space.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4ExtRemoveSpaceFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint32 start = 3;
   optional uint32 end = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_ext_remove_space_done.proto b/protos/perfetto/trace/ftrace/ext4_ext_remove_space_done.proto
index da8566f..f8bdf70 100644
--- a/protos/perfetto/trace/ftrace/ext4_ext_remove_space_done.proto
+++ b/protos/perfetto/trace/ftrace/ext4_ext_remove_space_done.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4ExtRemoveSpaceDoneFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint32 start = 3;
   optional uint32 end = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_ext_rm_idx.proto b/protos/perfetto/trace/ftrace/ext4_ext_rm_idx.proto
index ac81910..5c46720 100644
--- a/protos/perfetto/trace/ftrace/ext4_ext_rm_idx.proto
+++ b/protos/perfetto/trace/ftrace/ext4_ext_rm_idx.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4ExtRmIdxFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint64 pblk = 3;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_ext_rm_leaf.proto b/protos/perfetto/trace/ftrace/ext4_ext_rm_leaf.proto
index f7b8e69..47a6d2f 100644
--- a/protos/perfetto/trace/ftrace/ext4_ext_rm_leaf.proto
+++ b/protos/perfetto/trace/ftrace/ext4_ext_rm_leaf.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4ExtRmLeafFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional int64 partial = 3;
   optional uint32 start = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_ext_show_extent.proto b/protos/perfetto/trace/ftrace/ext4_ext_show_extent.proto
index 37a2dab..cc5774c 100644
--- a/protos/perfetto/trace/ftrace/ext4_ext_show_extent.proto
+++ b/protos/perfetto/trace/ftrace/ext4_ext_show_extent.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4ExtShowExtentFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint64 pblk = 3;
   optional uint32 lblk = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_fallocate_enter.proto b/protos/perfetto/trace/ftrace/ext4_fallocate_enter.proto
index f6f783a..162779f 100644
--- a/protos/perfetto/trace/ftrace/ext4_fallocate_enter.proto
+++ b/protos/perfetto/trace/ftrace/ext4_fallocate_enter.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4FallocateEnterFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional int64 offset = 3;
   optional int64 len = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_fallocate_exit.proto b/protos/perfetto/trace/ftrace/ext4_fallocate_exit.proto
index a44cbe9..a0dcf57 100644
--- a/protos/perfetto/trace/ftrace/ext4_fallocate_exit.proto
+++ b/protos/perfetto/trace/ftrace/ext4_fallocate_exit.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4FallocateExitFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional int64 pos = 3;
   optional uint32 blocks = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_find_delalloc_range.proto b/protos/perfetto/trace/ftrace/ext4_find_delalloc_range.proto
index 6a0d2b4..b8816b0 100644
--- a/protos/perfetto/trace/ftrace/ext4_find_delalloc_range.proto
+++ b/protos/perfetto/trace/ftrace/ext4_find_delalloc_range.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4FindDelallocRangeFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint32 from = 3;
   optional uint32 to = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_forget.proto b/protos/perfetto/trace/ftrace/ext4_forget.proto
index 8a8acc8..5d34bc1 100644
--- a/protos/perfetto/trace/ftrace/ext4_forget.proto
+++ b/protos/perfetto/trace/ftrace/ext4_forget.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4ForgetFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint64 block = 3;
   optional int32 is_metadata = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_free_blocks.proto b/protos/perfetto/trace/ftrace/ext4_free_blocks.proto
index 9e652c4..338c4cf 100644
--- a/protos/perfetto/trace/ftrace/ext4_free_blocks.proto
+++ b/protos/perfetto/trace/ftrace/ext4_free_blocks.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4FreeBlocksFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint64 block = 3;
   optional uint64 count = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_free_inode.proto b/protos/perfetto/trace/ftrace/ext4_free_inode.proto
index c1d240f..d049f2d 100644
--- a/protos/perfetto/trace/ftrace/ext4_free_inode.proto
+++ b/protos/perfetto/trace/ftrace/ext4_free_inode.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4FreeInodeFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint32 uid = 3;
   optional uint32 gid = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_get_implied_cluster_alloc_exit.proto b/protos/perfetto/trace/ftrace/ext4_get_implied_cluster_alloc_exit.proto
index b500d1f..afa4438 100644
--- a/protos/perfetto/trace/ftrace/ext4_get_implied_cluster_alloc_exit.proto
+++ b/protos/perfetto/trace/ftrace/ext4_get_implied_cluster_alloc_exit.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4GetImpliedClusterAllocExitFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint32 flags = 2;
   optional uint32 lblk = 3;
   optional uint64 pblk = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_get_reserved_cluster_alloc.proto b/protos/perfetto/trace/ftrace/ext4_get_reserved_cluster_alloc.proto
index cb9cdfc..d44e2c1 100644
--- a/protos/perfetto/trace/ftrace/ext4_get_reserved_cluster_alloc.proto
+++ b/protos/perfetto/trace/ftrace/ext4_get_reserved_cluster_alloc.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4GetReservedClusterAllocFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint32 lblk = 3;
   optional uint32 len = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_ind_map_blocks_enter.proto b/protos/perfetto/trace/ftrace/ext4_ind_map_blocks_enter.proto
index cfa6304..f4c1a94 100644
--- a/protos/perfetto/trace/ftrace/ext4_ind_map_blocks_enter.proto
+++ b/protos/perfetto/trace/ftrace/ext4_ind_map_blocks_enter.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4IndMapBlocksEnterFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint32 lblk = 3;
   optional uint32 len = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_ind_map_blocks_exit.proto b/protos/perfetto/trace/ftrace/ext4_ind_map_blocks_exit.proto
index bd368eb..f942d3d 100644
--- a/protos/perfetto/trace/ftrace/ext4_ind_map_blocks_exit.proto
+++ b/protos/perfetto/trace/ftrace/ext4_ind_map_blocks_exit.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4IndMapBlocksExitFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint32 flags = 3;
   optional uint64 pblk = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_insert_range.proto b/protos/perfetto/trace/ftrace/ext4_insert_range.proto
index 4010cf0..bfb5ab2 100644
--- a/protos/perfetto/trace/ftrace/ext4_insert_range.proto
+++ b/protos/perfetto/trace/ftrace/ext4_insert_range.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4InsertRangeFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional int64 offset = 3;
   optional int64 len = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_invalidatepage.proto b/protos/perfetto/trace/ftrace/ext4_invalidatepage.proto
index 951ff05..ce49c38 100644
--- a/protos/perfetto/trace/ftrace/ext4_invalidatepage.proto
+++ b/protos/perfetto/trace/ftrace/ext4_invalidatepage.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4InvalidatepageFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint64 index = 3;
   optional uint32 offset = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_journal_start.proto b/protos/perfetto/trace/ftrace/ext4_journal_start.proto
index f361673..896ca59 100644
--- a/protos/perfetto/trace/ftrace/ext4_journal_start.proto
+++ b/protos/perfetto/trace/ftrace/ext4_journal_start.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4JournalStartFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ip = 2;
   optional int32 blocks = 3;
   optional int32 rsv_blocks = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_journal_start_reserved.proto b/protos/perfetto/trace/ftrace/ext4_journal_start_reserved.proto
index 61d3cc7..58f4340 100644
--- a/protos/perfetto/trace/ftrace/ext4_journal_start_reserved.proto
+++ b/protos/perfetto/trace/ftrace/ext4_journal_start_reserved.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4JournalStartReservedFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ip = 2;
   optional int32 blocks = 3;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_journalled_invalidatepage.proto b/protos/perfetto/trace/ftrace/ext4_journalled_invalidatepage.proto
index 4503ec2..a5c544f 100644
--- a/protos/perfetto/trace/ftrace/ext4_journalled_invalidatepage.proto
+++ b/protos/perfetto/trace/ftrace/ext4_journalled_invalidatepage.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4JournalledInvalidatepageFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint64 index = 3;
   optional uint32 offset = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_journalled_write_end.proto b/protos/perfetto/trace/ftrace/ext4_journalled_write_end.proto
index 8cebed4..f137b6d 100644
--- a/protos/perfetto/trace/ftrace/ext4_journalled_write_end.proto
+++ b/protos/perfetto/trace/ftrace/ext4_journalled_write_end.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4JournalledWriteEndFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional int64 pos = 3;
   optional uint32 len = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_load_inode.proto b/protos/perfetto/trace/ftrace/ext4_load_inode.proto
index 3bfa913..21361ad 100644
--- a/protos/perfetto/trace/ftrace/ext4_load_inode.proto
+++ b/protos/perfetto/trace/ftrace/ext4_load_inode.proto
@@ -7,6 +7,6 @@
 package perfetto.protos;
 
 message Ext4LoadInodeFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_load_inode_bitmap.proto b/protos/perfetto/trace/ftrace/ext4_load_inode_bitmap.proto
index 41082d8..d40b933 100644
--- a/protos/perfetto/trace/ftrace/ext4_load_inode_bitmap.proto
+++ b/protos/perfetto/trace/ftrace/ext4_load_inode_bitmap.proto
@@ -7,6 +7,6 @@
 package perfetto.protos;
 
 message Ext4LoadInodeBitmapFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint32 group = 2;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_mark_inode_dirty.proto b/protos/perfetto/trace/ftrace/ext4_mark_inode_dirty.proto
index e291d9f..c228b21 100644
--- a/protos/perfetto/trace/ftrace/ext4_mark_inode_dirty.proto
+++ b/protos/perfetto/trace/ftrace/ext4_mark_inode_dirty.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4MarkInodeDirtyFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint64 ip = 3;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_mb_bitmap_load.proto b/protos/perfetto/trace/ftrace/ext4_mb_bitmap_load.proto
index 471b417..fc2216f 100644
--- a/protos/perfetto/trace/ftrace/ext4_mb_bitmap_load.proto
+++ b/protos/perfetto/trace/ftrace/ext4_mb_bitmap_load.proto
@@ -7,6 +7,6 @@
 package perfetto.protos;
 
 message Ext4MbBitmapLoadFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint32 group = 2;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_mb_buddy_bitmap_load.proto b/protos/perfetto/trace/ftrace/ext4_mb_buddy_bitmap_load.proto
index 4f4286b..11b876b 100644
--- a/protos/perfetto/trace/ftrace/ext4_mb_buddy_bitmap_load.proto
+++ b/protos/perfetto/trace/ftrace/ext4_mb_buddy_bitmap_load.proto
@@ -7,6 +7,6 @@
 package perfetto.protos;
 
 message Ext4MbBuddyBitmapLoadFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint32 group = 2;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_mb_discard_preallocations.proto b/protos/perfetto/trace/ftrace/ext4_mb_discard_preallocations.proto
index 1ff579a..35b6553 100644
--- a/protos/perfetto/trace/ftrace/ext4_mb_discard_preallocations.proto
+++ b/protos/perfetto/trace/ftrace/ext4_mb_discard_preallocations.proto
@@ -7,6 +7,6 @@
 package perfetto.protos;
 
 message Ext4MbDiscardPreallocationsFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional int32 needed = 2;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_mb_new_group_pa.proto b/protos/perfetto/trace/ftrace/ext4_mb_new_group_pa.proto
index fec3b6b..38c7c61 100644
--- a/protos/perfetto/trace/ftrace/ext4_mb_new_group_pa.proto
+++ b/protos/perfetto/trace/ftrace/ext4_mb_new_group_pa.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4MbNewGroupPaFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint64 pa_pstart = 3;
   optional uint64 pa_lstart = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_mb_new_inode_pa.proto b/protos/perfetto/trace/ftrace/ext4_mb_new_inode_pa.proto
index 36dae58..c4b1e60 100644
--- a/protos/perfetto/trace/ftrace/ext4_mb_new_inode_pa.proto
+++ b/protos/perfetto/trace/ftrace/ext4_mb_new_inode_pa.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4MbNewInodePaFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint64 pa_pstart = 3;
   optional uint64 pa_lstart = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_mb_release_group_pa.proto b/protos/perfetto/trace/ftrace/ext4_mb_release_group_pa.proto
index d720fdf..f12af7e 100644
--- a/protos/perfetto/trace/ftrace/ext4_mb_release_group_pa.proto
+++ b/protos/perfetto/trace/ftrace/ext4_mb_release_group_pa.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4MbReleaseGroupPaFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 pa_pstart = 2;
   optional uint32 pa_len = 3;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_mb_release_inode_pa.proto b/protos/perfetto/trace/ftrace/ext4_mb_release_inode_pa.proto
index 7601e49..f4e275c 100644
--- a/protos/perfetto/trace/ftrace/ext4_mb_release_inode_pa.proto
+++ b/protos/perfetto/trace/ftrace/ext4_mb_release_inode_pa.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4MbReleaseInodePaFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint64 block = 3;
   optional uint32 count = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_mballoc_alloc.proto b/protos/perfetto/trace/ftrace/ext4_mballoc_alloc.proto
index 6218492..863fd30 100644
--- a/protos/perfetto/trace/ftrace/ext4_mballoc_alloc.proto
+++ b/protos/perfetto/trace/ftrace/ext4_mballoc_alloc.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4MballocAllocFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint32 orig_logical = 3;
   optional int32 orig_start = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_mballoc_discard.proto b/protos/perfetto/trace/ftrace/ext4_mballoc_discard.proto
index e299416..97d6ef6 100644
--- a/protos/perfetto/trace/ftrace/ext4_mballoc_discard.proto
+++ b/protos/perfetto/trace/ftrace/ext4_mballoc_discard.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4MballocDiscardFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional int32 result_start = 3;
   optional uint32 result_group = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_mballoc_free.proto b/protos/perfetto/trace/ftrace/ext4_mballoc_free.proto
index 4ce2184..51176b9 100644
--- a/protos/perfetto/trace/ftrace/ext4_mballoc_free.proto
+++ b/protos/perfetto/trace/ftrace/ext4_mballoc_free.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4MballocFreeFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional int32 result_start = 3;
   optional uint32 result_group = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_mballoc_prealloc.proto b/protos/perfetto/trace/ftrace/ext4_mballoc_prealloc.proto
index 310b940..efd0dd3 100644
--- a/protos/perfetto/trace/ftrace/ext4_mballoc_prealloc.proto
+++ b/protos/perfetto/trace/ftrace/ext4_mballoc_prealloc.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4MballocPreallocFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint32 orig_logical = 3;
   optional int32 orig_start = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_other_inode_update_time.proto b/protos/perfetto/trace/ftrace/ext4_other_inode_update_time.proto
index ec50a8d..54fc8eb 100644
--- a/protos/perfetto/trace/ftrace/ext4_other_inode_update_time.proto
+++ b/protos/perfetto/trace/ftrace/ext4_other_inode_update_time.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4OtherInodeUpdateTimeFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint64 orig_ino = 3;
   optional uint32 uid = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_punch_hole.proto b/protos/perfetto/trace/ftrace/ext4_punch_hole.proto
index 9fe0b19..cf14f24 100644
--- a/protos/perfetto/trace/ftrace/ext4_punch_hole.proto
+++ b/protos/perfetto/trace/ftrace/ext4_punch_hole.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4PunchHoleFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional int64 offset = 3;
   optional int64 len = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_read_block_bitmap_load.proto b/protos/perfetto/trace/ftrace/ext4_read_block_bitmap_load.proto
index f31b196..047b90a 100644
--- a/protos/perfetto/trace/ftrace/ext4_read_block_bitmap_load.proto
+++ b/protos/perfetto/trace/ftrace/ext4_read_block_bitmap_load.proto
@@ -7,6 +7,6 @@
 package perfetto.protos;
 
 message Ext4ReadBlockBitmapLoadFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint32 group = 2;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_readpage.proto b/protos/perfetto/trace/ftrace/ext4_readpage.proto
index 2a80964..5498ad2 100644
--- a/protos/perfetto/trace/ftrace/ext4_readpage.proto
+++ b/protos/perfetto/trace/ftrace/ext4_readpage.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4ReadpageFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint64 index = 3;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_releasepage.proto b/protos/perfetto/trace/ftrace/ext4_releasepage.proto
index 63039b9..a3db3a4 100644
--- a/protos/perfetto/trace/ftrace/ext4_releasepage.proto
+++ b/protos/perfetto/trace/ftrace/ext4_releasepage.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4ReleasepageFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint64 index = 3;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_remove_blocks.proto b/protos/perfetto/trace/ftrace/ext4_remove_blocks.proto
index 3eef63f..cce1830 100644
--- a/protos/perfetto/trace/ftrace/ext4_remove_blocks.proto
+++ b/protos/perfetto/trace/ftrace/ext4_remove_blocks.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4RemoveBlocksFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint32 from = 3;
   optional uint32 to = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_request_blocks.proto b/protos/perfetto/trace/ftrace/ext4_request_blocks.proto
index 19044d8..1df9c3c 100644
--- a/protos/perfetto/trace/ftrace/ext4_request_blocks.proto
+++ b/protos/perfetto/trace/ftrace/ext4_request_blocks.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4RequestBlocksFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint32 len = 3;
   optional uint32 logical = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_request_inode.proto b/protos/perfetto/trace/ftrace/ext4_request_inode.proto
index 5bf9b35..b3fd925 100644
--- a/protos/perfetto/trace/ftrace/ext4_request_inode.proto
+++ b/protos/perfetto/trace/ftrace/ext4_request_inode.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4RequestInodeFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 dir = 2;
   optional uint32 mode = 3;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_sync_file_enter.proto b/protos/perfetto/trace/ftrace/ext4_sync_file_enter.proto
index 6a26f79..1975531 100644
--- a/protos/perfetto/trace/ftrace/ext4_sync_file_enter.proto
+++ b/protos/perfetto/trace/ftrace/ext4_sync_file_enter.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4SyncFileEnterFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint64 parent = 3;
   optional int32 datasync = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_sync_file_exit.proto b/protos/perfetto/trace/ftrace/ext4_sync_file_exit.proto
index 71c49c6..dcc4c25 100644
--- a/protos/perfetto/trace/ftrace/ext4_sync_file_exit.proto
+++ b/protos/perfetto/trace/ftrace/ext4_sync_file_exit.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4SyncFileExitFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional int32 ret = 3;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_sync_fs.proto b/protos/perfetto/trace/ftrace/ext4_sync_fs.proto
index be5ce76..fcec0cf 100644
--- a/protos/perfetto/trace/ftrace/ext4_sync_fs.proto
+++ b/protos/perfetto/trace/ftrace/ext4_sync_fs.proto
@@ -7,6 +7,6 @@
 package perfetto.protos;
 
 message Ext4SyncFsFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional int32 wait = 2;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_truncate_enter.proto b/protos/perfetto/trace/ftrace/ext4_truncate_enter.proto
index 305aeac..cb2acce 100644
--- a/protos/perfetto/trace/ftrace/ext4_truncate_enter.proto
+++ b/protos/perfetto/trace/ftrace/ext4_truncate_enter.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4TruncateEnterFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint64 blocks = 3;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_truncate_exit.proto b/protos/perfetto/trace/ftrace/ext4_truncate_exit.proto
index 37c7ede..ed55ef4 100644
--- a/protos/perfetto/trace/ftrace/ext4_truncate_exit.proto
+++ b/protos/perfetto/trace/ftrace/ext4_truncate_exit.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4TruncateExitFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint64 blocks = 3;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_unlink_enter.proto b/protos/perfetto/trace/ftrace/ext4_unlink_enter.proto
index 408db09..615df11 100644
--- a/protos/perfetto/trace/ftrace/ext4_unlink_enter.proto
+++ b/protos/perfetto/trace/ftrace/ext4_unlink_enter.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4UnlinkEnterFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint64 parent = 3;
   optional int64 size = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_unlink_exit.proto b/protos/perfetto/trace/ftrace/ext4_unlink_exit.proto
index e9538aa..dd80e23 100644
--- a/protos/perfetto/trace/ftrace/ext4_unlink_exit.proto
+++ b/protos/perfetto/trace/ftrace/ext4_unlink_exit.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4UnlinkExitFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional int32 ret = 3;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_write_begin.proto b/protos/perfetto/trace/ftrace/ext4_write_begin.proto
index 1a63dd4..3473060 100644
--- a/protos/perfetto/trace/ftrace/ext4_write_begin.proto
+++ b/protos/perfetto/trace/ftrace/ext4_write_begin.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4WriteBeginFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional int64 pos = 3;
   optional uint32 len = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_write_end.proto b/protos/perfetto/trace/ftrace/ext4_write_end.proto
index b34805f..f8c8388 100644
--- a/protos/perfetto/trace/ftrace/ext4_write_end.proto
+++ b/protos/perfetto/trace/ftrace/ext4_write_end.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4WriteEndFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional int64 pos = 3;
   optional uint32 len = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_writepage.proto b/protos/perfetto/trace/ftrace/ext4_writepage.proto
index ae79ba5..6c4b854 100644
--- a/protos/perfetto/trace/ftrace/ext4_writepage.proto
+++ b/protos/perfetto/trace/ftrace/ext4_writepage.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4WritepageFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint64 index = 3;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_writepages.proto b/protos/perfetto/trace/ftrace/ext4_writepages.proto
index 870ed70..0b76cb3 100644
--- a/protos/perfetto/trace/ftrace/ext4_writepages.proto
+++ b/protos/perfetto/trace/ftrace/ext4_writepages.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4WritepagesFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional int64 nr_to_write = 3;
   optional int64 pages_skipped = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_writepages_result.proto b/protos/perfetto/trace/ftrace/ext4_writepages_result.proto
index dfefa79..f5d8173 100644
--- a/protos/perfetto/trace/ftrace/ext4_writepages_result.proto
+++ b/protos/perfetto/trace/ftrace/ext4_writepages_result.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4WritepagesResultFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional int32 ret = 3;
   optional int32 pages_written = 4;
diff --git a/protos/perfetto/trace/ftrace/ext4_zero_range.proto b/protos/perfetto/trace/ftrace/ext4_zero_range.proto
index 904b7cb..e064c62 100644
--- a/protos/perfetto/trace/ftrace/ext4_zero_range.proto
+++ b/protos/perfetto/trace/ftrace/ext4_zero_range.proto
@@ -7,7 +7,7 @@
 package perfetto.protos;
 
 message Ext4ZeroRangeFtraceEvent {
-  optional uint32 dev = 1;
+  optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional int64 offset = 3;
   optional int64 len = 4;
diff --git a/protos/perfetto/trace/ftrace/mm_filemap_add_to_page_cache.proto b/protos/perfetto/trace/ftrace/mm_filemap_add_to_page_cache.proto
index 3bab542..3399623 100644
--- a/protos/perfetto/trace/ftrace/mm_filemap_add_to_page_cache.proto
+++ b/protos/perfetto/trace/ftrace/mm_filemap_add_to_page_cache.proto
@@ -10,5 +10,5 @@
   optional uint64 pfn = 1;
   optional uint64 i_ino = 2;
   optional uint64 index = 3;
-  optional uint32 s_dev = 4;
+  optional uint64 s_dev = 4;
 }
diff --git a/protos/perfetto/trace/ftrace/mm_filemap_delete_from_page_cache.proto b/protos/perfetto/trace/ftrace/mm_filemap_delete_from_page_cache.proto
index 24f798b..9a49483 100644
--- a/protos/perfetto/trace/ftrace/mm_filemap_delete_from_page_cache.proto
+++ b/protos/perfetto/trace/ftrace/mm_filemap_delete_from_page_cache.proto
@@ -10,5 +10,5 @@
   optional uint64 pfn = 1;
   optional uint64 i_ino = 2;
   optional uint64 index = 3;
-  optional uint32 s_dev = 4;
+  optional uint64 s_dev = 4;
 }
diff --git a/protos/perfetto/trace/ps/process_tree.proto b/protos/perfetto/trace/ps/process_tree.proto
index 406209c..c1538fe 100644
--- a/protos/perfetto/trace/ps/process_tree.proto
+++ b/protos/perfetto/trace/ps/process_tree.proto
@@ -28,7 +28,7 @@
     optional string name = 2;
   }
 
-  // Representation of a processs.
+  // Representation of a process.
   message Process {
     // The UNIX process ID, aka thread group ID (as per getpid()).
     optional int32 pid = 1;
diff --git a/src/ftrace_reader/cpu_reader.cc b/src/ftrace_reader/cpu_reader.cc
index 6eadb3e..0a270cf 100644
--- a/src/ftrace_reader/cpu_reader.cc
+++ b/src/ftrace_reader/cpu_reader.cc
@@ -488,8 +488,11 @@
     case kPid32ToInt32:
       ReadPid(field_start, field_id, message, metadata);
       return true;
-    case kDevId32ToUint32:
-      ReadDevId(field_start, field_id, message, metadata);
+    case kDevId32ToUint64:
+      ReadDevId<uint32_t>(field_start, field_id, message, metadata);
+      return true;
+    case kDevId64ToUint64:
+      ReadDevId<uint64_t>(field_start, field_id, message, metadata);
       return true;
   }
   // Not reached, for gcc.
diff --git a/src/ftrace_reader/cpu_reader.h b/src/ftrace_reader/cpu_reader.h
index 0a4fe87..53cb89d 100644
--- a/src/ftrace_reader/cpu_reader.h
+++ b/src/ftrace_reader/cpu_reader.h
@@ -20,6 +20,7 @@
 #include <stdint.h>
 #include <string.h>
 
+#include <sys/sysmacros.h>
 #include <array>
 #include <memory>
 #include <set>
@@ -30,6 +31,7 @@
 #include "perfetto/base/thread_checker.h"
 #include "perfetto/ftrace_reader/ftrace_controller.h"
 #include "perfetto/protozero/message.h"
+#include "perfetto/traced/data_source_types.h"
 #include "src/ftrace_reader/proto_translation_table.h"
 
 namespace perfetto {
@@ -115,15 +117,19 @@
                         protozero::Message* out,
                         FtraceMetadata* metadata) {
     T t = ReadIntoVarInt<T>(start, field_id, out);
-    metadata->AddInode(t);
+    metadata->AddInode(static_cast<Inode>(t));
   }
 
+  template <typename T>
   static void ReadDevId(const uint8_t* start,
                         size_t field_id,
                         protozero::Message* out,
                         FtraceMetadata* metadata) {
-    uint32_t dev_id = ReadIntoVarInt<uint32_t>(start, field_id, out);
-    PERFETTO_DCHECK(dev_id != 0);
+    T t;
+    memcpy(&t, reinterpret_cast<const void*>(start), sizeof(T));
+    BlockDeviceID dev_id = TranslateBlockDeviceIDToUserspace<T>(t);
+    out->AppendVarInt<BlockDeviceID>(field_id, dev_id);
+    PERFETTO_DCHECK(t != 0);
     metadata->AddDevice(dev_id);
   }
 
@@ -135,6 +141,22 @@
     metadata->AddPid(pid);
   }
 
+  // Internally the kernel stores device ids in a different layout to that
+  // exposed to userspace via stat etc. There's no userspace function to convert
+  // between the formats so we have to do it ourselves.
+  template <typename T>
+  static BlockDeviceID TranslateBlockDeviceIDToUserspace(T kernel_dev) {
+    // Provided search index s_dev from
+    // https://github.com/torvalds/linux/blob/v4.12/include/linux/fs.h#L404
+    // Convert to user space id using
+    // https://github.com/torvalds/linux/blob/v4.12/include/linux/kdev_t.h#L10
+    // TODO(azappone): see if this is the same on all platforms
+    unsigned int maj = static_cast<unsigned int>((kernel_dev) >> 20);
+    unsigned int min =
+        static_cast<unsigned int>((kernel_dev) & ((1U << 20) - 1));
+    return static_cast<BlockDeviceID>(makedev(maj, min));
+  }
+
   // Iterate through every file in the current directory and check if the inode
   // number of each file matches any of the inode numbers saved in events.
   // Returns map of inode number to filename for every inode number that is
diff --git a/src/ftrace_reader/cpu_reader_unittest.cc b/src/ftrace_reader/cpu_reader_unittest.cc
index 300c97f..8ed33ba 100644
--- a/src/ftrace_reader/cpu_reader_unittest.cc
+++ b/src/ftrace_reader/cpu_reader_unittest.cc
@@ -713,14 +713,14 @@
     event->proto_field_id = 42;
     event->ftrace_event_id = ftrace_event_id;
     {
-      // dev32 -> uint32
+      // dev32 -> uint64
       event->fields.emplace_back(Field{});
       Field* field = &event->fields.back();
       field->ftrace_offset = 8;
       field->ftrace_size = 4;
       field->ftrace_type = kFtraceDevId32;
       field->proto_field_id = 1;
-      field->proto_field_type = kProtoUint32;
+      field->proto_field_type = kProtoUint64;
       SetTranslationStrategy(field->ftrace_type, field->proto_field_type,
                              &field->strategy);
     }
@@ -761,11 +761,23 @@
                              &field->strategy);
     }
     {
-      // ino_t (64bit) -> uint64
+      // dev64 -> uint64
       event->fields.emplace_back(Field{});
       Field* field = &event->fields.back();
       field->ftrace_offset = 24;
       field->ftrace_size = 8;
+      field->ftrace_type = kFtraceDevId64;
+      field->proto_field_id = 6;
+      field->proto_field_type = kProtoUint64;
+      SetTranslationStrategy(field->ftrace_type, field->proto_field_type,
+                             &field->strategy);
+    }
+    {
+      // ino_t (64bit) -> uint64
+      event->fields.emplace_back(Field{});
+      Field* field = &event->fields.back();
+      field->ftrace_offset = 32;
+      field->ftrace_size = 8;
       field->ftrace_type = kFtraceInode64;
       field->proto_field_id = 4;
       field->proto_field_type = kProtoUint64;
@@ -776,7 +788,7 @@
       // char[16] -> string
       event->fields.emplace_back(Field{});
       Field* field = &event->fields.back();
-      field->ftrace_offset = 32;
+      field->ftrace_offset = 40;
       field->ftrace_size = 16;
       field->ftrace_type = kFtraceFixedCString;
       field->proto_field_id = 500;
@@ -788,7 +800,7 @@
       // char -> string
       event->fields.emplace_back(Field{});
       Field* field = &event->fields.back();
-      field->ftrace_offset = 48;
+      field->ftrace_offset = 56;
       field->ftrace_size = 0;
       field->ftrace_type = kFtraceCString;
       field->proto_field_id = 501;
@@ -802,13 +814,26 @@
   FakeEventProvider provider(base::kPageSize);
 
   BinaryWriter writer;
+
+  // Must use the bit masks to translate between kernel and userspace device ids
+  // to generate the below examples
+  const uint32_t example_32_bit_kdev = 271581216;
+  const uint64_t example_32_bit_userspace_dev =
+      CpuReader::TranslateBlockDeviceIDToUserspace<uint32_t>(
+          example_32_bit_kdev);
+  const uint64_t example_64_bit_kdev = 4442450946;
+  const uint64_t example_64_bit_userspace_dev =
+      CpuReader::TranslateBlockDeviceIDToUserspace<uint64_t>(
+          example_64_bit_kdev);
+
   writer.Write<int32_t>(1001);  // Common field.
   writer.Write<int32_t>(9999);  // A gap we shouldn't read.
-  writer.Write<int32_t>(1002);  // Dev id
+  writer.Write<int32_t>(example_32_bit_kdev);  // Dev id
   writer.Write<int32_t>(97);    // Pid
   writer.Write<int32_t>(1003);  // Uint32 field
-  writer.Write<int32_t>(98);    // Inode 1
-  writer.Write<int64_t>(99);    // Inode 2
+  writer.Write<int32_t>(98);    // Inode 32
+  writer.Write<int64_t>(example_64_bit_kdev);  // Dev id 64
+  writer.Write<int64_t>(99u);                  // Inode 64
   writer.WriteFixedString(16, "Hello");
   writer.WriteFixedString(300, "Goodbye");
 
@@ -824,17 +849,114 @@
   ASSERT_TRUE(event);
   EXPECT_EQ(event->common_field(), 1001ul);
   EXPECT_EQ(event->event_case(), FakeFtraceEvent::kAllFields);
-  EXPECT_EQ(event->all_fields().field_dev(), 1002ul);
+  EXPECT_EQ(event->all_fields().field_dev_32(), example_32_bit_userspace_dev);
   EXPECT_EQ(event->all_fields().field_pid(), 97);
   EXPECT_EQ(event->all_fields().field_uint32(), 1003u);
   EXPECT_EQ(event->all_fields().field_inode_32(), 98u);
+  EXPECT_EQ(event->all_fields().field_dev_64(), example_64_bit_userspace_dev);
   EXPECT_EQ(event->all_fields().field_inode_64(), 99u);
   EXPECT_EQ(event->all_fields().field_char_16(), "Hello");
   EXPECT_EQ(event->all_fields().field_char(), "Goodbye");
   EXPECT_THAT(metadata.pids, Contains(97));
-  EXPECT_EQ(metadata.inodes.size(), 2U);
-  EXPECT_THAT(metadata.inodes, Contains(Pair(98u, 1002)));
-  EXPECT_THAT(metadata.inodes, Contains(Pair(99u, 1002ul)));
+  EXPECT_THAT(metadata.last_seen_device_id, example_64_bit_userspace_dev);
+  EXPECT_EQ(metadata.inode_and_device.size(), 2U);
+  EXPECT_THAT(metadata.inode_and_device,
+              Contains(Pair(98u, example_32_bit_userspace_dev)));
+  EXPECT_THAT(metadata.inode_and_device,
+              Contains(Pair(99u, example_64_bit_userspace_dev)));
+}
+
+TEST(CpuReaderTest, TranslateBlockDeviceIDToUserspace) {
+  using FakeEventProvider =
+      ProtoProvider<pbzero::FakeFtraceEvent, FakeFtraceEvent>;
+
+  uint16_t ftrace_event_id = 102;
+
+  std::vector<Field> common_fields;
+  {
+    common_fields.emplace_back(Field{});
+    Field* field = &common_fields.back();
+    field->ftrace_offset = 0;
+    field->ftrace_size = 4;
+    field->ftrace_type = kFtraceUint32;
+    field->proto_field_id = 1;
+    field->proto_field_type = kProtoUint32;
+    SetTranslationStrategy(field->ftrace_type, field->proto_field_type,
+                           &field->strategy);
+  }
+
+  std::vector<Event> events;
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "";
+    event->group = "";
+    event->proto_field_id = 42;
+    event->ftrace_event_id = ftrace_event_id;
+    {
+      // dev32 -> uint64
+      event->fields.emplace_back(Field{});
+      Field* field = &event->fields.back();
+      field->ftrace_offset = 8;
+      field->ftrace_size = 4;
+      field->ftrace_type = kFtraceDevId32;
+      field->proto_field_id = 1;
+      field->proto_field_type = kProtoUint64;
+      SetTranslationStrategy(field->ftrace_type, field->proto_field_type,
+                             &field->strategy);
+    }
+    {
+      // dev64 -> uint64
+      event->fields.emplace_back(Field{});
+      Field* field = &event->fields.back();
+      field->ftrace_offset = 12;
+      field->ftrace_size = 8;
+      field->ftrace_type = kFtraceDevId64;
+      field->proto_field_id = 6;
+      field->proto_field_type = kProtoUint64;
+      SetTranslationStrategy(field->ftrace_type, field->proto_field_type,
+                             &field->strategy);
+    }
+  }
+  ProtoTranslationTable table(events, std::move(common_fields));
+
+  FakeEventProvider provider(base::kPageSize);
+
+  BinaryWriter writer;
+
+  const uint32_t example_32_bit_kdev = 271581216;
+  const uint64_t example_32_bit_userspace_dev = 66336;
+  // Test downcasting
+  const uint64_t example_64_bit_kdev = 4442450946;
+  const uint64_t example_64_bit_userspace_dev = 17594983681026;
+
+  writer.Write<int32_t>(1001);                 // Common field.
+  writer.Write<int32_t>(9999);                 // A gap we shouldn't read.
+  writer.Write<int32_t>(example_32_bit_kdev);  // Dev id 32
+  writer.Write<int64_t>(example_64_bit_kdev);  // Dev id 64
+
+  auto input = writer.GetCopy();
+  auto length = writer.written();
+  FtraceMetadata metadata{};
+
+  ASSERT_TRUE(CpuReader::ParseEvent(ftrace_event_id, input.get(),
+                                    input.get() + length, &table,
+                                    provider.writer(), &metadata));
+
+  auto event = provider.ParseProto();
+  ASSERT_TRUE(event);
+  EXPECT_EQ(event->common_field(), 1001ul);
+  EXPECT_EQ(event->event_case(), FakeFtraceEvent::kAllFields);
+  EXPECT_EQ(event->all_fields().field_dev_32(), example_32_bit_userspace_dev);
+  EXPECT_EQ(event->all_fields().field_dev_64(), example_64_bit_userspace_dev);
+  EXPECT_THAT(metadata.last_seen_device_id, example_64_bit_userspace_dev);
+
+  EXPECT_THAT(CpuReader::TranslateBlockDeviceIDToUserspace<uint32_t>(
+                  example_32_bit_kdev),
+              example_32_bit_userspace_dev);
+  EXPECT_THAT(CpuReader::TranslateBlockDeviceIDToUserspace<uint64_t>(
+                  example_64_bit_kdev),
+              example_64_bit_userspace_dev);
 }
 
 // clang-format off
diff --git a/src/ftrace_reader/event_info.cc b/src/ftrace_reader/event_info.cc
index 586e8fe..197c7bf 100644
--- a/src/ftrace_reader/event_info.cc
+++ b/src/ftrace_reader/event_info.cc
@@ -79,7 +79,7 @@
     event->name = "block_bio_backmerge";
     event->group = "block";
     event->proto_field_id = 115;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("sector", 2, kProtoUint64));
     event->fields.push_back(MakeField("nr_sector", 3, kProtoUint32));
     event->fields.push_back(MakeField("rwbs", 4, kProtoString));
@@ -92,7 +92,7 @@
     event->name = "block_bio_bounce";
     event->group = "block";
     event->proto_field_id = 116;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("sector", 2, kProtoUint64));
     event->fields.push_back(MakeField("nr_sector", 3, kProtoUint32));
     event->fields.push_back(MakeField("rwbs", 4, kProtoString));
@@ -105,7 +105,7 @@
     event->name = "block_bio_complete";
     event->group = "block";
     event->proto_field_id = 117;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("sector", 2, kProtoUint64));
     event->fields.push_back(MakeField("nr_sector", 3, kProtoUint32));
     event->fields.push_back(MakeField("error", 4, kProtoInt32));
@@ -118,7 +118,7 @@
     event->name = "block_bio_frontmerge";
     event->group = "block";
     event->proto_field_id = 118;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("sector", 2, kProtoUint64));
     event->fields.push_back(MakeField("nr_sector", 3, kProtoUint32));
     event->fields.push_back(MakeField("rwbs", 4, kProtoString));
@@ -131,7 +131,7 @@
     event->name = "block_bio_queue";
     event->group = "block";
     event->proto_field_id = 119;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("sector", 2, kProtoUint64));
     event->fields.push_back(MakeField("nr_sector", 3, kProtoUint32));
     event->fields.push_back(MakeField("rwbs", 4, kProtoString));
@@ -144,10 +144,10 @@
     event->name = "block_bio_remap";
     event->group = "block";
     event->proto_field_id = 120;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("sector", 2, kProtoUint64));
     event->fields.push_back(MakeField("nr_sector", 3, kProtoUint32));
-    event->fields.push_back(MakeField("old_dev", 4, kProtoUint32));
+    event->fields.push_back(MakeField("old_dev", 4, kProtoUint64));
     event->fields.push_back(MakeField("old_sector", 5, kProtoUint64));
     event->fields.push_back(MakeField("rwbs", 6, kProtoString));
   }
@@ -158,7 +158,7 @@
     event->name = "block_dirty_buffer";
     event->group = "block";
     event->proto_field_id = 121;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("sector", 2, kProtoUint64));
     event->fields.push_back(MakeField("size", 3, kProtoUint64));
   }
@@ -169,7 +169,7 @@
     event->name = "block_getrq";
     event->group = "block";
     event->proto_field_id = 122;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("sector", 2, kProtoUint64));
     event->fields.push_back(MakeField("nr_sector", 3, kProtoUint32));
     event->fields.push_back(MakeField("rwbs", 4, kProtoString));
@@ -191,7 +191,7 @@
     event->name = "block_rq_abort";
     event->group = "block";
     event->proto_field_id = 124;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("sector", 2, kProtoUint64));
     event->fields.push_back(MakeField("nr_sector", 3, kProtoUint32));
     event->fields.push_back(MakeField("errors", 4, kProtoInt32));
@@ -205,7 +205,7 @@
     event->name = "block_rq_complete";
     event->group = "block";
     event->proto_field_id = 125;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("sector", 2, kProtoUint64));
     event->fields.push_back(MakeField("nr_sector", 3, kProtoUint32));
     event->fields.push_back(MakeField("errors", 4, kProtoInt32));
@@ -219,7 +219,7 @@
     event->name = "block_rq_insert";
     event->group = "block";
     event->proto_field_id = 126;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("sector", 2, kProtoUint64));
     event->fields.push_back(MakeField("nr_sector", 3, kProtoUint32));
     event->fields.push_back(MakeField("bytes", 4, kProtoUint32));
@@ -234,7 +234,7 @@
     event->name = "block_rq_issue";
     event->group = "block";
     event->proto_field_id = 45;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("sector", 2, kProtoUint64));
     event->fields.push_back(MakeField("nr_sector", 3, kProtoUint32));
     event->fields.push_back(MakeField("bytes", 4, kProtoUint32));
@@ -249,10 +249,10 @@
     event->name = "block_rq_remap";
     event->group = "block";
     event->proto_field_id = 128;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("sector", 2, kProtoUint64));
     event->fields.push_back(MakeField("nr_sector", 3, kProtoUint32));
-    event->fields.push_back(MakeField("old_dev", 4, kProtoUint32));
+    event->fields.push_back(MakeField("old_dev", 4, kProtoUint64));
     event->fields.push_back(MakeField("old_sector", 5, kProtoUint64));
     event->fields.push_back(MakeField("nr_bios", 6, kProtoUint32));
     event->fields.push_back(MakeField("rwbs", 7, kProtoString));
@@ -264,7 +264,7 @@
     event->name = "block_rq_requeue";
     event->group = "block";
     event->proto_field_id = 129;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("sector", 2, kProtoUint64));
     event->fields.push_back(MakeField("nr_sector", 3, kProtoUint32));
     event->fields.push_back(MakeField("errors", 4, kProtoInt32));
@@ -278,7 +278,7 @@
     event->name = "block_sleeprq";
     event->group = "block";
     event->proto_field_id = 130;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("sector", 2, kProtoUint64));
     event->fields.push_back(MakeField("nr_sector", 3, kProtoUint32));
     event->fields.push_back(MakeField("rwbs", 4, kProtoString));
@@ -291,7 +291,7 @@
     event->name = "block_split";
     event->group = "block";
     event->proto_field_id = 131;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("sector", 2, kProtoUint64));
     event->fields.push_back(MakeField("new_sector", 3, kProtoUint64));
     event->fields.push_back(MakeField("rwbs", 4, kProtoString));
@@ -304,7 +304,7 @@
     event->name = "block_touch_buffer";
     event->group = "block";
     event->proto_field_id = 132;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("sector", 2, kProtoUint64));
     event->fields.push_back(MakeField("size", 3, kProtoUint64));
   }
@@ -665,7 +665,7 @@
     event->name = "ext4_alloc_da_blocks";
     event->group = "ext4";
     event->proto_field_id = 134;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("data_blocks", 3, kProtoUint32));
     event->fields.push_back(MakeField("meta_blocks", 4, kProtoUint32));
@@ -677,7 +677,7 @@
     event->name = "ext4_allocate_blocks";
     event->group = "ext4";
     event->proto_field_id = 135;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("block", 3, kProtoUint64));
     event->fields.push_back(MakeField("len", 4, kProtoUint32));
@@ -696,7 +696,7 @@
     event->name = "ext4_allocate_inode";
     event->group = "ext4";
     event->proto_field_id = 136;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("dir", 3, kProtoUint64));
     event->fields.push_back(MakeField("mode", 4, kProtoUint32));
@@ -708,7 +708,7 @@
     event->name = "ext4_begin_ordered_truncate";
     event->group = "ext4";
     event->proto_field_id = 137;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("new_size", 3, kProtoInt64));
   }
@@ -719,7 +719,7 @@
     event->name = "ext4_collapse_range";
     event->group = "ext4";
     event->proto_field_id = 138;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("offset", 3, kProtoInt64));
     event->fields.push_back(MakeField("len", 4, kProtoInt64));
@@ -731,7 +731,7 @@
     event->name = "ext4_da_release_space";
     event->group = "ext4";
     event->proto_field_id = 139;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("i_blocks", 3, kProtoUint64));
     event->fields.push_back(MakeField("freed_blocks", 4, kProtoInt32));
@@ -747,7 +747,7 @@
     event->name = "ext4_da_reserve_space";
     event->group = "ext4";
     event->proto_field_id = 140;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("i_blocks", 3, kProtoUint64));
     event->fields.push_back(MakeField("reserved_data_blocks", 4, kProtoInt32));
@@ -761,7 +761,7 @@
     event->name = "ext4_da_update_reserve_space";
     event->group = "ext4";
     event->proto_field_id = 141;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("i_blocks", 3, kProtoUint64));
     event->fields.push_back(MakeField("used_blocks", 4, kProtoInt32));
@@ -778,7 +778,7 @@
     event->name = "ext4_da_write_begin";
     event->group = "ext4";
     event->proto_field_id = 41;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("pos", 3, kProtoInt64));
     event->fields.push_back(MakeField("len", 4, kProtoUint32));
@@ -791,7 +791,7 @@
     event->name = "ext4_da_write_end";
     event->group = "ext4";
     event->proto_field_id = 42;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("pos", 3, kProtoInt64));
     event->fields.push_back(MakeField("len", 4, kProtoUint32));
@@ -804,7 +804,7 @@
     event->name = "ext4_da_write_pages";
     event->group = "ext4";
     event->proto_field_id = 142;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("first_page", 3, kProtoUint64));
     event->fields.push_back(MakeField("nr_to_write", 4, kProtoInt64));
@@ -817,7 +817,7 @@
     event->name = "ext4_da_write_pages_extent";
     event->group = "ext4";
     event->proto_field_id = 143;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("lblk", 3, kProtoUint64));
     event->fields.push_back(MakeField("len", 4, kProtoUint32));
@@ -830,7 +830,7 @@
     event->name = "ext4_direct_IO_enter";
     event->group = "ext4";
     event->proto_field_id = 144;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("pos", 3, kProtoInt64));
     event->fields.push_back(MakeField("len", 4, kProtoUint64));
@@ -843,7 +843,7 @@
     event->name = "ext4_direct_IO_exit";
     event->group = "ext4";
     event->proto_field_id = 145;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("pos", 3, kProtoInt64));
     event->fields.push_back(MakeField("len", 4, kProtoUint64));
@@ -857,7 +857,7 @@
     event->name = "ext4_discard_blocks";
     event->group = "ext4";
     event->proto_field_id = 146;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("blk", 2, kProtoUint64));
     event->fields.push_back(MakeField("count", 3, kProtoUint64));
   }
@@ -868,7 +868,7 @@
     event->name = "ext4_discard_preallocations";
     event->group = "ext4";
     event->proto_field_id = 147;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
   }
 
@@ -878,7 +878,7 @@
     event->name = "ext4_drop_inode";
     event->group = "ext4";
     event->proto_field_id = 148;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("drop", 3, kProtoInt32));
   }
@@ -889,7 +889,7 @@
     event->name = "ext4_es_cache_extent";
     event->group = "ext4";
     event->proto_field_id = 149;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("lblk", 3, kProtoUint32));
     event->fields.push_back(MakeField("len", 4, kProtoUint32));
@@ -903,7 +903,7 @@
     event->name = "ext4_es_find_delayed_extent_range_enter";
     event->group = "ext4";
     event->proto_field_id = 150;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("lblk", 3, kProtoUint32));
   }
@@ -914,7 +914,7 @@
     event->name = "ext4_es_find_delayed_extent_range_exit";
     event->group = "ext4";
     event->proto_field_id = 151;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("lblk", 3, kProtoUint32));
     event->fields.push_back(MakeField("len", 4, kProtoUint32));
@@ -928,7 +928,7 @@
     event->name = "ext4_es_insert_extent";
     event->group = "ext4";
     event->proto_field_id = 152;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("lblk", 3, kProtoUint32));
     event->fields.push_back(MakeField("len", 4, kProtoUint32));
@@ -942,7 +942,7 @@
     event->name = "ext4_es_lookup_extent_enter";
     event->group = "ext4";
     event->proto_field_id = 153;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("lblk", 3, kProtoUint32));
   }
@@ -953,7 +953,7 @@
     event->name = "ext4_es_lookup_extent_exit";
     event->group = "ext4";
     event->proto_field_id = 154;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("lblk", 3, kProtoUint32));
     event->fields.push_back(MakeField("len", 4, kProtoUint32));
@@ -968,7 +968,7 @@
     event->name = "ext4_es_remove_extent";
     event->group = "ext4";
     event->proto_field_id = 155;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("lblk", 3, kProtoInt64));
     event->fields.push_back(MakeField("len", 4, kProtoInt64));
@@ -980,7 +980,7 @@
     event->name = "ext4_es_shrink";
     event->group = "ext4";
     event->proto_field_id = 156;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("nr_shrunk", 2, kProtoInt32));
     event->fields.push_back(MakeField("scan_time", 3, kProtoUint64));
     event->fields.push_back(MakeField("nr_skipped", 4, kProtoInt32));
@@ -993,7 +993,7 @@
     event->name = "ext4_es_shrink_count";
     event->group = "ext4";
     event->proto_field_id = 157;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("nr_to_scan", 2, kProtoInt32));
     event->fields.push_back(MakeField("cache_cnt", 3, kProtoInt32));
   }
@@ -1004,7 +1004,7 @@
     event->name = "ext4_es_shrink_scan_enter";
     event->group = "ext4";
     event->proto_field_id = 158;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("nr_to_scan", 2, kProtoInt32));
     event->fields.push_back(MakeField("cache_cnt", 3, kProtoInt32));
   }
@@ -1015,7 +1015,7 @@
     event->name = "ext4_es_shrink_scan_exit";
     event->group = "ext4";
     event->proto_field_id = 159;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("nr_shrunk", 2, kProtoInt32));
     event->fields.push_back(MakeField("cache_cnt", 3, kProtoInt32));
   }
@@ -1026,7 +1026,7 @@
     event->name = "ext4_evict_inode";
     event->group = "ext4";
     event->proto_field_id = 160;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("nlink", 3, kProtoInt32));
   }
@@ -1037,7 +1037,7 @@
     event->name = "ext4_ext_convert_to_initialized_enter";
     event->group = "ext4";
     event->proto_field_id = 161;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("m_lblk", 3, kProtoUint32));
     event->fields.push_back(MakeField("m_len", 4, kProtoUint32));
@@ -1052,7 +1052,7 @@
     event->name = "ext4_ext_convert_to_initialized_fastpath";
     event->group = "ext4";
     event->proto_field_id = 162;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("m_lblk", 3, kProtoUint32));
     event->fields.push_back(MakeField("m_len", 4, kProtoUint32));
@@ -1070,7 +1070,7 @@
     event->name = "ext4_ext_handle_unwritten_extents";
     event->group = "ext4";
     event->proto_field_id = 163;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("flags", 3, kProtoInt32));
     event->fields.push_back(MakeField("lblk", 4, kProtoUint32));
@@ -1086,7 +1086,7 @@
     event->name = "ext4_ext_in_cache";
     event->group = "ext4";
     event->proto_field_id = 164;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("lblk", 3, kProtoUint32));
     event->fields.push_back(MakeField("ret", 4, kProtoInt32));
@@ -1098,7 +1098,7 @@
     event->name = "ext4_ext_load_extent";
     event->group = "ext4";
     event->proto_field_id = 165;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("pblk", 3, kProtoUint64));
     event->fields.push_back(MakeField("lblk", 4, kProtoUint32));
@@ -1110,7 +1110,7 @@
     event->name = "ext4_ext_map_blocks_enter";
     event->group = "ext4";
     event->proto_field_id = 166;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("lblk", 3, kProtoUint32));
     event->fields.push_back(MakeField("len", 4, kProtoUint32));
@@ -1123,7 +1123,7 @@
     event->name = "ext4_ext_map_blocks_exit";
     event->group = "ext4";
     event->proto_field_id = 167;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("flags", 3, kProtoUint32));
     event->fields.push_back(MakeField("pblk", 4, kProtoUint64));
@@ -1139,7 +1139,7 @@
     event->name = "ext4_ext_put_in_cache";
     event->group = "ext4";
     event->proto_field_id = 168;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("lblk", 3, kProtoUint32));
     event->fields.push_back(MakeField("len", 4, kProtoUint32));
@@ -1152,7 +1152,7 @@
     event->name = "ext4_ext_remove_space";
     event->group = "ext4";
     event->proto_field_id = 169;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("start", 3, kProtoUint32));
     event->fields.push_back(MakeField("end", 4, kProtoUint32));
@@ -1165,7 +1165,7 @@
     event->name = "ext4_ext_remove_space_done";
     event->group = "ext4";
     event->proto_field_id = 170;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("start", 3, kProtoUint32));
     event->fields.push_back(MakeField("end", 4, kProtoUint32));
@@ -1180,7 +1180,7 @@
     event->name = "ext4_ext_rm_idx";
     event->group = "ext4";
     event->proto_field_id = 171;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("pblk", 3, kProtoUint64));
   }
@@ -1191,7 +1191,7 @@
     event->name = "ext4_ext_rm_leaf";
     event->group = "ext4";
     event->proto_field_id = 172;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("partial", 3, kProtoInt64));
     event->fields.push_back(MakeField("start", 4, kProtoUint32));
@@ -1206,7 +1206,7 @@
     event->name = "ext4_ext_show_extent";
     event->group = "ext4";
     event->proto_field_id = 173;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("pblk", 3, kProtoUint64));
     event->fields.push_back(MakeField("lblk", 4, kProtoUint32));
@@ -1219,7 +1219,7 @@
     event->name = "ext4_fallocate_enter";
     event->group = "ext4";
     event->proto_field_id = 174;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("offset", 3, kProtoInt64));
     event->fields.push_back(MakeField("len", 4, kProtoInt64));
@@ -1232,7 +1232,7 @@
     event->name = "ext4_fallocate_exit";
     event->group = "ext4";
     event->proto_field_id = 175;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("pos", 3, kProtoInt64));
     event->fields.push_back(MakeField("blocks", 4, kProtoUint32));
@@ -1245,7 +1245,7 @@
     event->name = "ext4_find_delalloc_range";
     event->group = "ext4";
     event->proto_field_id = 176;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("from", 3, kProtoUint32));
     event->fields.push_back(MakeField("to", 4, kProtoUint32));
@@ -1260,7 +1260,7 @@
     event->name = "ext4_forget";
     event->group = "ext4";
     event->proto_field_id = 177;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("block", 3, kProtoUint64));
     event->fields.push_back(MakeField("is_metadata", 4, kProtoInt32));
@@ -1273,7 +1273,7 @@
     event->name = "ext4_free_blocks";
     event->group = "ext4";
     event->proto_field_id = 178;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("block", 3, kProtoUint64));
     event->fields.push_back(MakeField("count", 4, kProtoUint64));
@@ -1287,7 +1287,7 @@
     event->name = "ext4_free_inode";
     event->group = "ext4";
     event->proto_field_id = 179;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("uid", 3, kProtoUint32));
     event->fields.push_back(MakeField("gid", 4, kProtoUint32));
@@ -1301,7 +1301,7 @@
     event->name = "ext4_get_implied_cluster_alloc_exit";
     event->group = "ext4";
     event->proto_field_id = 180;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("flags", 2, kProtoUint32));
     event->fields.push_back(MakeField("lblk", 3, kProtoUint32));
     event->fields.push_back(MakeField("pblk", 4, kProtoUint64));
@@ -1315,7 +1315,7 @@
     event->name = "ext4_get_reserved_cluster_alloc";
     event->group = "ext4";
     event->proto_field_id = 181;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("lblk", 3, kProtoUint32));
     event->fields.push_back(MakeField("len", 4, kProtoUint32));
@@ -1327,7 +1327,7 @@
     event->name = "ext4_ind_map_blocks_enter";
     event->group = "ext4";
     event->proto_field_id = 182;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("lblk", 3, kProtoUint32));
     event->fields.push_back(MakeField("len", 4, kProtoUint32));
@@ -1340,7 +1340,7 @@
     event->name = "ext4_ind_map_blocks_exit";
     event->group = "ext4";
     event->proto_field_id = 183;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("flags", 3, kProtoUint32));
     event->fields.push_back(MakeField("pblk", 4, kProtoUint64));
@@ -1356,7 +1356,7 @@
     event->name = "ext4_insert_range";
     event->group = "ext4";
     event->proto_field_id = 184;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("offset", 3, kProtoInt64));
     event->fields.push_back(MakeField("len", 4, kProtoInt64));
@@ -1368,7 +1368,7 @@
     event->name = "ext4_invalidatepage";
     event->group = "ext4";
     event->proto_field_id = 185;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("index", 3, kProtoUint64));
     event->fields.push_back(MakeField("offset", 4, kProtoUint32));
@@ -1381,7 +1381,7 @@
     event->name = "ext4_journal_start";
     event->group = "ext4";
     event->proto_field_id = 186;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ip", 2, kProtoUint64));
     event->fields.push_back(MakeField("blocks", 3, kProtoInt32));
     event->fields.push_back(MakeField("rsv_blocks", 4, kProtoInt32));
@@ -1393,7 +1393,7 @@
     event->name = "ext4_journal_start_reserved";
     event->group = "ext4";
     event->proto_field_id = 187;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ip", 2, kProtoUint64));
     event->fields.push_back(MakeField("blocks", 3, kProtoInt32));
   }
@@ -1404,7 +1404,7 @@
     event->name = "ext4_journalled_invalidatepage";
     event->group = "ext4";
     event->proto_field_id = 188;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("index", 3, kProtoUint64));
     event->fields.push_back(MakeField("offset", 4, kProtoUint32));
@@ -1417,7 +1417,7 @@
     event->name = "ext4_journalled_write_end";
     event->group = "ext4";
     event->proto_field_id = 189;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("pos", 3, kProtoInt64));
     event->fields.push_back(MakeField("len", 4, kProtoUint32));
@@ -1430,7 +1430,7 @@
     event->name = "ext4_load_inode";
     event->group = "ext4";
     event->proto_field_id = 190;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
   }
 
@@ -1440,7 +1440,7 @@
     event->name = "ext4_load_inode_bitmap";
     event->group = "ext4";
     event->proto_field_id = 191;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("group", 2, kProtoUint32));
   }
 
@@ -1450,7 +1450,7 @@
     event->name = "ext4_mark_inode_dirty";
     event->group = "ext4";
     event->proto_field_id = 192;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("ip", 3, kProtoUint64));
   }
@@ -1461,7 +1461,7 @@
     event->name = "ext4_mb_bitmap_load";
     event->group = "ext4";
     event->proto_field_id = 193;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("group", 2, kProtoUint32));
   }
 
@@ -1471,7 +1471,7 @@
     event->name = "ext4_mb_buddy_bitmap_load";
     event->group = "ext4";
     event->proto_field_id = 194;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("group", 2, kProtoUint32));
   }
 
@@ -1481,7 +1481,7 @@
     event->name = "ext4_mb_discard_preallocations";
     event->group = "ext4";
     event->proto_field_id = 195;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("needed", 2, kProtoInt32));
   }
 
@@ -1491,7 +1491,7 @@
     event->name = "ext4_mb_new_group_pa";
     event->group = "ext4";
     event->proto_field_id = 196;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("pa_pstart", 3, kProtoUint64));
     event->fields.push_back(MakeField("pa_lstart", 4, kProtoUint64));
@@ -1504,7 +1504,7 @@
     event->name = "ext4_mb_new_inode_pa";
     event->group = "ext4";
     event->proto_field_id = 197;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("pa_pstart", 3, kProtoUint64));
     event->fields.push_back(MakeField("pa_lstart", 4, kProtoUint64));
@@ -1517,7 +1517,7 @@
     event->name = "ext4_mb_release_group_pa";
     event->group = "ext4";
     event->proto_field_id = 198;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("pa_pstart", 2, kProtoUint64));
     event->fields.push_back(MakeField("pa_len", 3, kProtoUint32));
   }
@@ -1528,7 +1528,7 @@
     event->name = "ext4_mb_release_inode_pa";
     event->group = "ext4";
     event->proto_field_id = 199;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("block", 3, kProtoUint64));
     event->fields.push_back(MakeField("count", 4, kProtoUint32));
@@ -1540,7 +1540,7 @@
     event->name = "ext4_mballoc_alloc";
     event->group = "ext4";
     event->proto_field_id = 200;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("orig_logical", 3, kProtoUint32));
     event->fields.push_back(MakeField("orig_start", 4, kProtoInt32));
@@ -1568,7 +1568,7 @@
     event->name = "ext4_mballoc_discard";
     event->group = "ext4";
     event->proto_field_id = 201;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("result_start", 3, kProtoInt32));
     event->fields.push_back(MakeField("result_group", 4, kProtoUint32));
@@ -1581,7 +1581,7 @@
     event->name = "ext4_mballoc_free";
     event->group = "ext4";
     event->proto_field_id = 202;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("result_start", 3, kProtoInt32));
     event->fields.push_back(MakeField("result_group", 4, kProtoUint32));
@@ -1594,7 +1594,7 @@
     event->name = "ext4_mballoc_prealloc";
     event->group = "ext4";
     event->proto_field_id = 203;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("orig_logical", 3, kProtoUint32));
     event->fields.push_back(MakeField("orig_start", 4, kProtoInt32));
@@ -1612,7 +1612,7 @@
     event->name = "ext4_other_inode_update_time";
     event->group = "ext4";
     event->proto_field_id = 204;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("orig_ino", 3, kProtoUint64));
     event->fields.push_back(MakeField("uid", 4, kProtoUint32));
@@ -1626,7 +1626,7 @@
     event->name = "ext4_punch_hole";
     event->group = "ext4";
     event->proto_field_id = 205;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("offset", 3, kProtoInt64));
     event->fields.push_back(MakeField("len", 4, kProtoInt64));
@@ -1639,7 +1639,7 @@
     event->name = "ext4_read_block_bitmap_load";
     event->group = "ext4";
     event->proto_field_id = 206;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("group", 2, kProtoUint32));
   }
 
@@ -1649,7 +1649,7 @@
     event->name = "ext4_readpage";
     event->group = "ext4";
     event->proto_field_id = 207;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("index", 3, kProtoUint64));
   }
@@ -1660,7 +1660,7 @@
     event->name = "ext4_releasepage";
     event->group = "ext4";
     event->proto_field_id = 208;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("index", 3, kProtoUint64));
   }
@@ -1671,7 +1671,7 @@
     event->name = "ext4_remove_blocks";
     event->group = "ext4";
     event->proto_field_id = 209;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("from", 3, kProtoUint32));
     event->fields.push_back(MakeField("to", 4, kProtoUint32));
@@ -1687,7 +1687,7 @@
     event->name = "ext4_request_blocks";
     event->group = "ext4";
     event->proto_field_id = 210;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("len", 3, kProtoUint32));
     event->fields.push_back(MakeField("logical", 4, kProtoUint32));
@@ -1705,7 +1705,7 @@
     event->name = "ext4_request_inode";
     event->group = "ext4";
     event->proto_field_id = 211;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("dir", 2, kProtoUint64));
     event->fields.push_back(MakeField("mode", 3, kProtoUint32));
   }
@@ -1716,7 +1716,7 @@
     event->name = "ext4_sync_file_enter";
     event->group = "ext4";
     event->proto_field_id = 43;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("parent", 3, kProtoUint64));
     event->fields.push_back(MakeField("datasync", 4, kProtoInt32));
@@ -1728,7 +1728,7 @@
     event->name = "ext4_sync_file_exit";
     event->group = "ext4";
     event->proto_field_id = 44;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("ret", 3, kProtoInt32));
   }
@@ -1739,7 +1739,7 @@
     event->name = "ext4_sync_fs";
     event->group = "ext4";
     event->proto_field_id = 212;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("wait", 2, kProtoInt32));
   }
 
@@ -1775,7 +1775,7 @@
     event->name = "ext4_truncate_enter";
     event->group = "ext4";
     event->proto_field_id = 215;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("blocks", 3, kProtoUint64));
   }
@@ -1786,7 +1786,7 @@
     event->name = "ext4_truncate_exit";
     event->group = "ext4";
     event->proto_field_id = 216;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("blocks", 3, kProtoUint64));
   }
@@ -1797,7 +1797,7 @@
     event->name = "ext4_unlink_enter";
     event->group = "ext4";
     event->proto_field_id = 217;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("parent", 3, kProtoUint64));
     event->fields.push_back(MakeField("size", 4, kProtoInt64));
@@ -1809,7 +1809,7 @@
     event->name = "ext4_unlink_exit";
     event->group = "ext4";
     event->proto_field_id = 218;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("ret", 3, kProtoInt32));
   }
@@ -1820,7 +1820,7 @@
     event->name = "ext4_write_begin";
     event->group = "ext4";
     event->proto_field_id = 219;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("pos", 3, kProtoInt64));
     event->fields.push_back(MakeField("len", 4, kProtoUint32));
@@ -1833,7 +1833,7 @@
     event->name = "ext4_write_end";
     event->group = "ext4";
     event->proto_field_id = 230;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("pos", 3, kProtoInt64));
     event->fields.push_back(MakeField("len", 4, kProtoUint32));
@@ -1846,7 +1846,7 @@
     event->name = "ext4_writepage";
     event->group = "ext4";
     event->proto_field_id = 231;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("index", 3, kProtoUint64));
   }
@@ -1857,7 +1857,7 @@
     event->name = "ext4_writepages";
     event->group = "ext4";
     event->proto_field_id = 232;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("nr_to_write", 3, kProtoInt64));
     event->fields.push_back(MakeField("pages_skipped", 4, kProtoInt64));
@@ -1875,7 +1875,7 @@
     event->name = "ext4_writepages_result";
     event->group = "ext4";
     event->proto_field_id = 233;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("ret", 3, kProtoInt32));
     event->fields.push_back(MakeField("pages_written", 4, kProtoInt32));
@@ -1890,7 +1890,7 @@
     event->name = "ext4_zero_range";
     event->group = "ext4";
     event->proto_field_id = 234;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint32));
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("offset", 3, kProtoInt64));
     event->fields.push_back(MakeField("len", 4, kProtoInt64));
@@ -1906,7 +1906,7 @@
     event->fields.push_back(MakeField("pfn", 1, kProtoUint64));
     event->fields.push_back(MakeField("i_ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("index", 3, kProtoUint64));
-    event->fields.push_back(MakeField("s_dev", 4, kProtoUint32));
+    event->fields.push_back(MakeField("s_dev", 4, kProtoUint64));
   }
 
   {
@@ -1918,7 +1918,7 @@
     event->fields.push_back(MakeField("pfn", 1, kProtoUint64));
     event->fields.push_back(MakeField("i_ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("index", 3, kProtoUint64));
-    event->fields.push_back(MakeField("s_dev", 4, kProtoUint32));
+    event->fields.push_back(MakeField("s_dev", 4, kProtoUint64));
   }
 
   {
diff --git a/src/ftrace_reader/event_info_constants.cc b/src/ftrace_reader/event_info_constants.cc
index 9de52e8..b5642ef 100644
--- a/src/ftrace_reader/event_info_constants.cc
+++ b/src/ftrace_reader/event_info_constants.cc
@@ -43,8 +43,10 @@
     *out = kInode64ToUint64;
   } else if (ftrace == kFtracePid32 && proto == kProtoInt32) {
     *out = kPid32ToInt32;
-  } else if (ftrace == kFtraceDevId32 && proto == kProtoUint32) {
-    *out = kDevId32ToUint32;
+  } else if (ftrace == kFtraceDevId32 && proto == kProtoUint64) {
+    *out = kDevId32ToUint64;
+  } else if (ftrace == kFtraceDevId64 && proto == kProtoUint64) {
+    *out = kDevId64ToUint64;
   } else if (ftrace == kFtraceUint8 && proto == kProtoUint32) {
     *out = kUint8ToUint32;
   } else if (ftrace == kFtraceUint16 && proto == kProtoUint32) {
diff --git a/src/ftrace_reader/event_info_constants.h b/src/ftrace_reader/event_info_constants.h
index 0d6ac64..e46ab89 100644
--- a/src/ftrace_reader/event_info_constants.h
+++ b/src/ftrace_reader/event_info_constants.h
@@ -61,6 +61,7 @@
   kFtraceInode64,
   kFtracePid32,
   kFtraceDevId32,
+  kFtraceDevId64,
 };
 
 // Joint enum of FtraceFieldType (left) and ProtoFieldType (right).
@@ -84,7 +85,8 @@
   kInode32ToUint64,
   kInode64ToUint64,
   kPid32ToInt32,
-  kDevId32ToUint32,
+  kDevId32ToUint64,
+  kDevId64ToUint64,
 };
 
 inline const char* ToString(ProtoFieldType v) {
@@ -159,6 +161,8 @@
       return "pid32";
     case kFtraceDevId32:
       return "devid32";
+    case kFtraceDevId64:
+      return "devid64";
   }
   // For gcc:
   PERFETTO_CHECK(false);
diff --git a/src/ftrace_reader/event_info_unittest.cc b/src/ftrace_reader/event_info_unittest.cc
index cd5f0c6..773b7b1 100644
--- a/src/ftrace_reader/event_info_unittest.cc
+++ b/src/ftrace_reader/event_info_unittest.cc
@@ -75,8 +75,14 @@
   ASSERT_EQ(strategy, kCStringToString);
   ASSERT_TRUE(SetTranslationStrategy(kFtracePid32, kProtoInt32, &strategy));
   ASSERT_EQ(strategy, kPid32ToInt32);
-  ASSERT_TRUE(SetTranslationStrategy(kFtraceDevId32, kProtoUint32, &strategy));
-  ASSERT_EQ(strategy, kDevId32ToUint32);
+  ASSERT_TRUE(SetTranslationStrategy(kFtraceInode32, kProtoUint64, &strategy));
+  ASSERT_EQ(strategy, kInode32ToUint64);
+  ASSERT_TRUE(SetTranslationStrategy(kFtraceInode64, kProtoUint64, &strategy));
+  ASSERT_EQ(strategy, kInode64ToUint64);
+  ASSERT_TRUE(SetTranslationStrategy(kFtraceDevId32, kProtoUint64, &strategy));
+  ASSERT_EQ(strategy, kDevId32ToUint64);
+  ASSERT_TRUE(SetTranslationStrategy(kFtraceDevId64, kProtoUint64, &strategy));
+  ASSERT_EQ(strategy, kDevId64ToUint64);
 }
 
 }  // namespace
diff --git a/src/ftrace_reader/ftrace_controller.cc b/src/ftrace_reader/ftrace_controller.cc
index cf4c80b..b3259c4 100644
--- a/src/ftrace_reader/ftrace_controller.cc
+++ b/src/ftrace_reader/ftrace_controller.cc
@@ -20,6 +20,7 @@
 #include <stdint.h>
 #include <string.h>
 #include <sys/stat.h>
+#include <sys/sysmacros.h>
 #include <sys/types.h>
 #include <sys/wait.h>
 #include <unistd.h>
@@ -363,16 +364,16 @@
 
 FtraceMetadata::FtraceMetadata() {
   // A lot of the time there will only be a small number of inodes.
-  inodes.reserve(10);
+  inode_and_device.reserve(10);
   pids.reserve(10);
 }
 
-void FtraceMetadata::AddDevice(uint32_t device_id) {
+void FtraceMetadata::AddDevice(BlockDeviceID device_id) {
   last_seen_device_id = device_id;
 }
 
-void FtraceMetadata::AddInode(uint64_t inode_number) {
-  inodes.push_back(std::make_pair(inode_number, last_seen_device_id));
+void FtraceMetadata::AddInode(Inode inode_number) {
+  inode_and_device.push_back(std::make_pair(inode_number, last_seen_device_id));
 }
 
 void FtraceMetadata::AddPid(int32_t pid) {
@@ -384,7 +385,7 @@
 }
 
 void FtraceMetadata::Clear() {
-  inodes.clear();
+  inode_and_device.clear();
   pids.clear();
   overwrite_count = 0;
   last_seen_device_id = 0;
diff --git a/src/ftrace_reader/ftrace_controller_unittest.cc b/src/ftrace_reader/ftrace_controller_unittest.cc
index 272685f..23128f1 100644
--- a/src/ftrace_reader/ftrace_controller_unittest.cc
+++ b/src/ftrace_reader/ftrace_controller_unittest.cc
@@ -603,12 +603,12 @@
 
 TEST(FtraceMetadataTest, Clear) {
   FtraceMetadata metadata;
-  metadata.inodes.push_back(std::make_pair(1, 1));
+  metadata.inode_and_device.push_back(std::make_pair(1, 1));
   metadata.pids.push_back(2);
   metadata.overwrite_count = 3;
   metadata.last_seen_device_id = 100;
   metadata.Clear();
-  EXPECT_THAT(metadata.inodes, IsEmpty());
+  EXPECT_THAT(metadata.inode_and_device, IsEmpty());
   EXPECT_THAT(metadata.pids, IsEmpty());
   EXPECT_EQ(metadata.overwrite_count, 0u);
   EXPECT_EQ(metadata.last_seen_device_id, 0u);
@@ -630,7 +630,8 @@
   // Check same inode number is added
   metadata.AddDevice(5);
   metadata.AddInode(2);
-  EXPECT_THAT(metadata.inodes, ElementsAre(Pair(2, 3), Pair(1, 3), Pair(2, 5)));
+  EXPECT_THAT(metadata.inode_and_device,
+              ElementsAre(Pair(2, 3), Pair(1, 3), Pair(2, 5)));
 }
 
 TEST(FtraceMetadataTest, AddPid) {
diff --git a/src/ftrace_reader/proto_translation_table.cc b/src/ftrace_reader/proto_translation_table.cc
index 389f251..5cbe75c 100644
--- a/src/ftrace_reader/proto_translation_table.cc
+++ b/src/ftrace_reader/proto_translation_table.cc
@@ -200,6 +200,16 @@
     }
   }
 
+  if (StartsWith(type_and_name, "dev_t ")) {
+    if (size == 4) {
+      *out = kFtraceDevId32;
+      return true;
+    } else if (size == 8) {
+      *out = kFtraceDevId64;
+      return true;
+    }
+  }
+
   // Pids (as in 'sched_switch').
   if (StartsWith(type_and_name, "pid_t ") && size == 4) {
     *out = kFtracePid32;
diff --git a/src/ftrace_reader/proto_translation_table_unittest.cc b/src/ftrace_reader/proto_translation_table_unittest.cc
index 856f113..9e16395 100644
--- a/src/ftrace_reader/proto_translation_table_unittest.cc
+++ b/src/ftrace_reader/proto_translation_table_unittest.cc
@@ -274,6 +274,12 @@
   ASSERT_TRUE(InferFtraceType("ino_t foo", 8, false, &type));
   ASSERT_EQ(type, kFtraceInode64);
 
+  ASSERT_TRUE(InferFtraceType("dev_t foo", 4, false, &type));
+  ASSERT_EQ(type, kFtraceDevId32);
+
+  ASSERT_TRUE(InferFtraceType("dev_t foo", 8, false, &type));
+  ASSERT_EQ(type, kFtraceDevId64);
+
   ASSERT_TRUE(InferFtraceType("pid_t foo", 4, false, &type));
   ASSERT_EQ(type, kFtracePid32);
 
diff --git a/src/ftrace_reader/test/test_messages.proto b/src/ftrace_reader/test/test_messages.proto
index 5f731dd..76de416 100644
--- a/src/ftrace_reader/test/test_messages.proto
+++ b/src/ftrace_reader/test/test_messages.proto
@@ -23,10 +23,11 @@
 }
 
 message FakeAllFieldsFtraceEvent {
-  optional uint32 field_dev = 1;
+  optional uint64 field_dev_32 = 1;
   optional int32 field_pid = 2;
   optional uint32 field_uint32 = 5;
-  optional uint32 field_inode_32 = 3;
+  optional uint64 field_inode_32 = 3;
+  optional uint64 field_dev_64 = 6;
   optional uint64 field_inode_64 = 4;
   optional string field_char_16 = 500;
   optional string field_char = 501;
diff --git a/src/traced/probes/filesystem/fs_mount.h b/src/traced/probes/filesystem/fs_mount.h
index 8d4c49a..2086a80 100644
--- a/src/traced/probes/filesystem/fs_mount.h
+++ b/src/traced/probes/filesystem/fs_mount.h
@@ -21,12 +21,10 @@
 #include <map>
 #include <string>
 #include <vector>
+#include "perfetto/traced/data_source_types.h"
 
 namespace perfetto {
 
-// On ARM, st_dev is not dev_t but unsigned long long.
-using BlockDeviceID = decltype(stat::st_dev);
-
 constexpr char kMountsPath[] = "/proc/mounts";
 
 std::multimap<BlockDeviceID, std::string> ParseMounts(
diff --git a/src/traced/probes/filesystem/inode_file_data_source.cc b/src/traced/probes/filesystem/inode_file_data_source.cc
index 0bdf781..abc1fa0 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,17 +30,18 @@
 
 namespace perfetto {
 
-using BlockDeviceID = decltype(stat::st_dev);
-
-void CreateDeviceToInodeMap(
+void ScanFilesDFS(
     const std::string& root_directory,
-    std::map<BlockDeviceID, std::map<Inode, InodeMapValue>>* block_device_map) {
-  std::queue<std::string> queue;
-  queue.push(root_directory);
+    const std::function<void(BlockDeviceID block_device_id,
+                             Inode inode_number,
+                             const std::string& path,
+                             protos::pbzero::InodeFileMap_Entry_Type type)>&
+        fn) {
+  std::vector<std::string> queue{root_directory};
   while (!queue.empty()) {
     struct dirent* entry;
-    std::string filepath = queue.front();
-    queue.pop();
+    std::string filepath = queue.back();
+    queue.pop_back();
     DIR* dir = opendir(filepath.c_str());
     filepath += "/";
     if (dir == nullptr)
@@ -48,82 +50,121 @@
       std::string filename = entry->d_name;
       if (filename == "." || filename == "..")
         continue;
-      Inode inode_number = entry->d_ino;
+
       struct stat buf;
       if (lstat(filepath.c_str(), &buf) != 0)
         continue;
+
+      Inode inode_number = entry->d_ino;
       BlockDeviceID block_device_id = buf.st_dev;
-      std::map<Inode, InodeMapValue>& inode_map =
-          (*block_device_map)[block_device_id];
-      // Default
+
       protos::pbzero::InodeFileMap_Entry_Type type =
           protos::pbzero::InodeFileMap_Entry_Type_UNKNOWN;
       // Readdir and stat not guaranteed to have directory info for all systems
       if (entry->d_type == DT_DIR || S_ISDIR(buf.st_mode)) {
         // Continue iterating through files if current entry is a directory
-        queue.push(filepath + filename);
+        queue.push_back(filepath + filename);
         type = protos::pbzero::InodeFileMap_Entry_Type_DIRECTORY;
       } else if (entry->d_type == DT_REG || S_ISREG(buf.st_mode)) {
         type = protos::pbzero::InodeFileMap_Entry_Type_FILE;
       }
-      inode_map[inode_number].SetType(type);
-      inode_map[inode_number].AddPath(filepath + filename);
+
+      fn(block_device_id, inode_number, filepath + filename, type);
     }
     closedir(dir);
   }
 }
 
+void CreateDeviceToInodeMap(
+    const std::string& root_directory,
+    std::map<BlockDeviceID, std::map<Inode, InodeMapValue>>* block_device_map) {
+  ScanFilesDFS(
+      root_directory,
+      [&block_device_map](BlockDeviceID block_device_id, Inode inode_number,
+                          const std::string& path,
+                          protos::pbzero::InodeFileMap_Entry_Type type) {
+        std::map<Inode, InodeMapValue>& inode_map =
+            (*block_device_map)[block_device_id];
+        inode_map[inode_number].SetType(type);
+        inode_map[inode_number].AddPath(path);
+      });
+}
+
 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 +173,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
diff --git a/src/traced/probes/filesystem/inode_file_data_source.h b/src/traced/probes/filesystem/inode_file_data_source.h
index 889b936..8120200 100644
--- a/src/traced/probes/filesystem/inode_file_data_source.h
+++ b/src/traced/probes/filesystem/inode_file_data_source.h
@@ -25,6 +25,7 @@
 #include <string>
 
 #include "perfetto/base/weak_ptr.h"
+#include "perfetto/traced/data_source_types.h"
 #include "perfetto/tracing/core/basic_types.h"
 #include "perfetto/tracing/core/trace_writer.h"
 #include "src/traced/probes/filesystem/fs_mount.h"
@@ -33,7 +34,6 @@
 
 namespace perfetto {
 
-using Inode = uint64_t;
 using InodeFileMap = protos::pbzero::InodeFileMap;
 class TraceWriter;
 
@@ -52,6 +52,13 @@
   std::set<std::string> paths_;
 };
 
+void ScanFilesDFS(
+    const std::string& root_directory,
+    const std::function<void(BlockDeviceID block_device_id,
+                             Inode inode_number,
+                             const std::string& path,
+                             protos::pbzero::InodeFileMap_Entry_Type type)>&);
+
 void CreateDeviceToInodeMap(
     const std::string& root_directory,
     std::map<BlockDeviceID, std::map<Inode, InodeMapValue>>* block_device_map);
@@ -60,19 +67,25 @@
  public:
   InodeFileDataSource(TracingSessionID,
                       std::map<BlockDeviceID, std::map<Inode, InodeMapValue>>*
-                          file_system_inodes,
+                          system_partition_files,
                       std::unique_ptr<TraceWriter> writer);
 
   TracingSessionID session_id() const { return session_id_; }
   base::WeakPtr<InodeFileDataSource> GetWeakPtr() const;
 
-  void WriteInodes(const std::vector<std::pair<uint64_t, uint32_t>>&);
-  // TODO(hjd): Combine with above.
-  void OnInodes(const std::vector<std::pair<uint64_t, uint32_t>>& inodes);
+  void OnInodes(const std::vector<std::pair<Inode, BlockDeviceID>>& inodes);
+
+  bool AddInodeFileMapEntry(
+      InodeFileMap* inode_file_map,
+      BlockDeviceID block_device_id,
+      Inode inode,
+      const std::map<BlockDeviceID, std::map<Inode, InodeMapValue>>&
+          block_device_map);
 
  private:
   const TracingSessionID session_id_;
-  std::map<BlockDeviceID, std::map<Inode, InodeMapValue>>* file_system_inodes_;
+  std::map<BlockDeviceID, std::map<Inode, InodeMapValue>>*
+      system_partition_files_;
   std::multimap<BlockDeviceID, std::string> mount_points_;
   std::unique_ptr<TraceWriter> writer_;
   base::WeakPtrFactory<InodeFileDataSource> weak_factory_;  // Keep last.
diff --git a/src/traced/probes/probes_producer.cc b/src/traced/probes/probes_producer.cc
index 854abf1..83b52af 100644
--- a/src/traced/probes/probes_producer.cc
+++ b/src/traced/probes/probes_producer.cc
@@ -268,8 +268,8 @@
     const FtraceMetadata& metadata) {
   trace_packet_->Finalize();
 
-  if (file_source_ && !metadata.inodes.empty()) {
-    auto inodes = metadata.inodes;
+  if (file_source_ && !metadata.inode_and_device.empty()) {
+    auto inodes = metadata.inode_and_device;
     auto weak_file_source = file_source_;
     task_runner_->PostTask([weak_file_source, inodes] {
       if (weak_file_source)
diff --git a/test/cts/end_to_end_integrationtest_cts.cc b/test/cts/end_to_end_integrationtest_cts.cc
index 4ee3f56..787be39 100644
--- a/test/cts/end_to_end_integrationtest_cts.cc
+++ b/test/cts/end_to_end_integrationtest_cts.cc
@@ -14,14 +14,14 @@
  * limitations under the License.
  */
 
-#include <gtest/gtest.h>
+#include <random>
 
+#include "gtest/gtest.h"
 #include "perfetto/trace/test_event.pbzero.h"
 #include "perfetto/trace/trace_packet.pb.h"
 #include "perfetto/trace/trace_packet.pbzero.h"
 #include "perfetto/traced/traced.h"
 #include "perfetto/tracing/core/trace_packet.h"
-
 #include "test/fake_consumer.h"
 
 namespace perfetto {
@@ -30,7 +30,6 @@
  protected:
   void TestMockProducer(const std::string& producer_name) {
     base::TestTaskRunner task_runner;
-    auto finish = task_runner.CreateCheckpoint("no.more.packets");
 
     // Setup the trace config.
     TraceConfig trace_config;
@@ -41,26 +40,33 @@
     ds_config->set_name(producer_name);
     ds_config->set_target_buffer(0);
 
+    // The parameters for the producer.
+    static constexpr uint32_t kRandomSeed = 42;
+    static constexpr uint32_t kEventCount = 10;
+
+    // Setup the test to use a random number generator.
+    ds_config->mutable_for_testing()->set_seed(kRandomSeed);
+    ds_config->mutable_for_testing()->set_message_count(kEventCount);
+
+    // Create the random generator with the same seed.
+    std::minstd_rand0 rnd_engine(kRandomSeed);
+
     // Setip the function.
     uint64_t total = 0;
-    auto function = [&total, &finish](std::vector<TracePacket> packets,
-                                      bool has_more) {
-      if (has_more) {
-        for (auto& packet : packets) {
-          packet.Decode();
-          ASSERT_TRUE(packet->has_for_testing());
-          // ASSERT_EQ(protos::TracePacket::kTrustedUid,
-          //          packet->optional_trusted_uid_case());
-          ASSERT_EQ(packet->for_testing().str(), "test");
-        }
-        total += packets.size();
+    auto finish = task_runner.CreateCheckpoint("no.more.packets");
+    auto function = [&total, &finish, &rnd_engine](
+                        std::vector<TracePacket> packets, bool has_more) {
+      for (auto& packet : packets) {
+        ASSERT_TRUE(packet.Decode());
+        ASSERT_TRUE(packet->has_for_testing());
+        ASSERT_EQ(protos::TracePacket::kTrustedUid,
+                  packet->optional_trusted_uid_case());
+        ASSERT_EQ(packet->for_testing().seq_value(), rnd_engine());
+      }
+      total += packets.size();
 
-        // TODO(lalitm): renable this when stiching inside the service is
-        // present.
-        // ASSERT_FALSE(packets->empty());
-      } else {
-        ASSERT_EQ(total, 10u);
-        ASSERT_TRUE(packets.empty());
+      if (!has_more) {
+        ASSERT_EQ(total, kEventCount);
         finish();
       }
     };
@@ -73,7 +79,7 @@
     // and the consumer tries to retrieve it. For now wait a bit until the
     // service is done, but we should add explicit flushing to avoid this.
     task_runner.PostDelayedTask([&consumer]() { consumer.ReadTraceData(); },
-                                2500);
+                                5000);
 
     task_runner.RunUntilCheckpoint("no.more.packets", 10000);
   }
diff --git a/test/cts/producer/AndroidManifest.xml b/test/cts/producer/AndroidManifest.xml
index 6924a9a..6139dca 100755
--- a/test/cts/producer/AndroidManifest.xml
+++ b/test/cts/producer/AndroidManifest.xml
@@ -17,6 +17,8 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="android.perfetto.producer">
+    <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
+
     <application>
         <activity android:name=".ProducerActivity" >
             <intent-filter>
diff --git a/test/cts/producer/res/mipmap-hdpi/ic_launcher.png b/test/cts/producer/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..7e5732c
--- /dev/null
+++ b/test/cts/producer/res/mipmap-hdpi/ic_launcher.png
Binary files differ
diff --git a/test/cts/producer/res/mipmap-mdpi/ic_launcher.png b/test/cts/producer/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..8fc5d07
--- /dev/null
+++ b/test/cts/producer/res/mipmap-mdpi/ic_launcher.png
Binary files differ
diff --git a/test/cts/producer/res/mipmap-xhdpi/ic_launcher.png b/test/cts/producer/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..0bef6d9
--- /dev/null
+++ b/test/cts/producer/res/mipmap-xhdpi/ic_launcher.png
Binary files differ
diff --git a/test/cts/producer/res/mipmap-xxhdpi/ic_launcher.png b/test/cts/producer/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..7144af0
--- /dev/null
+++ b/test/cts/producer/res/mipmap-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/test/cts/producer/res/mipmap-xxxhdpi/ic_launcher.png b/test/cts/producer/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..2dbbdfc
--- /dev/null
+++ b/test/cts/producer/res/mipmap-xxxhdpi/ic_launcher.png
Binary files differ
diff --git a/test/cts/producer/src/android/perfetto/producer/ProducerActivity.java b/test/cts/producer/src/android/perfetto/producer/ProducerActivity.java
index 2dfa0ce..1eedfe3 100644
--- a/test/cts/producer/src/android/perfetto/producer/ProducerActivity.java
+++ b/test/cts/producer/src/android/perfetto/producer/ProducerActivity.java
@@ -17,48 +17,49 @@
 package android.perfetto.producer;
 
 import android.app.Activity;
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
 import android.os.Handler;
 
 public class ProducerActivity extends Activity {
-    private boolean paused = true;
-    private final Handler handler = new Handler();
 
     @Override
     public void onResume() {
         super.onResume();
 
-        paused = false;
-        handler.post(new Runnable() {
-            @Override
+        NotificationManager manager =
+                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
+
+        NotificationChannel serviceChannel =
+                new NotificationChannel("service", "service", NotificationManager.IMPORTANCE_LOW);
+        serviceChannel.setDescription("Perfetto service");
+        serviceChannel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
+        manager.createNotificationChannel(serviceChannel);
+
+        NotificationChannel isolatedChannel = new NotificationChannel(
+                "isolated_service", "isolated_service", NotificationManager.IMPORTANCE_LOW);
+        isolatedChannel.setDescription("Perfetto isolated service");
+        isolatedChannel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
+        manager.createNotificationChannel(isolatedChannel);
+
+        startForegroundService(new Intent(ProducerActivity.this, ProducerService.class));
+        startForegroundService(new Intent(ProducerActivity.this, ProducerIsolatedService.class));
+
+        System.loadLibrary("perfettocts_jni");
+        new Thread(new Runnable() {
             public void run() {
-                if (paused) {
-                    return;
+                try {
+                    setupProducer();
+                } catch (Exception ex) {
+                    ex.printStackTrace();
                 }
-
-                startService(new Intent(ProducerActivity.this, ProducerService.class));
-                startService(new Intent(ProducerActivity.this, ProducerIsolatedService.class));
-
-                System.loadLibrary("perfettocts_jni");
-                new Thread(new Runnable() {
-                    public void run() {
-                        try {
-                            setupProducer();
-                        } catch (Exception ex) {
-                            ex.printStackTrace();
-                        }
-                    }
-                })
-                        .start();
             }
-        });
-    }
-
-    @Override
-    public void onPause() {
-        super.onPause();
-        paused = true;
+        })
+                .start();
     }
 
     private static native void setupProducer();
diff --git a/test/cts/producer/src/android/perfetto/producer/ProducerIsolatedService.java b/test/cts/producer/src/android/perfetto/producer/ProducerIsolatedService.java
index cde5c32..9f26f54 100644
--- a/test/cts/producer/src/android/perfetto/producer/ProducerIsolatedService.java
+++ b/test/cts/producer/src/android/perfetto/producer/ProducerIsolatedService.java
@@ -16,13 +16,23 @@
 
 package android.perfetto.producer;
 
+import android.app.Notification;
 import android.app.Service;
 import android.os.IBinder;
 import android.content.Intent;
 
 public class ProducerIsolatedService extends Service {
+    private static final int NOTIFICATION_ID = 123;
+
     @Override
     public void onCreate() {
+        Notification.Builder builder = new Notification.Builder(this, "isolated_service");
+        builder.setContentTitle("Perfetto isolated service")
+                .setContentText("Perfetto isolated service")
+                .setSmallIcon(R.mipmap.ic_launcher);
+
+        startForeground(NOTIFICATION_ID, builder.build());
+
         System.loadLibrary("perfettocts_jni");
         new Thread(new Runnable() {
             @Override
diff --git a/test/cts/producer/src/android/perfetto/producer/ProducerService.java b/test/cts/producer/src/android/perfetto/producer/ProducerService.java
index f649ddc..a86267a 100644
--- a/test/cts/producer/src/android/perfetto/producer/ProducerService.java
+++ b/test/cts/producer/src/android/perfetto/producer/ProducerService.java
@@ -16,13 +16,22 @@
 
 package android.perfetto.producer;
 
+import android.app.Notification;
 import android.app.Service;
 import android.os.IBinder;
 import android.content.Intent;
 
 public class ProducerService extends Service {
+    private static final int NOTIFICATION_ID = 456;
+
     @Override
     public void onCreate() {
+        Notification.Builder builder = new Notification.Builder(this, "service");
+        builder.setContentTitle("Perfetto service")
+                .setContentText("Perfetto service")
+                .setSmallIcon(R.mipmap.ic_launcher);
+        startForeground(NOTIFICATION_ID, builder.build());
+
         System.loadLibrary("perfettocts_jni");
         new Thread(new Runnable() {
             @Override
diff --git a/tools/ftrace_proto_gen/ftrace_proto_gen.cc b/tools/ftrace_proto_gen/ftrace_proto_gen.cc
index 9f611f8..4a1df78 100644
--- a/tools/ftrace_proto_gen/ftrace_proto_gen.cc
+++ b/tools/ftrace_proto_gen/ftrace_proto_gen.cc
@@ -74,6 +74,14 @@
   if (StartsWith(field.type_and_name, "char ") && field.size == 0)
     return "string";
 
+  // ino_t, i_ino and dev_t are 32bit on some devices 64bit on others. For the
+  // protos we need to choose the largest possible size.
+  if (StartsWith(field.type_and_name, "ino_t ") ||
+      StartsWith(field.type_and_name, "i_ino ") ||
+      StartsWith(field.type_and_name, "dev_t ")) {
+    return "uint64";
+  }
+
   // Ints of various sizes:
   if (field.size <= 4 && field.is_signed)
     return "int32";
diff --git a/tools/ftrace_proto_gen/ftrace_proto_gen_unittest.cc b/tools/ftrace_proto_gen/ftrace_proto_gen_unittest.cc
index ec748ee..d48cc6f 100644
--- a/tools/ftrace_proto_gen/ftrace_proto_gen_unittest.cc
+++ b/tools/ftrace_proto_gen/ftrace_proto_gen_unittest.cc
@@ -35,9 +35,12 @@
   EXPECT_EQ(InferProtoType(Field{"unsigned int foo", 0, 4, false}), "uint32");
   EXPECT_EQ(InferProtoType(Field{"u32 control_freq", 44, 4, false}), "uint32");
 
-  EXPECT_EQ(InferProtoType(Field{"ino_t foo", 0, 4, false}), "uint32");
+  EXPECT_EQ(InferProtoType(Field{"ino_t foo", 0, 4, false}), "uint64");
   EXPECT_EQ(InferProtoType(Field{"ino_t foo", 0, 8, false}), "uint64");
 
+  EXPECT_EQ(InferProtoType(Field{"dev_t foo", 0, 4, false}), "uint64");
+  EXPECT_EQ(InferProtoType(Field{"dev_t foo", 0, 8, false}), "uint64");
+
   EXPECT_EQ(InferProtoType(Field{"char foo", 0, 0, false}), "string");
 }
 
diff --git a/tools/tmux b/tools/tmux
index 44267fe..b1810a9 100755
--- a/tools/tmux
+++ b/tools/tmux
@@ -16,7 +16,13 @@
 
 function is_monolithic {
   local out=$1
-  gn args $out --list --short | grep 'monolithic_binaries = true' > /dev/null
+  gn args $out --list --short | grep 'monolithic_binaries = true' 2>&1 >/dev/null
+  return $?
+}
+
+function is_android {
+  local out=$1
+  gn args $out --list --short | grep 'target_os = "android"' 2>&1 >/dev/null
   return $?
 }
 
@@ -25,16 +31,39 @@
 }
 
 function adb_supports_push_sync {
-  adb --help | grep 'push.*\[--sync\]'
+  adb --help | grep 'push.*\[--sync\]' 2>&1 >/dev/null
+}
+
+function traced_probes_cmd {
+  if is_android $OUT; then
+    echo "$PREFIX $DIR/traced_probes"
+  else
+    echo "sudo $PREFIX $DIR/traced_probes"
+  fi
 }
 
 function push {
-  local maybe_sync=''
-  if adb_supports_push_sync; then
-    maybe_sync='--sync '
+  if is_android $OUT; then
+    local maybe_sync=''
+    if adb_supports_push_sync; then
+      maybe_sync='--sync '
+    fi
+    echo adb push $maybe_sync $1 $DIR
+    adb push $maybe_sync $1 $DIR
+  else
+    echo cp $1 $DIR
+    cp $1 $DIR
   fi
-  echo adb push $maybe_sync $1 $2
-  adb push $maybe_sync $1 $2
+}
+
+function pull {
+  if is_android $OUT; then
+    echo adb pull $DIR/$1 $2
+    adb pull $DIR/$1 $2
+  else
+    echo cp $DIR/$1 $2
+    cp $DIR/$1 $2
+  fi
 }
 
 # If not set guess the OUT dir using the latest directory.
@@ -48,32 +77,34 @@
 # CONFIG=ftrace.cfg or to :test. Defaults to :test.
 CONFIG="${CONFIG:-:test}"
 
+if is_android $OUT ; then
+  DIR=/data/local/tmp
+else
+  DIR=$(mktemp -d)
+fi
+
 ninja -C $OUT traced traced_probes perfetto trace_to_text test/configs
 
-push $OUT/traced /data/local/tmp/
-push $OUT/traced_probes /data/local/tmp/
-push $OUT/perfetto /data/local/tmp/
+push $OUT/traced
+push $OUT/traced_probes
+push $OUT/perfetto
 reset_tracing
 
 PREFIX=""
-if ! is_monolithic $OUT;  then
-  PREFIX="LD_LIBRARY_PATH=/data/local/tmp"
-  set -x
-  adb push $OUT/libtraced_shared.so /data/local/tmp/
-  set +x
+if ! is_monolithic $OUT; then
+  PREFIX="LD_LIBRARY_PATH=$DIR"
+  push $OUT/libtraced_shared.so
 fi
 
 CONFIG_DEVICE_PATH=$CONFIG
 if [[ "$CONFIG" != ":test" ]]; then
-  CONFIG_DEVICE_PATH=/data/local/tmp/$CONFIG.protobuf
+  CONFIG_DEVICE_PATH=$DIR/$CONFIG.protobuf
   CONFIG_PATH=$OUT/$CONFIG.protobuf;
   if [[ ! -f $CONFIG_PATH ]]; then
     echo 'Config "'$CONFIG_PATH'" not known.'
     exit 1
   fi
-  set -x
-  adb push $CONFIG_PATH /data/local/tmp/
-  set +x
+  push $CONFIG_PATH
 fi
 
 if tmux has-session -t demo; then
@@ -97,26 +128,32 @@
 
 tmux select-pane -t 0
 tmux send-keys "clear" C-m
-tmux send-keys "adb shell" C-m
+if is_android $OUT; then
+  tmux send-keys "adb shell" C-m
+fi
 
 tmux select-pane -t 1
 tmux send-keys "clear" C-m
-tmux send-keys "adb shell" C-m
+if is_android $OUT; then
+  tmux send-keys "adb shell" C-m
+fi
 
 tmux select-pane -t 2
 tmux send-keys "clear" C-m
-tmux send-keys "adb shell" C-m
+if is_android $OUT; then
+  tmux send-keys "adb shell" C-m
+fi
 
 sleep 2
 
 tmux select-pane -t 1
-tmux send-keys "$PREFIX /data/local/tmp/traced" Enter
+tmux send-keys "$PREFIX $DIR/traced" Enter
 
 tmux select-pane -t 0
-tmux send-keys "$PREFIX /data/local/tmp/traced_probes" Enter
+tmux send-keys "$(traced_probes_cmd)" Enter
 
 tmux select-pane -t 2
-tmux send-keys "$PREFIX /data/local/tmp/perfetto -c $CONFIG_DEVICE_PATH -o /data/local/tmp/trace"
+tmux send-keys "$PREFIX $DIR/perfetto -c $CONFIG_DEVICE_PATH -o $DIR/trace"
 
 # Select consumer pane.
 tmux select-pane -t 2
@@ -125,6 +162,5 @@
 
 TRACE=$HOME/Downloads/trace.json
 echo -e "\n\x1b[32mPulling trace into $TRACE\x1b[0m"
-set -x
-adb pull /data/local/tmp/trace /tmp/trace.protobuf
+pull trace /tmp/trace.protobuf
 $OUT/trace_to_text systrace < /tmp/trace.protobuf > $TRACE
diff --git a/tools/trace_to_text/main.cc b/tools/trace_to_text/main.cc
index 8a63e07..ccc490b 100644
--- a/tools/trace_to_text/main.cc
+++ b/tools/trace_to_text/main.cc
@@ -17,6 +17,7 @@
 #include <inttypes.h>
 
 #include <stdio.h>
+#include <sys/sysmacros.h>
 #include <algorithm>
 #include <fstream>
 #include <iostream>
@@ -607,19 +608,16 @@
   char line[2048];
   sprintf(line,
           "ext4_sync_file_enter: dev %d,%d ino %lu parent %lu datasync %d \\n",
-          (unsigned int)(event.dev() >> 20),
-          (unsigned int)(event.dev() & ((1U << 20) - 1)),
-          (unsigned long)event.ino(), (unsigned long)event.parent(),
-          event.datasync());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          (unsigned long)event.parent(), event.datasync());
   return std::string(line);
 }
 
 std::string FormatExt4SyncFileExit(const Ext4SyncFileExitFtraceEvent& event) {
   char line[2048];
   sprintf(line, "ext4_sync_file_exit: dev %d,%d ino %lu ret %d\\n",
-          (unsigned int)(event.dev() >> 20),
-          (unsigned int)(event.dev() & ((1U << 20) - 1)),
-          (unsigned long)event.ino(), event.ret());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.ret());
   return std::string(line);
 }
 
@@ -627,9 +625,8 @@
   char line[2048];
   sprintf(line,
           "ext4_da_write_begin: dev %d,%d ino %lu pos %lld len %u flags %u\\n",
-          (unsigned int)(event.dev() >> 20),
-          (unsigned int)(event.dev() & ((1U << 20) - 1)),
-          (unsigned long)event.ino(), event.pos(), event.len(), event.flags());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.pos(), event.len(), event.flags());
   return std::string(line);
 }
 
@@ -637,17 +634,15 @@
   char line[2048];
   sprintf(line,
           "ext4_da_write_end: dev %d,%d ino %lu pos %lld len %u copied %u\\n",
-          (unsigned int)(event.dev() >> 20),
-          (unsigned int)(event.dev() & ((1U << 20) - 1)),
-          (unsigned long)event.ino(), event.pos(), event.len(), event.copied());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.pos(), event.len(), event.copied());
   return std::string(line);
 }
 
 std::string FormatBlockRqIssue(const BlockRqIssueFtraceEvent& event) {
   char line[2048];
   sprintf(line, "block_rq_issue: %d,%d %s %u (%s) %llu + %u [%s]\\n",
-          (unsigned int)(event.dev() >> 20),
-          (unsigned int)(event.dev() & ((1U << 20) - 1)), event.rwbs().c_str(),
+          major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
           event.bytes(), event.cmd().c_str(),
           (unsigned long long)event.sector(), event.nr_sector(),
           event.comm().c_str());
@@ -1116,8 +1111,7 @@
 std::string FormatBlockBioBackmerge(const BlockBioBackmergeFtraceEvent& event) {
   char line[2048];
   sprintf(line, "block_bio_backmerge: %d,%d %s %llu + %u [%s]\\n",
-          (unsigned int)(event.dev() >> 20),
-          (unsigned int)(event.dev() & ((1U << 20) - 1)), event.rwbs().c_str(),
+          major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
           (unsigned long long)event.sector(), event.nr_sector(),
           event.comm().c_str());
   return std::string(line);
@@ -1128,8 +1122,7 @@
   sprintf(line,
           "block_bio_bounce:"
           "%d,%d %s %llu + %u [%s]\\n",
-          (unsigned int)(event.dev() >> 20),
-          (unsigned int)(event.dev() & ((1U << 20) - 1)), event.rwbs().c_str(),
+          major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
           (unsigned long long)event.sector(), event.nr_sector(),
           event.comm().c_str());
   return std::string(line);
@@ -1138,8 +1131,7 @@
 std::string FormatBlockBioComplete(const BlockBioCompleteFtraceEvent& event) {
   char line[2048];
   sprintf(line, "block_bio_complete: %d,%d %s %llu + %u [%d]\\n",
-          (unsigned int)(event.dev() >> 20),
-          (unsigned int)(event.dev() & ((1U << 20) - 1)), event.rwbs().c_str(),
+          major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
           (unsigned long long)event.sector(), event.nr_sector(), event.error());
   return std::string(line);
 }
@@ -1148,8 +1140,7 @@
     const BlockBioFrontmergeFtraceEvent& event) {
   char line[2048];
   sprintf(line, "block_bio_frontmerge: %d,%d %s %llu + %u [%s]\\n",
-          (unsigned int)(event.dev() >> 20),
-          (unsigned int)(event.dev() & ((1U << 20) - 1)), event.rwbs().c_str(),
+          major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
           (unsigned long long)event.sector(), event.nr_sector(),
           event.comm().c_str());
   return std::string(line);
@@ -1158,8 +1149,7 @@
 std::string FormatBlockBioQueue(const BlockBioQueueFtraceEvent& event) {
   char line[2048];
   sprintf(line, "block_bio_queue: %d,%d %s %llu + %u [%s]\\n",
-          (unsigned int)(event.dev() >> 20),
-          (unsigned int)(event.dev() & ((1U << 20) - 1)), event.rwbs().c_str(),
+          major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
           (unsigned long long)event.sector(), event.nr_sector(),
           event.comm().c_str());
   return std::string(line);
@@ -1168,11 +1158,9 @@
 std::string FormatBlockBioRemap(const BlockBioRemapFtraceEvent& event) {
   char line[2048];
   sprintf(line, "block_bio_remap:  %d,%d %s %llu + %u <- (%d,%d) %llu\\n",
-          (unsigned int)(event.dev() >> 20),
-          (unsigned int)(event.dev() & ((1U << 20) - 1)), event.rwbs().c_str(),
+          major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
           (unsigned long long)event.sector(), event.nr_sector(),
-          (unsigned int)(event.old_dev() >> 20),
-          (unsigned int)(event.old_dev() & ((1U << 20) - 1)),
+          major(event.dev()), minor(event.dev()),
           (unsigned long long)event.old_sector());
   return std::string(line);
 }
@@ -1180,17 +1168,15 @@
 std::string FormatBlockDirtyBuffer(const BlockDirtyBufferFtraceEvent& event) {
   char line[2048];
   sprintf(line, "block_dirty_buffer: %d,%d sector=%llu size=%zu\\n",
-          (unsigned int)(event.dev() >> 20),
-          (unsigned int)(event.dev() & ((1U << 20) - 1)),
+          major(event.dev()), minor(event.dev()),
           (unsigned long long)event.sector(), (unsigned long)event.size());
   return std::string(line);
 }
 
 std::string FormatBlockGetrq(const BlockGetrqFtraceEvent& event) {
   char line[2048];
-  sprintf(line, "block_getrq: %d,%d %s %llu + %u [%s]\\n",
-          (unsigned int)(event.dev() >> 20),
-          (unsigned int)(event.dev() & ((1U << 20) - 1)), event.rwbs().c_str(),
+  sprintf(line, "block_getrq: %d,%d %s %llu + %u [%s]\\n", major(event.dev()),
+          minor(event.dev()), event.rwbs().c_str(),
           (unsigned long long)event.sector(), event.nr_sector(),
           event.comm().c_str());
   return std::string(line);
@@ -1205,8 +1191,7 @@
 std::string FormatBlockRqAbort(const BlockRqAbortFtraceEvent& event) {
   char line[2048];
   sprintf(line, "block_rq_abort: %d,%d %s (%s) %llu + %u [%d]\\n",
-          (unsigned int)(event.dev() >> 20),
-          (unsigned int)(event.dev() & ((1U << 20) - 1)), event.rwbs().c_str(),
+          major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
           event.cmd().c_str(), (unsigned long long)event.sector(),
           event.nr_sector(), event.errors());
   return std::string(line);
@@ -1215,8 +1200,7 @@
 std::string FormatBlockRqComplete(const BlockRqCompleteFtraceEvent& event) {
   char line[2048];
   sprintf(line, "block_rq_complete: %d,%d %s (%s) %llu + %u [%d]\\n",
-          (unsigned int)(event.dev() >> 20),
-          (unsigned int)(event.dev() & ((1U << 20) - 1)), event.rwbs().c_str(),
+          major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
           event.cmd().c_str(), (unsigned long long)event.sector(),
           event.nr_sector(), event.errors());
   return std::string(line);
@@ -1225,8 +1209,7 @@
 std::string FormatBlockRqInsert(const BlockRqInsertFtraceEvent& event) {
   char line[2048];
   sprintf(line, "block_rq_insert: %d,%d %s %u (%s) %llu + %u [%s]\\n",
-          (unsigned int)(event.dev() >> 20),
-          (unsigned int)(event.dev() & ((1U << 20) - 1)), event.rwbs().c_str(),
+          major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
           event.bytes(), event.cmd().c_str(),
           (unsigned long long)event.sector(), event.nr_sector(),
           event.comm().c_str());
@@ -1236,11 +1219,9 @@
 std::string FormatBlockRqRemap(const BlockRqRemapFtraceEvent& event) {
   char line[2048];
   sprintf(line, "block_rq_remap: %d,%d %s %llu + %u <- (%d,%d) %llu %u\\n",
-          (unsigned int)(event.dev() >> 20),
-          (unsigned int)(event.dev() & ((1U << 20) - 1)), event.rwbs().c_str(),
+          major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
           (unsigned long long)event.sector(), event.nr_sector(),
-          (unsigned int)(event.old_dev() >> 20),
-          (unsigned int)(event.old_dev() & ((1U << 20) - 1)),
+          major(event.dev()), minor(event.dev()),
           (unsigned long long)event.old_sector(), event.nr_bios());
   return std::string(line);
 }
@@ -1248,8 +1229,7 @@
 std::string FormatBlockRqRequeue(const BlockRqRequeueFtraceEvent& event) {
   char line[2048];
   sprintf(line, "block_rq_requeue: %d,%d %s (%s) %llu + %u [%d\\n",
-          (unsigned int)(event.dev() >> 20),
-          (unsigned int)(event.dev() & ((1U << 20) - 1)), event.rwbs().c_str(),
+          major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
           event.cmd().c_str(), (unsigned long long)event.sector(),
           event.nr_sector(), event.errors());
   return std::string(line);
@@ -1257,9 +1237,8 @@
 
 std::string FormatBlockSleeprq(const BlockSleeprqFtraceEvent& event) {
   char line[2048];
-  sprintf(line, "block_sleeprq: %d,%d %s %llu + %u [%s]\\n",
-          (unsigned int)(event.dev() >> 20),
-          (unsigned int)(event.dev() & ((1U << 20) - 1)), event.rwbs().c_str(),
+  sprintf(line, "block_sleeprq: %d,%d %s %llu + %u [%s]\\n", major(event.dev()),
+          minor(event.dev()), event.rwbs().c_str(),
           (unsigned long long)event.sector(), event.nr_sector(),
           event.comm().c_str());
   return std::string(line);
@@ -1267,9 +1246,8 @@
 
 std::string FormatBlockSplit(const BlockSplitFtraceEvent& event) {
   char line[2048];
-  sprintf(line, "block_split: %d,%d %s %llu / %llu [%s]\\n",
-          (unsigned int)(event.dev() >> 20),
-          (unsigned int)(event.dev() & ((1U << 20) - 1)), event.rwbs().c_str(),
+  sprintf(line, "block_split: %d,%d %s %llu / %llu [%s]\\n", major(event.dev()),
+          minor(event.dev()), event.rwbs().c_str(),
           (unsigned long long)event.sector(),
           (unsigned long long)event.new_sector(), event.comm().c_str());
   return std::string(line);
@@ -1278,8 +1256,7 @@
 std::string FormatBlockTouchBuffer(const BlockTouchBufferFtraceEvent& event) {
   char line[2048];
   sprintf(line, "block_touch_buffer: %d,%d sector=%llu size=%zu\\n",
-          (unsigned int)(event.dev() >> 20),
-          (unsigned int)(event.dev() & ((1U << 20) - 1)),
+          major(event.dev()), minor(event.dev()),
           (unsigned long long)event.sector(), (unsigned long)event.size());
   return std::string(line);
 }
@@ -1296,9 +1273,8 @@
   sprintf(line,
           "ext4_alloc_da_blocks: dev %d,%d ino %lu data_blocks %u meta_blocks "
           "%u \\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.data_blocks(), event.meta_blocks());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.data_blocks(), event.meta_blocks());
   return std::string(line);
 }
 
@@ -1308,20 +1284,18 @@
   sprintf(line,
           "ext4_allocate_blocks: dev %d,%d ino %lu flags %s len %u block %llu "
           "lblk %u goal %llu lleft %u lright %u pleft %llu pright %llu\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), GetExt4HintFlag(event.flags()),
-          event.len(), event.block(), event.logical(), event.goal(),
-          event.lleft(), event.lright(), event.pleft(), event.pright());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          GetExt4HintFlag(event.flags()), event.len(), event.block(),
+          event.logical(), event.goal(), event.lleft(), event.lright(),
+          event.pleft(), event.pright());
   return std::string(line);
 }
 
 std::string FormatExt4AllocateInode(const Ext4AllocateInodeFtraceEvent& event) {
   char line[2048];
   sprintf(line, "ext4_allocate_inode: dev %d,%d ino %lu dir %lu mode 0%o\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), (unsigned long)event.dir(), event.mode());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          (unsigned long)event.dir(), event.mode());
   return std::string(line);
 }
 
@@ -1330,9 +1304,8 @@
   char line[2048];
   sprintf(line,
           "ext4_begin_ordered_truncate: dev %d,%d ino %lu new_size %lld\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.new_size());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.new_size());
   return std::string(line);
 }
 
@@ -1340,9 +1313,8 @@
   char line[2048];
   sprintf(line,
           "ext4_collapse_range: dev %d,%d ino %lu offset %lld len %lld\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.offset(), event.len());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.offset(), event.len());
   return std::string(line);
 }
 
@@ -1353,11 +1325,10 @@
           "ext4_da_release_space: dev %d,%d ino %lu mode 0%o i_blocks %llu "
           "freed_blocks %d reserved_data_blocks %d reserved_meta_blocks %d "
           "allocated_meta_blocks %d\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.mode(), event.i_blocks(),
-          event.freed_blocks(), event.reserved_data_blocks(),
-          event.reserved_meta_blocks(), event.allocated_meta_blocks());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.mode(), event.i_blocks(), event.freed_blocks(),
+          event.reserved_data_blocks(), event.reserved_meta_blocks(),
+          event.allocated_meta_blocks());
   return std::string(line);
 }
 
@@ -1367,10 +1338,9 @@
   sprintf(line,
           "ext4_da_reserve_space:dev %d,%d ino %lu mode 0%o i_blocks %llu "
           "reserved_data_blocks %d reserved_meta_blocks %d \\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.mode(), event.i_blocks(),
-          event.reserved_data_blocks(), event.reserved_meta_blocks());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.mode(), event.i_blocks(), event.reserved_data_blocks(),
+          event.reserved_meta_blocks());
   return std::string(line);
 }
 
@@ -1381,12 +1351,10 @@
           "ext4_da_update_reserve_space: dev %d,%d ino %lu mode 0%o i_blocks "
           "%llu used_blocks %d reserved_data_blocks %d reserved_meta_blocks %d "
           "allocated_meta_blocks %d quota_claim %d\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.mode(), event.i_blocks(),
-          event.used_blocks(), event.reserved_data_blocks(),
-          event.reserved_meta_blocks(), event.allocated_meta_blocks(),
-          event.quota_claim());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.mode(), event.i_blocks(), event.used_blocks(),
+          event.reserved_data_blocks(), event.reserved_meta_blocks(),
+          event.allocated_meta_blocks(), event.quota_claim());
   return std::string(line);
 }
 
@@ -1395,10 +1363,9 @@
   sprintf(line,
           "ext4_da_write_pages: dev %d,%d ino %lu first_page %lu nr_to_write "
           "%ld sync_mode %d\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), (unsigned long)event.first_page(),
-          (long)event.nr_to_write(), event.sync_mode());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          (unsigned long)event.first_page(), (long)event.nr_to_write(),
+          event.sync_mode());
   return std::string(line);
 }
 
@@ -1408,18 +1375,15 @@
   char line[2048];
   sprintf(line,
           "ext4_da_write_pages_extent: dev %d,%d ino %lu lblk %llu len %u \\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.lblk(), event.len());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.lblk(), event.len());
   return std::string(line);
 }
 
 std::string FormatExt4DiscardBlocks(const Ext4DiscardBlocksFtraceEvent& event) {
   char line[2048];
   sprintf(line, "ext4_discard_blocks: dev %d,%d blk %llu count %llu\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))), event.blk(),
-          event.count());
+          major(event.dev()), minor(event.dev()), event.blk(), event.count());
   return std::string(line);
 }
 
@@ -1427,18 +1391,15 @@
     const Ext4DiscardPreallocationsFtraceEvent& event) {
   char line[2048];
   sprintf(line, "ext4_discard_preallocations: dev %d,%d ino %lu\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino());
   return std::string(line);
 }
 
 std::string FormatExt4DropInode(const Ext4DropInodeFtraceEvent& event) {
   char line[2048];
   sprintf(line, "ext4_drop_inode: dev %d,%d ino %lu drop %d\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.drop());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.drop());
   return std::string(line);
 }
 
@@ -1447,9 +1408,8 @@
   char line[2048];
   sprintf(line,
           "ext4_es_cache_extent: dev %d,%d ino %lu es [%u/%u) mapped %llu \\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.lblk(), event.len(), event.pblk());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.lblk(), event.len(), event.pblk());
   return std::string(line);
 }
 
@@ -1459,9 +1419,8 @@
   sprintf(
       line,
       "ext4_es_find_delayed_extent_range_enter: dev %d,%d ino %lu lblk %u\\n",
-      ((unsigned int)((event.dev()) >> 20)),
-      ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-      (unsigned long)event.ino(), event.lblk());
+      major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+      event.lblk());
   return std::string(line);
 }
 
@@ -1472,9 +1431,8 @@
   sprintf(line,
           "ext4_es_find_delayed_extent_range_exit: dev %d,%d ino %lu es "
           "[%u/%u) mapped %llu\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.lblk(), event.len(), event.pblk());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.lblk(), event.len(), event.pblk());
   return std::string(line);
 }
 
@@ -1484,9 +1442,8 @@
   char line[2048];
   sprintf(line,
           "ext4_es_insert_extent: dev %d,%d ino %lu es [%u/%u) mapped %llu \\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.lblk(), event.len(), event.pblk());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.lblk(), event.len(), event.pblk());
   return std::string(line);
 }
 
@@ -1494,9 +1451,8 @@
     const Ext4EsLookupExtentEnterFtraceEvent& event) {
   char line[2048];
   sprintf(line, "ext4_es_lookup_extent_enter: dev %d,%d ino %lu lblk %u\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.lblk());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.lblk());
   return std::string(line);
 }
 
@@ -1507,9 +1463,8 @@
   sprintf(
       line,
       "ext4_es_lookup_extent_exit: dev %d,%d ino %lu found %d [%u/%u) %llu\\n",
-      ((unsigned int)((event.dev()) >> 20)),
-      ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-      (unsigned long)event.ino(), event.found(), event.lblk(), event.len(),
+      major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+      event.found(), event.lblk(), event.len(),
       event.found() ? event.pblk() : 0);
   return std::string(line);
 }
@@ -1518,9 +1473,8 @@
     const Ext4EsRemoveExtentFtraceEvent& event) {
   char line[2048];
   sprintf(line, "ext4_es_remove_extent: dev %d,%d ino %lu es [%lld/%lld)\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.lblk(), event.len());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.lblk(), event.len());
   return std::string(line);
 }
 
@@ -1529,8 +1483,7 @@
   sprintf(line,
           "ext4_es_shrink: dev %d,%d nr_shrunk %d, scan_time %llu nr_skipped "
           "%d retried %d\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))), event.nr_shrunk(),
+          major(event.dev()), minor(event.dev()), event.nr_shrunk(),
           event.scan_time(), event.nr_skipped(), event.retried());
   return std::string(line);
 }
@@ -1538,9 +1491,8 @@
 std::string FormatExt4EsShrinkCount(const Ext4EsShrinkCountFtraceEvent& event) {
   char line[2048];
   sprintf(line, "ext4_es_shrink_count: dev %d,%d nr_to_scan %d cache_cnt %d\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          event.nr_to_scan(), event.cache_cnt());
+          major(event.dev()), minor(event.dev()), event.nr_to_scan(),
+          event.cache_cnt());
   return std::string(line);
 }
 
@@ -1549,9 +1501,8 @@
   char line[2048];
   sprintf(line,
           "ext4_es_shrink_scan_enter: dev %d,%d nr_to_scan %d cache_cnt %d\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          event.nr_to_scan(), event.cache_cnt());
+          major(event.dev()), minor(event.dev()), event.nr_to_scan(),
+          event.cache_cnt());
   return std::string(line);
 }
 
@@ -1560,8 +1511,7 @@
   char line[2048];
   sprintf(line,
           "ext4_es_shrink_scan_exit: dev %d,%d nr_shrunk %d cache_cnt %d\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))), event.nr_shrunk(),
+          major(event.dev()), minor(event.dev()), event.nr_shrunk(),
           event.cache_cnt());
   return std::string(line);
 }
@@ -1569,9 +1519,8 @@
 std::string FormatExt4EvictInode(const Ext4EvictInodeFtraceEvent& event) {
   char line[2048];
   sprintf(line, "ext4_evict_inode: dev %d,%d ino %lu nlink %d\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.nlink());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.nlink());
   return std::string(line);
 }
 
@@ -1581,10 +1530,9 @@
   sprintf(line,
           "ext4_ext_convert_to_initialized_enter: dev %d,%d ino %lu m_lblk %u "
           "m_len %u u_lblk %u u_len %u u_pblk %llu\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.m_lblk(), event.m_len(),
-          event.u_lblk(), event.u_len(), event.u_pblk());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.m_lblk(), event.m_len(), event.u_lblk(), event.u_len(),
+          event.u_pblk());
   return std::string(line);
 }
 
@@ -1595,11 +1543,9 @@
           "ext4_ext_convert_to_initialized_fastpath: dev %d,%d ino %lu m_lblk "
           "%u m_len %u u_lblk %u u_len %u u_pblk %llu i_lblk %u i_len %u "
           "i_pblk %llu\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.m_lblk(), event.m_len(),
-          event.u_lblk(), event.u_len(), event.u_pblk(), event.i_lblk(),
-          event.i_len(), event.i_pblk());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.m_lblk(), event.m_len(), event.u_lblk(), event.u_len(),
+          event.u_pblk(), event.i_lblk(), event.i_len(), event.i_pblk());
   return std::string(line);
 }
 
@@ -1609,10 +1555,8 @@
   sprintf(line,
           "ext4_ext_handle_unwritten_extents: dev %d,%d ino %lu m_lblk %u "
           "m_pblk %llu m_len %u flags %s allocated %d newblock %llu\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), (unsigned)event.lblk(),
-          (unsigned long long)event.pblk(), event.len(),
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          (unsigned)event.lblk(), (unsigned long long)event.pblk(), event.len(),
           GetExt4ExtFlag(event.flags()), (unsigned int)event.allocated(),
           (unsigned long long)event.newblk());
   return std::string(line);
@@ -1621,18 +1565,16 @@
 std::string FormatExt4ExtInCache(const Ext4ExtInCacheFtraceEvent& event) {
   char line[2048];
   sprintf(line, "ext4_ext_in_cache: dev %d,%d ino %lu lblk %u ret %d\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), (unsigned)event.lblk(), event.ret());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          (unsigned)event.lblk(), event.ret());
   return std::string(line);
 }
 
 std::string FormatExt4ExtLoadExtent(const Ext4ExtLoadExtentFtraceEvent& event) {
   char line[2048];
   sprintf(line, "ext4_ext_load_extent: dev %d,%d ino %lu lblk %u pblk %llu\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.lblk(), event.pblk());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.lblk(), event.pblk());
   return std::string(line);
 }
 
@@ -1642,10 +1584,8 @@
   sprintf(
       line,
       "ext4_ext_map_blocks_enter: dev %d,%d ino %lu lblk %u len %u flags %s\\n",
-      ((unsigned int)((event.dev()) >> 20)),
-      ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-      (unsigned long)event.ino(), event.lblk(), event.len(),
-      GetExt4ExtFlag(event.flags()));
+      major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+      event.lblk(), event.len(), GetExt4ExtFlag(event.flags()));
   return std::string(line);
 }
 
@@ -1655,10 +1595,8 @@
   sprintf(line,
           "ext4_ext_map_blocks_exit: dev %d,%d ino %lu lblk %u pblk %llu len "
           "%u flags %x ret %d\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.lblk(), event.pblk(), event.len(),
-          event.flags(), event.ret());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.lblk(), event.pblk(), event.len(), event.flags(), event.ret());
   return std::string(line);
 }
 
@@ -1667,10 +1605,8 @@
   sprintf(
       line,
       "ext4_ext_put_in_cache: dev %d,%d ino %lu lblk %u len %u start %llu\\n",
-      ((unsigned int)((event.dev()) >> 20)),
-      ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-      (unsigned long)event.ino(), (unsigned)event.lblk(), event.len(),
-      (unsigned long long)event.start());
+      major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+      (unsigned)event.lblk(), event.len(), (unsigned long long)event.start());
   return std::string(line);
 }
 
@@ -1680,10 +1616,8 @@
   sprintf(
       line,
       "ext4_ext_remove_space: dev %d,%d ino %lu since %u end %u depth %d\\n",
-      ((unsigned int)((event.dev()) >> 20)),
-      ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-      (unsigned long)event.ino(), (unsigned)event.start(),
-      (unsigned)event.end(), event.depth());
+      major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+      (unsigned)event.start(), (unsigned)event.end(), event.depth());
   return std::string(line);
 }
 
@@ -1693,20 +1627,17 @@
   sprintf(line,
           "ext4_ext_remove_space_done: dev %d,%d ino %lu since %u end %u depth "
           "%d partial %lld remaining_entries %u\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), (unsigned)event.start(),
-          (unsigned)event.end(), event.depth(), (long long)event.partial(),
-          (unsigned short)event.eh_entries());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          (unsigned)event.start(), (unsigned)event.end(), event.depth(),
+          (long long)event.partial(), (unsigned short)event.eh_entries());
   return std::string(line);
 }
 
 std::string FormatExt4ExtRmIdx(const Ext4ExtRmIdxFtraceEvent& event) {
   char line[2048];
   sprintf(line, "ext4_ext_rm_idx: dev %d,%d ino %lu index_pblk %llu\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), (unsigned long long)event.pblk());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          (unsigned long long)event.pblk());
   return std::string(line);
 }
 
@@ -1715,11 +1646,10 @@
   sprintf(line,
           "ext4_ext_rm_leaf: dev %d,%d ino %lu start_lblk %u last_extent "
           "[%u(%llu), %u]partial_cluster %lld\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), (unsigned)event.start(),
-          (unsigned)event.ee_lblk(), (unsigned long long)event.ee_pblk(),
-          (unsigned short)event.ee_len(), (long long)event.partial());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          (unsigned)event.start(), (unsigned)event.ee_lblk(),
+          (unsigned long long)event.ee_pblk(), (unsigned short)event.ee_len(),
+          (long long)event.partial());
   return std::string(line);
 }
 
@@ -1727,10 +1657,9 @@
   char line[2048];
   sprintf(line,
           "ext4_ext_show_extent: dev %d,%d ino %lu lblk %u pblk %llu len %u\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), (unsigned)event.lblk(),
-          (unsigned long long)event.pblk(), (unsigned short)event.len());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          (unsigned)event.lblk(), (unsigned long long)event.pblk(),
+          (unsigned short)event.len());
   return std::string(line);
 }
 
@@ -1740,10 +1669,8 @@
   sprintf(
       line,
       "ext4_fallocate_enter: dev %d,%d ino %lu offset %lld len %lld mode %s\\n",
-      ((unsigned int)((event.dev()) >> 20)),
-      ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-      (unsigned long)event.ino(), event.offset(), event.len(),
-      GetExt4ModeFlag(event.mode()));
+      major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+      event.offset(), event.len(), GetExt4ModeFlag(event.mode()));
   return std::string(line);
 }
 
@@ -1751,9 +1678,8 @@
   char line[2048];
   sprintf(line,
           "ext4_fallocate_exit: dev %d,%d ino %lu pos %lld blocks %u ret %d\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.pos(), event.blocks(), event.ret());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.pos(), event.blocks(), event.ret());
   return std::string(line);
 }
 
@@ -1763,11 +1689,9 @@
   sprintf(line,
           "ext4_find_delalloc_range: dev %d,%d ino %lu from %u to %u reverse "
           "%d found %d (blk = %u)\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), (unsigned)event.from(),
-          (unsigned)event.to(), event.reverse(), event.found(),
-          (unsigned)event.found_blk());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          (unsigned)event.from(), (unsigned)event.to(), event.reverse(),
+          event.found(), (unsigned)event.found_blk());
   return std::string(line);
 }
 
@@ -1776,10 +1700,8 @@
   sprintf(
       line,
       "ext4_forget: dev %d,%d ino %lu mode 0%o is_metadata %d block %llu\\n",
-      ((unsigned int)((event.dev()) >> 20)),
-      ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-      (unsigned long)event.ino(), event.mode(), event.is_metadata(),
-      event.block());
+      major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+      event.mode(), event.is_metadata(), event.block());
   return std::string(line);
 }
 
@@ -1788,10 +1710,9 @@
   sprintf(line,
           "ext4_free_blocks: dev %d,%d ino %lu mode 0%o block %llu count %lu "
           "flags %s\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.mode(), event.block(),
-          (unsigned long)event.count(), GetExt4FreeBlocksFlag(event.flags()));
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.mode(), event.block(), (unsigned long)event.count(),
+          GetExt4FreeBlocksFlag(event.flags()));
   return std::string(line);
 }
 
@@ -1800,10 +1721,8 @@
   sprintf(line,
           "ext4_free_inode: dev %d,%d ino %lu mode 0%o uid %u gid %u blocks "
           "%llu\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.mode(), event.uid(), event.gid(),
-          event.blocks());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.mode(), event.uid(), event.gid(), event.blocks());
   return std::string(line);
 }
 
@@ -1813,8 +1732,7 @@
   sprintf(line,
           "ext4_get_implied_cluster_alloc_exit: dev %d,%d m_lblk %u m_pblk "
           "%llu m_len %u m_flags %u ret %d\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))), event.lblk(),
+          major(event.dev()), minor(event.dev()), event.lblk(),
           (unsigned long long)event.pblk(), event.len(), event.flags(),
           event.ret());
   return std::string(line);
@@ -1826,9 +1744,8 @@
   sprintf(
       line,
       "ext4_get_reserved_cluster_alloc: dev %d,%d ino %lu lblk %u len %u\\n",
-      ((unsigned int)((event.dev()) >> 20)),
-      ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-      (unsigned long)event.ino(), (unsigned)event.lblk(), event.len());
+      major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+      (unsigned)event.lblk(), event.len());
   return std::string(line);
 }
 
@@ -1838,9 +1755,8 @@
   sprintf(
       line,
       "ext4_ind_map_blocks_enter: dev %d,%d ino %lu lblk %u len %u flags %u\\n",
-      ((unsigned int)((event.dev()) >> 20)),
-      ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-      (unsigned long)event.ino(), event.lblk(), event.len(), event.flags());
+      major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+      event.lblk(), event.len(), event.flags());
   return std::string(line);
 }
 
@@ -1850,19 +1766,16 @@
   sprintf(line,
           "ext4_ind_map_blocks_exit: dev %d,%d ino %lu lblk %u pblk %llu len "
           "%u flags %x ret %d\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.lblk(), event.pblk(), event.len(),
-          event.flags(), event.ret());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.lblk(), event.pblk(), event.len(), event.flags(), event.ret());
   return std::string(line);
 }
 
 std::string FormatExt4InsertRange(const Ext4InsertRangeFtraceEvent& event) {
   char line[2048];
   sprintf(line, "ext4_insert_range: dev %d,%d ino %lu offset %lld len %lld\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.offset(), event.len());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.offset(), event.len());
   return std::string(line);
 }
 
@@ -1872,10 +1785,8 @@
   sprintf(line,
           "ext4_invalidatepage: dev %d,%d ino %lu page_index %lu offset %u "
           "length %u\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), (unsigned long)event.index(),
-          event.offset(), event.length());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          (unsigned long)event.index(), event.offset(), event.length());
   return std::string(line);
 }
 
@@ -1884,8 +1795,7 @@
   sprintf(
       line,
       "ext4_journal_start: dev %d,%d blocks, %d rsv_blocks, %d caller %pS\\n",
-      ((unsigned int)((event.dev()) >> 20)),
-      ((unsigned int)((event.dev()) & ((1U << 20) - 1))), event.blocks(),
+      major(event.dev()), minor(event.dev()), event.blocks(),
       event.rsv_blocks(), (void*)event.ip());
   return std::string(line);
 }
@@ -1895,8 +1805,7 @@
   char line[2048];
   sprintf(line,
           "ext4_journal_start_reserved: dev %d,%d blocks, %d caller %pS\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))), event.blocks(),
+          major(event.dev()), minor(event.dev()), event.blocks(),
           (void*)event.ip());
   return std::string(line);
 }
@@ -1907,10 +1816,8 @@
   sprintf(line,
           "ext4_journalled_invalidatepage: dev %d,%d ino %lu page_index %lu "
           "offset %u length %u\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), (unsigned long)event.index(),
-          event.offset(), event.length());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          (unsigned long)event.index(), event.offset(), event.length());
   return std::string(line);
 }
 
@@ -1920,18 +1827,15 @@
   sprintf(line,
           "ext4_journalled_write_end: dev %d,%d ino %lu pos %lld len %u copied "
           "%u\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.pos(), event.len(), event.copied());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.pos(), event.len(), event.copied());
   return std::string(line);
 }
 
 std::string FormatExt4LoadInode(const Ext4LoadInodeFtraceEvent& event) {
   char line[2048];
-  sprintf(line, "ext4_load_inode: dev %d,%d ino %ld\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino());
+  sprintf(line, "ext4_load_inode: dev %d,%d ino %ld\\n", major(event.dev()),
+          minor(event.dev()), (unsigned long)event.ino());
   return std::string(line);
 }
 
@@ -1939,8 +1843,7 @@
     const Ext4LoadInodeBitmapFtraceEvent& event) {
   char line[2048];
   sprintf(line, "ext4_load_inode_bitmap: dev %d,%d group %u\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))), event.group());
+          major(event.dev()), minor(event.dev()), event.group());
   return std::string(line);
 }
 
@@ -1948,17 +1851,15 @@
     const Ext4MarkInodeDirtyFtraceEvent& event) {
   char line[2048];
   sprintf(line, "ext4_mark_inode_dirty: dev %d,%d ino %lu caller %pS\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), (void*)event.ip());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          (void*)event.ip());
   return std::string(line);
 }
 
 std::string FormatExt4MbBitmapLoad(const Ext4MbBitmapLoadFtraceEvent& event) {
   char line[2048];
   sprintf(line, "ext4_mb_bitmap_load: dev %d,%d group %u\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))), event.group());
+          major(event.dev()), minor(event.dev()), event.group());
   return std::string(line);
 }
 
@@ -1966,8 +1867,7 @@
     const Ext4MbBuddyBitmapLoadFtraceEvent& event) {
   char line[2048];
   sprintf(line, "ext4_mb_buddy_bitmap_load: dev %d,%d group %u\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))), event.group());
+          major(event.dev()), minor(event.dev()), event.group());
   return std::string(line);
 }
 
@@ -1975,8 +1875,7 @@
     const Ext4MbDiscardPreallocationsFtraceEvent& event) {
   char line[2048];
   sprintf(line, "ext4_mb_discard_preallocations: dev %d,%d needed %d\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))), event.needed());
+          major(event.dev()), minor(event.dev()), event.needed());
   return std::string(line);
 }
 
@@ -1985,10 +1884,8 @@
   sprintf(line,
           "ext4_mb_new_group_pa: dev %d,%d ino %lu pstart %llu len %u lstart "
           "%llu\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.pa_pstart(), event.pa_len(),
-          event.pa_lstart());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.pa_pstart(), event.pa_len(), event.pa_lstart());
   return std::string(line);
 }
 
@@ -1997,10 +1894,8 @@
   sprintf(line,
           "ext4_mb_new_inode_pa: dev %d,%d ino %lu pstart %llu len %u lstart "
           "%llu\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.pa_pstart(), event.pa_len(),
-          event.pa_lstart());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.pa_pstart(), event.pa_len(), event.pa_lstart());
   return std::string(line);
 }
 
@@ -2008,8 +1903,7 @@
     const Ext4MbReleaseGroupPaFtraceEvent& event) {
   char line[2048];
   sprintf(line, "ext4_mb_release_group_pa: dev %d,%d pstart %llu len %u\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))), event.pa_pstart(),
+          major(event.dev()), minor(event.dev()), event.pa_pstart(),
           event.pa_len());
   return std::string(line);
 }
@@ -2019,9 +1913,8 @@
   char line[2048];
   sprintf(line,
           "ext4_mb_release_inode_pa: dev %d,%d ino %lu block %llu count %u\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.block(), event.count());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.block(), event.count());
   return std::string(line);
 }
 
@@ -2031,13 +1924,12 @@
           "ext4_mballoc_alloc: dev %d,%d inode %lu orig %u/%d/%u@%u goal "
           "%u/%d/%u@%u result %u/%d/%u@%u blks %u grps %u cr %u flags %s tail "
           "%u broken %u\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.orig_group(), event.orig_start(),
-          event.orig_len(), event.orig_logical(), event.goal_group(),
-          event.goal_start(), event.goal_len(), event.goal_logical(),
-          event.result_group(), event.result_start(), event.result_len(),
-          event.result_logical(), event.found(), event.groups(), event.cr(),
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.orig_group(), event.orig_start(), event.orig_len(),
+          event.orig_logical(), event.goal_group(), event.goal_start(),
+          event.goal_len(), event.goal_logical(), event.result_group(),
+          event.result_start(), event.result_len(), event.result_logical(),
+          event.found(), event.groups(), event.cr(),
           GetExt4HintFlag(event.flags()), event.tail(),
           event.buddy() ? 1 << event.buddy() : 0);
   return std::string(line);
@@ -2047,20 +1939,16 @@
     const Ext4MballocDiscardFtraceEvent& event) {
   char line[2048];
   sprintf(line, "ext4_mballoc_discard: dev %d,%d inode %lu extent %u/%d/%d \\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.result_group(),
-          event.result_start(), event.result_len());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.result_group(), event.result_start(), event.result_len());
   return std::string(line);
 }
 
 std::string FormatExt4MballocFree(const Ext4MballocFreeFtraceEvent& event) {
   char line[2048];
   sprintf(line, "ext4_mballoc_free: dev %d,%d inode %lu extent %u/%d/%d \\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.result_group(),
-          event.result_start(), event.result_len());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.result_group(), event.result_start(), event.result_len());
   return std::string(line);
 }
 
@@ -2070,11 +1958,10 @@
   sprintf(line,
           "ext4_mballoc_prealloc: dev %d,%d inode %lu orig %u/%d/%u@%u result "
           "%u/%d/%u@%u\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.orig_group(), event.orig_start(),
-          event.orig_len(), event.orig_logical(), event.result_group(),
-          event.result_start(), event.result_len(), event.result_logical());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.orig_group(), event.orig_start(), event.orig_len(),
+          event.orig_logical(), event.result_group(), event.result_start(),
+          event.result_len(), event.result_logical());
   return std::string(line);
 }
 
@@ -2084,8 +1971,7 @@
   sprintf(line,
           "ext4_other_inode_update_time: dev %d,%d orig_ino %lu ino %lu mode "
           "0%o uid %u gid %u\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
+          major(event.dev()), minor(event.dev()),
           (unsigned long)event.orig_ino(), (unsigned long)event.ino(),
           event.mode(), event.uid(), event.gid());
   return std::string(line);
@@ -2095,10 +1981,8 @@
   char line[2048];
   sprintf(line,
           "ext4_punch_hole: dev %d,%d ino %lu offset %lld len %lld mode %s\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.offset(), event.len(),
-          GetExt4ModeFlag(event.mode()));
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.offset(), event.len(), GetExt4ModeFlag(event.mode()));
   return std::string(line);
 }
 
@@ -2106,26 +1990,23 @@
     const Ext4ReadBlockBitmapLoadFtraceEvent& event) {
   char line[2048];
   sprintf(line, "ext4_read_block_bitmap_load: dev %d,%d group %u\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))), event.group());
+          major(event.dev()), minor(event.dev()), event.group());
   return std::string(line);
 }
 
 std::string FormatExt4Readpage(const Ext4ReadpageFtraceEvent& event) {
   char line[2048];
   sprintf(line, "ext4_readpage: dev %d,%d ino %lu page_index %lu\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), (unsigned long)event.index());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          (unsigned long)event.index());
   return std::string(line);
 }
 
 std::string FormatExt4Releasepage(const Ext4ReleasepageFtraceEvent& event) {
   char line[2048];
   sprintf(line, "ext4_releasepage: dev %d,%d ino %lu page_index %lu\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), (unsigned long)event.index());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          (unsigned long)event.index());
   return std::string(line);
 }
 
@@ -2134,12 +2015,10 @@
   sprintf(line,
           "ext4_remove_blocks: dev %d,%d ino %lu extent [%u(%llu), %u]from %u "
           "to %u partial_cluster %lld\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), (unsigned)event.ee_lblk(),
-          (unsigned long long)event.ee_pblk(), (unsigned short)event.ee_len(),
-          (unsigned)event.from(), (unsigned)event.to(),
-          (long long)event.partial());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          (unsigned)event.ee_lblk(), (unsigned long long)event.ee_pblk(),
+          (unsigned short)event.ee_len(), (unsigned)event.from(),
+          (unsigned)event.to(), (long long)event.partial());
   return std::string(line);
 }
 
@@ -2148,28 +2027,25 @@
   sprintf(line,
           "ext4_request_blocks: dev %d,%d ino %lu flags %s len %u lblk %u goal "
           "%llu lleft %u lright %u pleft %llu pright %llu \\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), GetExt4HintFlag(event.flags()),
-          event.len(), event.logical(), event.goal(), event.lleft(),
-          event.lright(), event.pleft(), event.pright());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          GetExt4HintFlag(event.flags()), event.len(), event.logical(),
+          event.goal(), event.lleft(), event.lright(), event.pleft(),
+          event.pright());
   return std::string(line);
 }
 
 std::string FormatExt4RequestInode(const Ext4RequestInodeFtraceEvent& event) {
   char line[2048];
   sprintf(line, "ext4_request_inode: dev %d,%d dir %lu mode 0%o\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.dir(), event.mode());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.dir(),
+          event.mode());
   return std::string(line);
 }
 
 std::string FormatExt4SyncFs(const Ext4SyncFsFtraceEvent& event) {
   char line[2048];
-  sprintf(line, "ext4_sync_fs: dev %d,%d wait %d\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))), event.wait());
+  sprintf(line, "ext4_sync_fs: dev %d,%d wait %d\\n", major(event.dev()),
+          minor(event.dev()), event.wait());
   return std::string(line);
 }
 
@@ -2192,37 +2068,32 @@
 std::string FormatExt4TruncateEnter(const Ext4TruncateEnterFtraceEvent& event) {
   char line[2048];
   sprintf(line, "ext4_truncate_enter: dev %d,%d ino %lu blocks %llu\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.blocks());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.blocks());
   return std::string(line);
 }
 
 std::string FormatExt4TruncateExit(const Ext4TruncateExitFtraceEvent& event) {
   char line[2048];
   sprintf(line, "ext4_truncate_exit: dev %d,%d ino %lu blocks %llu\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.blocks());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.blocks());
   return std::string(line);
 }
 
 std::string FormatExt4UnlinkEnter(const Ext4UnlinkEnterFtraceEvent& event) {
   char line[2048];
   sprintf(line, "ext4_unlink_enter: dev %d,%d ino %lu size %lld parent %lu\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.size(),
-          (unsigned long)event.parent());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.size(), (unsigned long)event.parent());
   return std::string(line);
 }
 
 std::string FormatExt4UnlinkExit(const Ext4UnlinkExitFtraceEvent& event) {
   char line[2048];
   sprintf(line, "ext4_unlink_exit: dev %d,%d ino %lu ret %d\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.ret());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.ret());
   return std::string(line);
 }
 
@@ -2230,27 +2101,24 @@
   char line[2048];
   sprintf(line,
           "ext4_write_begin: dev %d,%d ino %lu pos %lld len %u flags %u\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.pos(), event.len(), event.flags());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.pos(), event.len(), event.flags());
   return std::string(line);
 }
 
 std::string FormatExt4WriteEnd(const Ext4WriteEndFtraceEvent& event) {
   char line[2048];
   sprintf(line, "ext4_write_end: %d,%d ino %lu pos %lld len %u copied %u\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.pos(), event.len(), event.copied());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.pos(), event.len(), event.copied());
   return std::string(line);
 }
 
 std::string FormatExt4Writepage(const Ext4WritepageFtraceEvent& event) {
   char line[2048];
   sprintf(line, "ext4_writepage: dev %d,%d ino %lu page_index %lu\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), (unsigned long)event.index());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          (unsigned long)event.index());
   return std::string(line);
 }
 
@@ -2260,11 +2128,10 @@
           "ext4_writepages: dev %d,%d ino %lu nr_to_write %ld pages_skipped "
           "%ld range_start %lld range_end %lld sync_mode %d for_kupdate %d "
           "range_cyclic %d writeback_index %lu\\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), (long)event.nr_to_write(),
-          (long)event.pages_skipped(), event.range_start(), event.range_end(),
-          event.sync_mode(), event.for_kupdate(), event.range_cyclic(),
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          (long)event.nr_to_write(), (long)event.pages_skipped(),
+          event.range_start(), event.range_end(), event.sync_mode(),
+          event.for_kupdate(), event.range_cyclic(),
           (unsigned long)event.writeback_index());
   return std::string(line);
 }
@@ -2275,11 +2142,9 @@
   sprintf(line,
           "ext4_writepages_result: dev %d,%d ino %lu ret %d pages_written %d "
           "pages_skipped %ld sync_mode %d writeback_index %lu \\n",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.ret(), event.pages_written(),
-          (long)event.pages_skipped(), event.sync_mode(),
-          (unsigned long)event.writeback_index());
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.ret(), event.pages_written(), (long)event.pages_skipped(),
+          event.sync_mode(), (unsigned long)event.writeback_index());
   return std::string(line);
 }
 
@@ -2287,10 +2152,8 @@
   char line[2048];
   sprintf(line,
           "ext4_zero_range: dev %d,%d ino %lu offset %lld len %lld mode %s\\n ",
-          ((unsigned int)((event.dev()) >> 20)),
-          ((unsigned int)((event.dev()) & ((1U << 20) - 1))),
-          (unsigned long)event.ino(), event.offset(), event.len(),
-          GetExt4ModeFlag(event.mode()));
+          major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+          event.offset(), event.len(), GetExt4ModeFlag(event.mode()));
   return std::string(line);
 }