2 * Copyright (C) 2013 Alejandro Martinez Ruiz <alex@nowcomputing.com>
4 * This file may be redistributed under the terms of the
5 * GNU Lesser General Public License
11 #include "superblocks.h"
13 #define F2FS_MAGIC "\x10\x20\xF5\xF2"
14 #define F2FS_MAGIC_OFF 0
15 #define F2FS_UUID_SIZE 16
16 #define F2FS_LABEL_SIZE 512
17 #define F2FS_SB1_OFF 0x400
18 #define F2FS_SB1_KBOFF (F2FS_SB1_OFF >> 10)
19 #define F2FS_SB2_OFF 0x1400
20 #define F2FS_SB2_KBOFF (F2FS_SB2_OFF >> 10)
22 struct f2fs_super_block
{ /* According to version 1.1 */
23 /* 0x00 */ uint32_t magic
; /* Magic Number */
24 /* 0x04 */ uint16_t major_ver
; /* Major Version */
25 /* 0x06 */ uint16_t minor_ver
; /* Minor Version */
26 /* 0x08 */ uint32_t log_sectorsize
; /* log2 sector size in bytes */
27 /* 0x0C */ uint32_t log_sectors_per_block
; /* log2 # of sectors per block */
28 /* 0x10 */ uint32_t log_blocksize
; /* log2 block size in bytes */
29 /* 0x14 */ uint32_t log_blocks_per_seg
; /* log2 # of blocks per segment */
30 /* 0x18 */ uint32_t segs_per_sec
; /* # of segments per section */
31 /* 0x1C */ uint32_t secs_per_zone
; /* # of sections per zone */
32 /* 0x20 */ uint32_t checksum_offset
; /* checksum offset inside super block */
33 /* 0x24 */ uint64_t block_count
; /* total # of user blocks */
34 /* 0x2C */ uint32_t section_count
; /* total # of sections */
35 /* 0x30 */ uint32_t segment_count
; /* total # of segments */
36 /* 0x34 */ uint32_t segment_count_ckpt
; /* # of segments for checkpoint */
37 /* 0x38 */ uint32_t segment_count_sit
; /* # of segments for SIT */
38 /* 0x3C */ uint32_t segment_count_nat
; /* # of segments for NAT */
39 /* 0x40 */ uint32_t segment_count_ssa
; /* # of segments for SSA */
40 /* 0x44 */ uint32_t segment_count_main
; /* # of segments for main area */
41 /* 0x48 */ uint32_t segment0_blkaddr
; /* start block address of segment 0 */
42 /* 0x4C */ uint32_t cp_blkaddr
; /* start block address of checkpoint */
43 /* 0x50 */ uint32_t sit_blkaddr
; /* start block address of SIT */
44 /* 0x54 */ uint32_t nat_blkaddr
; /* start block address of NAT */
45 /* 0x58 */ uint32_t ssa_blkaddr
; /* start block address of SSA */
46 /* 0x5C */ uint32_t main_blkaddr
; /* start block address of main area */
47 /* 0x60 */ uint32_t root_ino
; /* root inode number */
48 /* 0x64 */ uint32_t node_ino
; /* node inode number */
49 /* 0x68 */ uint32_t meta_ino
; /* meta inode number */
50 /* 0x6C */ uint8_t uuid
[F2FS_UUID_SIZE
]; /* 128-bit uuid for volume */
51 /* 0x7C */ uint16_t volume_name
[F2FS_LABEL_SIZE
]; /* volume name */
53 /* 0x47C */ uint32_t extension_count
; /* # of extensions below */
54 /* 0x480 */ uint8_t extension_list
[64][8]; /* extension array */
56 } __attribute__((packed
));
58 static int probe_f2fs(blkid_probe pr
, const struct blkid_idmag
*mag
)
60 struct f2fs_super_block
*sb
;
61 uint16_t major
, minor
;
63 sb
= blkid_probe_get_sb(pr
, mag
, struct f2fs_super_block
);
65 return errno
? -errno
: 1;
67 major
= le16_to_cpu(sb
->major_ver
);
68 minor
= le16_to_cpu(sb
->minor_ver
);
70 /* For version 1.0 we cannot know the correct sb structure */
71 if (major
== 1 && minor
== 0)
74 if (*((unsigned char *) sb
->volume_name
))
75 blkid_probe_set_utf8label(pr
, (unsigned char *) sb
->volume_name
,
76 sizeof(sb
->volume_name
),
79 blkid_probe_set_uuid(pr
, sb
->uuid
);
80 blkid_probe_sprintf_version(pr
, "%u.%u", major
, minor
);
84 const struct blkid_idinfo f2fs_idinfo
=
87 .usage
= BLKID_USAGE_FILESYSTEM
,
88 .probefunc
= probe_f2fs
,
94 .kboff
= F2FS_SB1_KBOFF
,
95 .sboff
= F2FS_MAGIC_OFF