Contents of /trunk/util-linux/patches/util-linux-2.22.2-f2fs.patch
Parent Directory | Revision Log
Revision 2127 -
(show annotations)
(download)
Tue Mar 19 20:37:21 2013 UTC (11 years, 6 months ago) by niro
File size: 5857 byte(s)
Tue Mar 19 20:37:21 2013 UTC (11 years, 6 months ago) by niro
File size: 5857 byte(s)
-support f2fs
1 | From 7dcfc89e3061fc2276ce5b3b8d64db6d9eca8f8f Mon Sep 17 00:00:00 2001 |
2 | From: Alejandro Martinez Ruiz <alex@nowcomputing.com> |
3 | Date: Tue, 05 Feb 2013 17:00:06 +0000 |
4 | Subject: libblkid: add Flash-Friendly File System (f2fs) support |
5 | |
6 | This adds support for detecting Flash-Friendly File System (f2fs) to libblkid. |
7 | Based on work by Sven-Göran Bergh at http://www.mail-archive.com/busybox@busybox.net/msg17874.html |
8 | |
9 | Signed-off-by: Alejandro Martinez Ruiz <alex@nowcomputing.com> |
10 | Signed-off-by: Karel Zak <kzak@redhat.com> |
11 | --- |
12 | diff --git a/libblkid/src/Makemodule.am b/libblkid/src/Makemodule.am |
13 | index de60458..90efa3d 100644 |
14 | --- a/libblkid/src/Makemodule.am |
15 | +++ b/libblkid/src/Makemodule.am |
16 | @@ -54,6 +54,7 @@ libblkid_la_SOURCES = \ |
17 | libblkid/src/superblocks/drbdproxy_datalog.c \ |
18 | libblkid/src/superblocks/exfat.c \ |
19 | libblkid/src/superblocks/ext.c \ |
20 | + libblkid/src/superblocks/f2fs.c \ |
21 | libblkid/src/superblocks/gfs.c \ |
22 | libblkid/src/superblocks/hfs.c \ |
23 | libblkid/src/superblocks/highpoint_raid.c \ |
24 | diff --git a/libblkid/src/superblocks/f2fs.c b/libblkid/src/superblocks/f2fs.c |
25 | new file mode 100644 |
26 | index 0000000..1543a7a |
27 | --- /dev/null |
28 | +++ b/libblkid/src/superblocks/f2fs.c |
29 | @@ -0,0 +1,99 @@ |
30 | +/* |
31 | + * Copyright (C) 2013 Alejandro Martinez Ruiz <alex@nowcomputing.com> |
32 | + * |
33 | + * This file may be redistributed under the terms of the |
34 | + * GNU Lesser General Public License |
35 | + */ |
36 | + |
37 | +#include <stddef.h> |
38 | +#include <string.h> |
39 | + |
40 | +#include "superblocks.h" |
41 | + |
42 | +#define F2FS_MAGIC "\x10\x20\xF5\xF2" |
43 | +#define F2FS_MAGIC_OFF 0 |
44 | +#define F2FS_UUID_SIZE 16 |
45 | +#define F2FS_LABEL_SIZE 512 |
46 | +#define F2FS_SB1_OFF 0x400 |
47 | +#define F2FS_SB1_KBOFF (F2FS_SB1_OFF >> 10) |
48 | +#define F2FS_SB2_OFF 0x1400 |
49 | +#define F2FS_SB2_KBOFF (F2FS_SB2_OFF >> 10) |
50 | + |
51 | +struct f2fs_super_block { /* According to version 1.1 */ |
52 | +/* 0x00 */ uint32_t magic; /* Magic Number */ |
53 | +/* 0x04 */ uint16_t major_ver; /* Major Version */ |
54 | +/* 0x06 */ uint16_t minor_ver; /* Minor Version */ |
55 | +/* 0x08 */ uint32_t log_sectorsize; /* log2 sector size in bytes */ |
56 | +/* 0x0C */ uint32_t log_sectors_per_block; /* log2 # of sectors per block */ |
57 | +/* 0x10 */ uint32_t log_blocksize; /* log2 block size in bytes */ |
58 | +/* 0x14 */ uint32_t log_blocks_per_seg; /* log2 # of blocks per segment */ |
59 | +/* 0x18 */ uint32_t segs_per_sec; /* # of segments per section */ |
60 | +/* 0x1C */ uint32_t secs_per_zone; /* # of sections per zone */ |
61 | +/* 0x20 */ uint32_t checksum_offset; /* checksum offset inside super block */ |
62 | +/* 0x24 */ uint64_t block_count; /* total # of user blocks */ |
63 | +/* 0x2C */ uint32_t section_count; /* total # of sections */ |
64 | +/* 0x30 */ uint32_t segment_count; /* total # of segments */ |
65 | +/* 0x34 */ uint32_t segment_count_ckpt; /* # of segments for checkpoint */ |
66 | +/* 0x38 */ uint32_t segment_count_sit; /* # of segments for SIT */ |
67 | +/* 0x3C */ uint32_t segment_count_nat; /* # of segments for NAT */ |
68 | +/* 0x40 */ uint32_t segment_count_ssa; /* # of segments for SSA */ |
69 | +/* 0x44 */ uint32_t segment_count_main; /* # of segments for main area */ |
70 | +/* 0x48 */ uint32_t segment0_blkaddr; /* start block address of segment 0 */ |
71 | +/* 0x4C */ uint32_t cp_blkaddr; /* start block address of checkpoint */ |
72 | +/* 0x50 */ uint32_t sit_blkaddr; /* start block address of SIT */ |
73 | +/* 0x54 */ uint32_t nat_blkaddr; /* start block address of NAT */ |
74 | +/* 0x58 */ uint32_t ssa_blkaddr; /* start block address of SSA */ |
75 | +/* 0x5C */ uint32_t main_blkaddr; /* start block address of main area */ |
76 | +/* 0x60 */ uint32_t root_ino; /* root inode number */ |
77 | +/* 0x64 */ uint32_t node_ino; /* node inode number */ |
78 | +/* 0x68 */ uint32_t meta_ino; /* meta inode number */ |
79 | +/* 0x6C */ uint8_t uuid[F2FS_UUID_SIZE]; /* 128-bit uuid for volume */ |
80 | +/* 0x7C */ uint16_t volume_name[F2FS_LABEL_SIZE]; /* volume name */ |
81 | +#if 0 |
82 | +/* 0x47C */ uint32_t extension_count; /* # of extensions below */ |
83 | +/* 0x480 */ uint8_t extension_list[64][8]; /* extension array */ |
84 | +#endif |
85 | +} __attribute__((packed)); |
86 | + |
87 | +static int probe_f2fs(blkid_probe pr, const struct blkid_idmag *mag) |
88 | +{ |
89 | + struct f2fs_super_block *sb; |
90 | + uint16_t major, minor; |
91 | + |
92 | + sb = blkid_probe_get_sb(pr, mag, struct f2fs_super_block); |
93 | + if (!sb) |
94 | + return -1; |
95 | + |
96 | + major = le16_to_cpu(sb->major_ver); |
97 | + minor = le16_to_cpu(sb->minor_ver); |
98 | + |
99 | + /* For version 1.0 we cannot know the correct sb structure */ |
100 | + if (major == 1 && minor == 0) |
101 | + return 0; |
102 | + |
103 | + if (*((unsigned char *) sb->volume_name)) |
104 | + blkid_probe_set_utf8label(pr, (unsigned char *) sb->volume_name, |
105 | + sizeof(sb->volume_name), |
106 | + BLKID_ENC_UTF16LE); |
107 | + |
108 | + blkid_probe_set_uuid(pr, sb->uuid); |
109 | + blkid_probe_sprintf_version(pr, "%u.%u", major, minor); |
110 | + return 0; |
111 | +} |
112 | + |
113 | +const struct blkid_idinfo f2fs_idinfo = |
114 | +{ |
115 | + .name = "f2fs", |
116 | + .usage = BLKID_USAGE_FILESYSTEM, |
117 | + .probefunc = probe_f2fs, |
118 | + .magics = |
119 | + { |
120 | + { |
121 | + .magic = F2FS_MAGIC, |
122 | + .len = 4, |
123 | + .kboff = F2FS_SB1_KBOFF, |
124 | + .sboff = F2FS_MAGIC_OFF |
125 | + }, |
126 | + { NULL } |
127 | + } |
128 | +}; |
129 | diff --git a/libblkid/src/superblocks/superblocks.c b/libblkid/src/superblocks/superblocks.c |
130 | index 2929a5f..62aa662 100644 |
131 | --- a/libblkid/src/superblocks/superblocks.c |
132 | +++ b/libblkid/src/superblocks/superblocks.c |
133 | @@ -140,7 +140,8 @@ static const struct blkid_idinfo *idinfos[] = |
134 | &vmfs_fs_idinfo, |
135 | &befs_idinfo, |
136 | &nilfs2_idinfo, |
137 | - &exfat_idinfo |
138 | + &exfat_idinfo, |
139 | + &f2fs_idinfo |
140 | }; |
141 | |
142 | /* |
143 | diff --git a/libblkid/src/superblocks/superblocks.h b/libblkid/src/superblocks/superblocks.h |
144 | index 08f1438..887732a 100644 |
145 | --- a/libblkid/src/superblocks/superblocks.h |
146 | +++ b/libblkid/src/superblocks/superblocks.h |
147 | @@ -69,6 +69,7 @@ extern const struct blkid_idinfo drbdproxy_datalog_idinfo; |
148 | extern const struct blkid_idinfo befs_idinfo; |
149 | extern const struct blkid_idinfo nilfs2_idinfo; |
150 | extern const struct blkid_idinfo exfat_idinfo; |
151 | +extern const struct blkid_idinfo f2fs_idinfo; |
152 | |
153 | /* |
154 | * superblock functions |
155 | -- |
156 | cgit v0.9.1 |