+ (* Number of groups. *)
+ let groups_count =
+ Int63.of_int32 (
+ (s_blocks_count -* s_first_data_block -* 1l)
+ /* s_blocks_per_group +* 1l
+ ) in
+
+ { s_inodes_count = s_inodes_count;
+ s_blocks_count = s_blocks_count;
+ s_r_blocks_count = s_r_blocks_count;
+ s_free_blocks_count = s_free_blocks_count;
+ s_free_inodes_count = s_free_inodes_count;
+ s_first_data_block = s_first_data_block;
+ s_log_block_size = s_log_block_size;
+ s_log_frag_size = s_log_frag_size;
+ s_blocks_per_group = s_blocks_per_group;
+ s_frags_per_group = s_frags_per_group;
+ s_inodes_per_group = s_inodes_per_group;
+ s_mtime = s_mtime;
+ s_wtime = s_wtime;
+ s_mnt_count = s_mnt_count;
+ s_max_mnt_count = s_max_mnt_count;
+ s_state = s_state;
+ s_errors = s_errors;
+ s_minor_rev_level = s_minor_rev_level;
+ s_lastcheck = s_lastcheck;
+ s_checkinterval = s_checkinterval;
+ s_creator_os = s_creator_os;
+ s_rev_level = s_rev_level;
+ s_def_resuid = s_def_resuid;
+ s_def_resgid = s_def_resgid;
+ s_first_ino = s_first_ino;
+ s_inode_size = s_inode_size;
+ s_block_group_nr = s_block_group_nr;
+ s_feature_compat = s_feature_compat;
+ s_feature_incompat = s_feature_incompat;
+ s_feature_ro_compat = s_feature_ro_compat;
+ s_uuid = s_uuid;
+ s_volume_name = s_volume_name;
+ s_last_mounted = s_last_mounted;
+ s_algorithm_usage_bitmap = s_algorithm_usage_bitmap;
+ s_prealloc_blocks = s_prealloc_blocks;
+ s_prealloc_dir_blocks = s_prealloc_dir_blocks;
+ s_reserved_gdt_blocks = s_reserved_gdt_blocks;
+ s_journal_uuid = s_journal_uuid;
+ s_journal_inum = s_journal_inum;
+ s_journal_dev = s_journal_dev;
+ s_last_orphan = s_last_orphan;
+ s_hash_seed0 = s_hash_seed0;
+ s_hash_seed1 = s_hash_seed1;
+ s_hash_seed2 = s_hash_seed2;
+ s_hash_seed3 = s_hash_seed3;
+ s_def_hash_version = s_def_hash_version;
+ s_reserved_char_pad = s_reserved_char_pad;
+ s_reserved_word_pad = s_reserved_word_pad;
+ s_default_mount_opts = s_default_mount_opts;
+ s_first_meta_bg = s_first_meta_bg;
+ block_size = block_size;
+ groups_count = groups_count }
+
+ | { _ } ->
+ raise Not_found (* Not an EXT2/3 superblock. *)
+
+let rec probe dev =
+ let sb = parse_ext2_sb dev in (* May raise Not_found. *)