summaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/genext2fs/genext2fs-1.4.1/0012-Add-rev-1-support-large-file-support-and-rework-hole.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-devtools/genext2fs/genext2fs-1.4.1/0012-Add-rev-1-support-large-file-support-and-rework-hole.patch')
-rw-r--r--meta/recipes-devtools/genext2fs/genext2fs-1.4.1/0012-Add-rev-1-support-large-file-support-and-rework-hole.patch211
1 files changed, 211 insertions, 0 deletions
diff --git a/meta/recipes-devtools/genext2fs/genext2fs-1.4.1/0012-Add-rev-1-support-large-file-support-and-rework-hole.patch b/meta/recipes-devtools/genext2fs/genext2fs-1.4.1/0012-Add-rev-1-support-large-file-support-and-rework-hole.patch
new file mode 100644
index 0000000000..2de6608c0c
--- /dev/null
+++ b/meta/recipes-devtools/genext2fs/genext2fs-1.4.1/0012-Add-rev-1-support-large-file-support-and-rework-hole.patch
@@ -0,0 +1,211 @@
1Upstream-Status: inappropriate
2
3From fbcbbba3b65402bd43a9e36593d544ff3451620e Mon Sep 17 00:00:00 2001
4From: Corey Minyard <cminyard@mvista.com>
5Date: Fri, 3 Jun 2011 21:09:25 -0500
6Subject: [PATCH 12/19] Add rev 1 support, large file support, and rework holes
7
8Add support for individual files larger than 2GB, which requires some
9rev 1 filesystem support.
10
11Also, since we have a non-overly filesystem structure, rework the
12OP_HOLES hack and just put that flag in the filesystem structure.
13This avoid having to mess around with the reserved bytes (which
14changed with rev 1 support).
15---
16 genext2fs.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++-----------
17 1 files changed, 56 insertions(+), 13 deletions(-)
18
19diff --git a/genext2fs.c b/genext2fs.c
20index 8a7f589..e420bba 100644
21--- a/genext2fs.c
22+++ b/genext2fs.c
23@@ -233,10 +233,6 @@ struct stats {
24 #define FM_IWOTH 0000002 // write
25 #define FM_IXOTH 0000001 // execute
26
27-// options
28-
29-#define OP_HOLES 0x01 // make files with holes
30-
31 /* Defines for accessing group details */
32
33 // Number of groups in the filesystem
34@@ -485,7 +481,22 @@ is_blk_empty(uint8 *b)
35 udecl32(s_creator_os) /* Indicator of which OS created the filesystem */ \
36 udecl32(s_rev_level) /* The revision level of the filesystem */ \
37 udecl16(s_def_resuid) /* The default uid for reserved blocks */ \
38- udecl16(s_def_resgid) /* The default gid for reserved blocks */
39+ udecl16(s_def_resgid) /* The default gid for reserved blocks */ \
40+ /* rev 1 version fields start here */ \
41+ udecl32(s_first_ino) /* First non-reserved inode */ \
42+ udecl16(s_inode_size) /* size of inode structure */ \
43+ udecl16(s_block_group_nr) /* block group # of this superblock */ \
44+ udecl32(s_feature_compat) /* compatible feature set */ \
45+ udecl32(s_feature_incompat) /* incompatible feature set */ \
46+ udecl32(s_feature_ro_compat) /* readonly-compatible feature set */ \
47+ utdecl8(s_uuid,16) /* 128-bit uuid for volume */ \
48+ utdecl8(s_volume_name,16) /* volume name */ \
49+ utdecl8(s_last_mounted,64) /* directory where last mounted */ \
50+ udecl32(s_algorithm_usage_bitmap) /* For compression */
51+
52+#define EXT2_GOOD_OLD_FIRST_INO 11
53+#define EXT2_GOOD_OLD_INODE_SIZE 128
54+#define EXT2_FEATURE_RO_COMPAT_LARGE_FILE 0x0002
55
56 #define groupdescriptor_decl \
57 udecl32(bg_block_bitmap) /* Block number of the block bitmap */ \
58@@ -525,6 +536,7 @@ is_blk_empty(uint8 *b)
59
60 #define decl8(x) int8 x;
61 #define udecl8(x) uint8 x;
62+#define utdecl8(x,n) uint8 x[n];
63 #define decl16(x) int16 x;
64 #define udecl16(x) uint16 x;
65 #define decl32(x) int32 x;
66@@ -534,7 +546,7 @@ is_blk_empty(uint8 *b)
67 typedef struct
68 {
69 superblock_decl
70- uint32 s_reserved[235]; // Reserved
71+ uint32 s_reserved[205]; // Reserved
72 } superblock;
73
74 typedef struct
75@@ -616,6 +628,8 @@ typedef struct
76 int32 hdlink_cnt;
77 struct hdlinks_s hdlinks;
78
79+ int holes;
80+
81 listcache blks;
82 listcache inodes;
83 listcache blkmaps;
84@@ -628,6 +642,7 @@ typedef struct
85
86 #undef decl8
87 #undef udecl8
88+#undef utdecl8
89 #undef decl16
90 #undef udecl16
91 #undef decl32
92@@ -636,6 +651,7 @@ typedef struct
93
94 #define decl8(x)
95 #define udecl8(x)
96+#define utdecl8(x,n)
97 #define decl16(x) this->x = swab16(this->x);
98 #define udecl16(x) this->x = swab16(this->x);
99 #define decl32(x) this->x = swab32(this->x);
100@@ -700,6 +716,7 @@ swap_block(block b)
101
102 #undef decl8
103 #undef udecl8
104+#undef utdecl8
105 #undef decl16
106 #undef udecl16
107 #undef decl32
108@@ -1695,7 +1712,7 @@ extend_inode_blk(filesystem *fs, inode_pos *ipos, block b, int amount)
109
110 for (pos = 0; amount; pos += BLOCKSIZE)
111 {
112- int hole = ((fs->sb->s_reserved[200] & OP_HOLES) && is_blk_empty(b + pos));
113+ int hole = (fs->holes && is_blk_empty(b + pos));
114
115 bk = walk_bw(fs, ipos->nod, &ipos->bw, &amount, hole);
116 if (bk == WALK_END)
117@@ -1912,6 +1929,14 @@ mklink_fs(filesystem *fs, uint32 parent_nod, const char *name, size_t size, uint
118 return nod;
119 }
120
121+static void
122+fs_upgrade_rev1_largefile(filesystem *fs)
123+{
124+ fs->sb->s_rev_level = 1;
125+ fs->sb->s_first_ino = EXT2_GOOD_OLD_FIRST_INO;
126+ fs->sb->s_inode_size = EXT2_GOOD_OLD_INODE_SIZE;
127+}
128+
129 #define COPY_BLOCKS 16
130 #define CB_SIZE (COPY_BLOCKS * BLOCKSIZE)
131
132@@ -1926,11 +1951,16 @@ mkfile_fs(filesystem *fs, uint32 parent_nod, const char *name, uint32 mode, off_
133 size_t readbytes;
134 inode_pos ipos;
135
136-
137 b = malloc(CB_SIZE);
138 if (!b)
139 error_msg_and_die("mkfile_fs: out of memory");
140 inode_pos_init(fs, &ipos, nod, INODE_POS_TRUNCATE, NULL);
141+ if (size > 0x7fffffff) {
142+ if (fs->sb->s_rev_level < 1)
143+ fs_upgrade_rev1_largefile(fs);
144+ fs->sb->s_feature_ro_compat |= EXT2_FEATURE_RO_COMPAT_LARGE_FILE;
145+ }
146+ node->i_dir_acl = size >> 32;
147 node->i_size = size;
148 while (size) {
149 readbytes = fread(b, 1, CB_SIZE, f);
150@@ -2269,6 +2299,8 @@ swap_gds(filesystem *fs)
151
152 // Copy size blocks from src to dst, putting holes in the output
153 // file (if possible) if the input block is all zeros.
154+// Copy size blocks from src to dst, putting holes in the output
155+// file (if possible) if the input block is all zeros.
156 static void
157 copy_file(filesystem *fs, FILE *dst, FILE *src, size_t size)
158 {
159@@ -2284,7 +2316,7 @@ copy_file(filesystem *fs, FILE *dst, FILE *src, size_t size)
160 while (size > 0) {
161 if (fread(b, BLOCKSIZE, 1, src) != 1)
162 perror_msg_and_die("copy failed on read");
163- if ((dst != stdout) && is_blk_empty(b)) {
164+ if ((dst != stdout) && fs->holes && is_blk_empty(b)) {
165 /* Empty block, just skip it */
166 if (fseek(dst, BLOCKSIZE, SEEK_CUR))
167 perror_msg_and_die("fseek");
168@@ -2537,8 +2569,7 @@ init_fs(int nbblocks, int nbinodes, int nbresrvd, int holes,
169 fs->sb->s_max_mnt_count = 20;
170
171 // options for me
172- if(holes)
173- fs->sb->s_reserved[200] |= OP_HOLES;
174+ fs->holes = holes;
175
176 return fs;
177 }
178@@ -2571,8 +2602,21 @@ load_fs(FILE * fh, int swapit, char *fname)
179 perror_msg_and_die("fread filesystem image superblock");
180 if(swapit)
181 swap_sb(fs->sb);
182- if(fs->sb->s_rev_level || (fs->sb->s_magic != EXT2_MAGIC_NUMBER))
183+ if((fs->sb->s_rev_level > 1) || (fs->sb->s_magic != EXT2_MAGIC_NUMBER))
184 error_msg_and_die("not a suitable ext2 filesystem");
185+ if (fs->sb->s_rev_level > 0) {
186+ if (fs->sb->s_first_ino != EXT2_GOOD_OLD_FIRST_INO)
187+ error_msg_and_die("First inode incompatible");
188+ if (fs->sb->s_inode_size != EXT2_GOOD_OLD_INODE_SIZE)
189+ error_msg_and_die("inode size incompatible");
190+ if (fs->sb->s_feature_compat)
191+ error_msg_and_die("Unsupported compat features");
192+ if (fs->sb->s_feature_incompat)
193+ error_msg_and_die("Unsupported incompat features");
194+ if (fs->sb->s_feature_ro_compat
195+ & ~EXT2_FEATURE_RO_COMPAT_LARGE_FILE)
196+ error_msg_and_die("Unsupported ro compat features");
197+ }
198 fs->nheadblocks = (((GRP_NBGROUPS(fs) * sizeof(groupdescriptor))
199 + sizeof(superblock) + (BLOCKSIZE - 1))
200 / BLOCKSIZE);
201@@ -2893,7 +2937,6 @@ finish_fs(filesystem *fs)
202 error_msg_and_die("entry mismatch on blockmap cache flush");
203 if (cache_flush(&fs->blks))
204 error_msg_and_die("entry mismatch on block cache flush");
205- fs->sb->s_reserved[200] = 0;
206 if(fs->swapit) {
207 swap_sb(fs->sb);
208 swap_gds(fs);
209--
2101.7.4.1
211