aboutsummaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/genext2fs/genext2fs-1.4.1/0009-Move-byte-swapping-into-the-get-put-routines.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-devtools/genext2fs/genext2fs-1.4.1/0009-Move-byte-swapping-into-the-get-put-routines.patch')
-rw-r--r--meta/recipes-devtools/genext2fs/genext2fs-1.4.1/0009-Move-byte-swapping-into-the-get-put-routines.patch421
1 files changed, 0 insertions, 421 deletions
diff --git a/meta/recipes-devtools/genext2fs/genext2fs-1.4.1/0009-Move-byte-swapping-into-the-get-put-routines.patch b/meta/recipes-devtools/genext2fs/genext2fs-1.4.1/0009-Move-byte-swapping-into-the-get-put-routines.patch
deleted file mode 100644
index 028fbb6b28..0000000000
--- a/meta/recipes-devtools/genext2fs/genext2fs-1.4.1/0009-Move-byte-swapping-into-the-get-put-routines.patch
+++ /dev/null
@@ -1,421 +0,0 @@
-Upstream-Status: inappropriate
-
-From 46d57a42a2185970807971f4d6d8f62b4facbaf5 Mon Sep 17 00:00:00 2001
-From: Corey Minyard <cminyard@mvista.com>
-Date: Sun, 5 Jun 2011 15:00:15 -0500
-Subject: [PATCH 09/19] Move byte swapping into the get/put routines.
-
-Remove the full byte-swapping of the filesystem at start/end time, and
-instead byteswap each inode/block map/directory as it is read and written.
-This is getting ready for the change of not holding the entire filesystem
-in memory.
----
- genext2fs.c | 234 +++++++++++++---------------------------------------------
- 1 files changed, 53 insertions(+), 181 deletions(-)
-
-diff --git a/genext2fs.c b/genext2fs.c
-index 497c9af..51403a2 100644
---- a/genext2fs.c
-+++ b/genext2fs.c
-@@ -604,6 +604,7 @@ typedef struct
- superblock *sb;
- groupdescriptor *gd;
- uint32 nheadblocks;
-+ int swapit;
- int32 hdlink_cnt;
- struct hdlinks_s hdlinks;
- } filesystem;
-@@ -648,9 +649,24 @@ swap_gd(groupdescriptor *gd)
- static void
- swap_nod(inode *nod)
- {
-+ uint32 nblk;
-+
- #define this nod
- inode_decl
- #undef this
-+
-+ // block and character inodes store the major and minor in the
-+ // i_block, so we need to unswap to get those. Also, if it's
-+ // zero iblocks, put the data back like it belongs.
-+ nblk = nod->i_blocks / INOBLK;
-+ if ((nod->i_size && !nblk)
-+ || ((nod->i_mode & FM_IFBLK) == FM_IFBLK)
-+ || ((nod->i_mode & FM_IFCHR) == FM_IFCHR))
-+ {
-+ int i;
-+ for(i = 0; i <= EXT2_TIND_BLOCK; i++)
-+ nod->i_block[i] = swab32(nod->i_block[i]);
-+ }
- }
-
- static void
-@@ -852,6 +868,8 @@ put_blk(blk_info *bi)
- // owned by the user.
- typedef struct
- {
-+ filesystem *fs;
-+ uint8 *b;
- blk_info *bi;
- } blkmap_info;
-
-@@ -861,19 +879,23 @@ static inline uint32 *
- get_blkmap(filesystem *fs, uint32 blk, blkmap_info **rbmi)
- {
- blkmap_info *bmi;
-- uint8 *b;
-
- bmi = malloc(sizeof(*bmi));
- if (!bmi)
- error_msg_and_die("get_blkmap: out of memory");
-- b = get_blk(fs, blk, &bmi->bi);
-+ bmi->fs = fs;
-+ bmi->b = get_blk(fs, blk, &bmi->bi);
-+ if (bmi->fs->swapit)
-+ swap_block(bmi->b);
- *rbmi = bmi;
-- return (uint32 *) b;
-+ return (uint32 *) bmi->b;
- }
-
- static inline void
- put_blkmap(blkmap_info *bmi)
- {
-+ if (bmi->fs->swapit)
-+ swap_block(bmi->b);
- put_blk(bmi->bi);
- free(bmi);
- }
-@@ -882,7 +904,9 @@ put_blkmap(blkmap_info *bmi)
- // by the user.
- typedef struct
- {
-+ filesystem *fs;
- blk_info *bi;
-+ inode *itab;
- } nod_info;
-
- // Return a given inode from a filesystem. Make sure to call put_nod()
-@@ -891,8 +915,8 @@ static inline inode *
- get_nod(filesystem *fs, uint32 nod, nod_info **rni)
- {
- int grp, offset, boffset;
-- inode *itab;
- nod_info *ni;
-+ uint8 *b;
-
- offset = GRP_IBM_OFFSET(fs,nod) - 1;
- boffset = offset / (BLOCKSIZE / sizeof(inode));
-@@ -901,14 +925,20 @@ get_nod(filesystem *fs, uint32 nod, nod_info **rni)
- ni = malloc(sizeof(*ni));
- if (!ni)
- error_msg_and_die("get_nod: out of memory");
-- itab = (inode *)get_blk(fs, fs->gd[grp].bg_inode_table + boffset, &ni->bi);
-+ ni->fs = fs;
-+ b = get_blk(fs, fs->gd[grp].bg_inode_table + boffset, &ni->bi);
-+ ni->itab = ((inode *) b) + offset;
-+ if (fs->swapit)
-+ swap_nod(ni->itab);
- *rni = ni;
-- return itab+offset;
-+ return ni->itab;
- }
-
- static inline void
- put_nod(nod_info *ni)
- {
-+ if (ni->fs->swapit)
-+ swap_nod(ni->itab);
- put_blk(ni->bi);
- free(ni);
- }
-@@ -936,6 +966,8 @@ get_dir(filesystem *fs, uint32 nod, dirwalker *dw)
- dw->last_d = (directory *) dw->b;
-
- memcpy(&dw->d, dw->last_d, sizeof(directory));
-+ if (fs->swapit)
-+ swap_dir(&dw->d);
- return &dw->d;
- }
-
-@@ -945,6 +977,8 @@ next_dir(dirwalker *dw)
- {
- directory *next_d = (directory *)((int8*)dw->last_d + dw->d.d_rec_len);
-
-+ if (dw->fs->swapit)
-+ swap_dir(&dw->d);
- memcpy(dw->last_d, &dw->d, sizeof(directory));
-
- if (((int8 *) next_d) >= ((int8 *) dw->b + BLOCKSIZE))
-@@ -952,6 +986,8 @@ next_dir(dirwalker *dw)
-
- dw->last_d = next_d;
- memcpy(&dw->d, next_d, sizeof(directory));
-+ if (dw->fs->swapit)
-+ swap_dir(&dw->d);
- return &dw->d;
- }
-
-@@ -959,6 +995,8 @@ next_dir(dirwalker *dw)
- static inline void
- put_dir(dirwalker *dw)
- {
-+ if (dw->fs->swapit)
-+ swap_dir(&dw->d);
- memcpy(dw->last_d, &dw->d, sizeof(directory));
-
- if (dw->nod == 0)
-@@ -998,6 +1036,8 @@ shrink_dir(dirwalker *dw, uint32 nod, const char *name, int nlen)
- d->d_rec_len = sizeof(directory) + rndup(d->d_name_len, 4);
- preclen = d->d_rec_len;
- reclen -= preclen;
-+ if (dw->fs->swapit)
-+ swap_dir(&dw->d);
- memcpy(dw->last_d, &dw->d, sizeof(directory));
-
- dw->last_d = (directory *) (((int8 *) dw->last_d) + preclen);
-@@ -2050,159 +2090,12 @@ add2fs_from_dir(filesystem *fs, uint32 this_nod, int squash_uids, int squash_per
- closedir(dh);
- }
-
--// endianness swap of x-indirect blocks
--static void
--swap_goodblocks(filesystem *fs, inode *nod)
--{
-- uint32 i,j;
-- int done=0;
-- uint32 *b,*b2;
-- blk_info *bi, *bi2, *bi3;
--
-- uint32 nblk = nod->i_blocks / INOBLK;
-- if((nod->i_size && !nblk) || ((nod->i_mode & FM_IFBLK) == FM_IFBLK) || ((nod->i_mode & FM_IFCHR) == FM_IFCHR))
-- for(i = 0; i <= EXT2_TIND_BLOCK; i++)
-- nod->i_block[i] = swab32(nod->i_block[i]);
-- if(nblk <= EXT2_IND_BLOCK)
-- return;
-- swap_block(get_blk(fs, nod->i_block[EXT2_IND_BLOCK], &bi));
-- put_blk(bi);
-- if(nblk <= EXT2_DIND_BLOCK + BLOCKSIZE/4)
-- return;
-- /* Currently this will fail b'cos the number of blocks as stored
-- in i_blocks also includes the indirection blocks (see
-- walk_bw). But this function assumes that i_blocks only
-- stores the count of data blocks ( Actually according to
-- "Understanding the Linux Kernel" (Table 17-3 p502 1st Ed)
-- i_blocks IS supposed to store the count of data blocks). so
-- with a file of size 268K nblk would be 269.The above check
-- will be false even though double indirection hasn't been
-- started.This is benign as 0 means block 0 which has been
-- zeroed out and therefore points back to itself from any offset
-- */
-- // FIXME: I have fixed that, but I have the feeling the rest of
-- // ths function needs to be fixed for the same reasons - Xav
-- assert(nod->i_block[EXT2_DIND_BLOCK] != 0);
-- for(i = 0; i < BLOCKSIZE/4; i++)
-- if(nblk > EXT2_IND_BLOCK + BLOCKSIZE/4 + (BLOCKSIZE/4)*i ) {
-- swap_block(get_blk(fs, ((uint32*)get_blk(fs, nod->i_block[EXT2_DIND_BLOCK], &bi))[i], &bi2));
-- put_blk(bi);
-- put_blk(bi2);
-- }
-- swap_block(get_blk(fs, nod->i_block[EXT2_DIND_BLOCK], &bi));
-- put_blk(bi);
-- if(nblk <= EXT2_IND_BLOCK + BLOCKSIZE/4 + BLOCKSIZE/4 * BLOCKSIZE/4)
-- return;
-- /* Adding support for triple indirection */
-- b = (uint32*)get_blk(fs,nod->i_block[EXT2_TIND_BLOCK], &bi);
-- for(i=0;i < BLOCKSIZE/4 && !done ; i++) {
-- b2 = (uint32*)get_blk(fs,b[i], &bi2);
-- for(j=0; j<BLOCKSIZE/4;j++) {
-- if (nblk > ( EXT2_IND_BLOCK + BLOCKSIZE/4 +
-- (BLOCKSIZE/4)*(BLOCKSIZE/4) +
-- i*(BLOCKSIZE/4)*(BLOCKSIZE/4) +
-- j*(BLOCKSIZE/4)) ) {
-- swap_block(get_blk(fs,b2[j],&bi3));
-- put_blk(bi3);
-- }
-- else {
-- done = 1;
-- break;
-- }
-- }
-- swap_block((uint8 *)b2);
-- put_blk(bi2);
-- }
-- swap_block((uint8 *)b);
-- put_blk(bi);
-- return;
--}
--
--static void
--swap_badblocks(filesystem *fs, inode *nod)
--{
-- uint32 i,j;
-- int done=0;
-- uint32 *b,*b2;
-- blk_info *bi, *bi2, *bi3;
--
-- uint32 nblk = nod->i_blocks / INOBLK;
-- if((nod->i_size && !nblk) || ((nod->i_mode & FM_IFBLK) == FM_IFBLK) || ((nod->i_mode & FM_IFCHR) == FM_IFCHR))
-- for(i = 0; i <= EXT2_TIND_BLOCK; i++)
-- nod->i_block[i] = swab32(nod->i_block[i]);
-- if(nblk <= EXT2_IND_BLOCK)
-- return;
-- swap_block(get_blk(fs, nod->i_block[EXT2_IND_BLOCK], &bi));
-- put_blk(bi);
-- if(nblk <= EXT2_DIND_BLOCK + BLOCKSIZE/4)
-- return;
-- /* See comment in swap_goodblocks */
-- assert(nod->i_block[EXT2_DIND_BLOCK] != 0);
-- swap_block(get_blk(fs, nod->i_block[EXT2_DIND_BLOCK], &bi));
-- put_blk(bi);
-- for(i = 0; i < BLOCKSIZE/4; i++)
-- if(nblk > EXT2_IND_BLOCK + BLOCKSIZE/4 + (BLOCKSIZE/4)*i ) {
-- swap_block(get_blk(fs, ((uint32*)get_blk(fs, nod->i_block[EXT2_DIND_BLOCK],&bi))[i], &bi2));
-- put_blk(bi);
-- put_blk(bi2);
-- }
-- if(nblk <= EXT2_IND_BLOCK + BLOCKSIZE/4 + BLOCKSIZE/4 * BLOCKSIZE/4)
-- return;
-- /* Adding support for triple indirection */
-- b = (uint32*)get_blk(fs,nod->i_block[EXT2_TIND_BLOCK],&bi);
-- swap_block((uint8 *)b);
-- for(i=0;i < BLOCKSIZE/4 && !done ; i++) {
-- b2 = (uint32*)get_blk(fs,b[i],&bi2);
-- swap_block((uint8 *)b2);
-- for(j=0; j<BLOCKSIZE/4;j++) {
-- if (nblk > ( EXT2_IND_BLOCK + BLOCKSIZE/4 +
-- (BLOCKSIZE/4)*(BLOCKSIZE/4) +
-- i*(BLOCKSIZE/4)*(BLOCKSIZE/4) +
-- j*(BLOCKSIZE/4)) ) {
-- swap_block(get_blk(fs,b2[j],&bi3));
-- put_blk(bi3);
-- }
-- else {
-- done = 1;
-- break;
-- }
-- }
-- put_blk(bi2);
-- }
-- put_blk(bi);
-- return;
--}
--
- // endianness swap of the whole filesystem
- static void
- swap_goodfs(filesystem *fs)
- {
- uint32 i;
-- nod_info *ni;
-
-- for(i = 1; i < fs->sb->s_inodes_count; i++)
-- {
-- inode *nod = get_nod(fs, i, &ni);
-- if(nod->i_mode & FM_IFDIR)
-- {
-- blockwalker bw;
-- uint32 bk;
-- init_bw(&bw);
-- while((bk = walk_bw(fs, i, &bw, 0, 0)) != WALK_END)
-- {
-- directory *d;
-- uint8 *b;
-- blk_info *bi;
-- b = get_blk(fs, bk, &bi);
-- for(d = (directory*)b; (int8*)d + sizeof(*d) < (int8*)b + BLOCKSIZE; d = (directory*)((int8*)d + swab16(d->d_rec_len)))
-- swap_dir(d);
-- put_blk(bi);
-- }
-- }
-- swap_goodblocks(fs, nod);
-- swap_nod(nod);
-- put_nod(ni);
-- }
- for(i=0;i<GRP_NBGROUPS(fs);i++)
- swap_gd(&(fs->gd[i]));
- swap_sb(fs->sb);
-@@ -2215,35 +2108,12 @@ swap_badfs(filesystem *fs)
- swap_sb(fs->sb);
- for(i=0;i<GRP_NBGROUPS(fs);i++)
- swap_gd(&(fs->gd[i]));
-- for(i = 1; i < fs->sb->s_inodes_count; i++)
-- {
-- nod_info *ni;
-- inode *nod = get_nod(fs, i, &ni);
-- swap_nod(nod);
-- swap_badblocks(fs, nod);
-- if(nod->i_mode & FM_IFDIR)
-- {
-- blockwalker bw;
-- uint32 bk;
-- init_bw(&bw);
-- while((bk = walk_bw(fs, i, &bw, 0, 0)) != WALK_END)
-- {
-- directory *d;
-- uint8 *b;
-- blk_info *bi;
-- b = get_blk(fs, bk, &bi);
-- for(d = (directory*)b; (int8*)d + sizeof(*d) < (int8*)b + BLOCKSIZE; d = (directory*)((int8*)d + d->d_rec_len))
-- swap_dir(d);
-- put_blk(bi);
-- }
-- }
-- }
- }
-
- // Allocate a new filesystem structure, allocate internal memory,
- // and initialize the contents.
- static filesystem *
--alloc_fs(uint32 nbblocks)
-+alloc_fs(uint32 nbblocks, int swapit)
- {
- filesystem *fs;
-
-@@ -2251,6 +2121,7 @@ alloc_fs(uint32 nbblocks)
- if (!fs)
- error_msg_and_die("not enough memory for filesystem");
- memset(fs, 0, sizeof(*fs));
-+ fs->swapit = swapit;
- if(!(fs->data = calloc(nbblocks, BLOCKSIZE)))
- error_msg_and_die("not enough memory for filesystem");
- fs->hdlink_cnt = HDLINK_CNT;
-@@ -2265,7 +2136,7 @@ alloc_fs(uint32 nbblocks)
-
- // initialize an empty filesystem
- static filesystem *
--init_fs(int nbblocks, int nbinodes, int nbresrvd, int holes, uint32 fs_timestamp)
-+init_fs(int nbblocks, int nbinodes, int nbresrvd, int holes, uint32 fs_timestamp, int swapit)
- {
- uint32 i;
- filesystem *fs;
-@@ -2313,7 +2184,7 @@ init_fs(int nbblocks, int nbinodes, int nbresrvd, int holes, uint32 fs_timestamp
- free_blocks = nbblocks - overhead_per_group*nbgroups - 1 /*boot block*/;
- free_blocks_per_group = nbblocks_per_group - overhead_per_group;
-
-- fs = alloc_fs(nbblocks);
-+ fs = alloc_fs(nbblocks, swapit);
- fs->nheadblocks = (((nbgroups * sizeof(groupdescriptor))
- + sizeof(superblock) + (BLOCKSIZE - 1))
- / BLOCKSIZE);
-@@ -2454,7 +2325,7 @@ load_fs(FILE * fh, int swapit)
- fssize = (fssize + BLOCKSIZE - 1) / BLOCKSIZE;
- if(fssize < 16) // totally arbitrary
- error_msg_and_die("too small filesystem");
-- fs = alloc_fs(fssize);
-+ fs = alloc_fs(fssize, swapit);
- if(fread(fs->data, BLOCKSIZE, fssize, fh) != fssize)
- perror_msg_and_die("input filesystem image");
-
-@@ -3014,7 +2885,8 @@ main(int argc, char **argv)
- }
- if(fs_timestamp == -1)
- fs_timestamp = time(NULL);
-- fs = init_fs(nbblocks, nbinodes, nbresrvd, holes, fs_timestamp);
-+ fs = init_fs(nbblocks, nbinodes, nbresrvd, holes, fs_timestamp,
-+ bigendian);
- }
-
- populate_fs(fs, dopt, didx, squash_uids, squash_perms, fs_timestamp, NULL);
---
-1.7.4.1
-