upgpkg: 0.97-15
This commit is contained in:
parent
434214e44e
commit
43572b9b5c
12
PKGBUILD
12
PKGBUILD
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
pkgname=grub
|
pkgname=grub
|
||||||
pkgver=0.97
|
pkgver=0.97
|
||||||
pkgrel=14
|
pkgrel=15
|
||||||
pkgdesc="A GNU multiboot boot loader"
|
pkgdesc="A GNU multiboot boot loader"
|
||||||
arch=('i686' 'x86_64')
|
arch=('i686' 'x86_64')
|
||||||
license=('GPL')
|
license=('GPL')
|
||||||
@ -18,7 +18,8 @@ source=(ftp://alpha.gnu.org/gnu/grub/grub-$pkgver.tar.gz
|
|||||||
special-devices.patch
|
special-devices.patch
|
||||||
more-raid.patch
|
more-raid.patch
|
||||||
intelmac.patch
|
intelmac.patch
|
||||||
grub-inode-size.patch)
|
grub-inode-size.patch
|
||||||
|
ext4.patch)
|
||||||
backup=('boot/grub/menu.lst')
|
backup=('boot/grub/menu.lst')
|
||||||
install=grub.install
|
install=grub.install
|
||||||
md5sums=('cd3f3eb54446be6003156158d51f4884'
|
md5sums=('cd3f3eb54446be6003156158d51f4884'
|
||||||
@ -30,7 +31,8 @@ md5sums=('cd3f3eb54446be6003156158d51f4884'
|
|||||||
'49f6d4bcced0bc8bbcff273f3254bbfa'
|
'49f6d4bcced0bc8bbcff273f3254bbfa'
|
||||||
'f41f702014a064918d7afc6fc23baa6e'
|
'f41f702014a064918d7afc6fc23baa6e'
|
||||||
'175dc6b9f4ab94e8056c3afb3e34460a'
|
'175dc6b9f4ab94e8056c3afb3e34460a'
|
||||||
'ada26cbc681907823cc4ff2a55b97866')
|
'ada26cbc681907823cc4ff2a55b97866'
|
||||||
|
'39e0f9a05b7e04aceb24fc7bc4893e3d')
|
||||||
|
|
||||||
build() {
|
build() {
|
||||||
cd $srcdir/$pkgname-$pkgver
|
cd $srcdir/$pkgname-$pkgver
|
||||||
@ -38,7 +40,6 @@ build() {
|
|||||||
#set destination architecture here
|
#set destination architecture here
|
||||||
DESTARCH="i686"
|
DESTARCH="i686"
|
||||||
#DESTARCH="x86_64"
|
#DESTARCH="x86_64"
|
||||||
|
|
||||||
# optimizations break the build -- disable them
|
# optimizations break the build -- disable them
|
||||||
# adding special devices to grub, patches are from fedora
|
# adding special devices to grub, patches are from fedora
|
||||||
patch -Np1 -i ../special-devices.patch || return 1
|
patch -Np1 -i ../special-devices.patch || return 1
|
||||||
@ -47,6 +48,9 @@ build() {
|
|||||||
patch -Np1 -i ../intelmac.patch || return 1
|
patch -Np1 -i ../intelmac.patch || return 1
|
||||||
# Add support for bigger inode size to e2fs_stage1_5
|
# Add support for bigger inode size to e2fs_stage1_5
|
||||||
patch -Np1 -i ../grub-inode-size.patch || return 1
|
patch -Np1 -i ../grub-inode-size.patch || return 1
|
||||||
|
# Add ext4 support
|
||||||
|
# http://www.mail-archive.com/bug-grub@gnu.org/msg11458.html
|
||||||
|
patch -Np1 -i ../ext4.patch || return 1
|
||||||
|
|
||||||
#arch64 fixes for static build
|
#arch64 fixes for static build
|
||||||
if [ "$CARCH" = "x86_64" ]; then
|
if [ "$CARCH" = "x86_64" ]; then
|
||||||
|
263
ext4.patch
Normal file
263
ext4.patch
Normal file
@ -0,0 +1,263 @@
|
|||||||
|
diff -ruNp grub-0.97/stage2/fsys_ext2fs.c grub-0.97-patch/stage2/fsys_ext2fs.c
|
||||||
|
--- grub-0.97/stage2/fsys_ext2fs.c 2004-08-08 20:19:18.000000000 +0200
|
||||||
|
+++ grub-0.97-patch/stage2/fsys_ext2fs.c 2007-12-29 16:25:19.000000000
|
||||||
|
+0100
|
||||||
|
@@ -51,6 +51,9 @@ typedef unsigned int __u32;
|
||||||
|
#define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1)
|
||||||
|
#define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1)
|
||||||
|
|
||||||
|
+/* Inode flags */
|
||||||
|
+#define EXT4_EXTENTS_FL 0x00080000 /* Inode uses extents */
|
||||||
|
+
|
||||||
|
/* include/linux/ext2_fs.h */
|
||||||
|
struct ext2_super_block
|
||||||
|
{
|
||||||
|
@@ -191,6 +194,42 @@ struct ext2_dir_entry
|
||||||
|
#define EXT2_DIR_REC_LEN(name_len) (((name_len) + 8 + EXT2_DIR_ROUND) & \
|
||||||
|
~EXT2_DIR_ROUND)
|
||||||
|
|
||||||
|
+/* linux/ext4_fs_extents.h */
|
||||||
|
+/*
|
||||||
|
+ * This is the extent on-disk structure.
|
||||||
|
+ * It's used at the bottom of the tree.
|
||||||
|
+ */
|
||||||
|
+struct ext4_extent {
|
||||||
|
+ __u32 ee_block; /* first logical block extent covers */
|
||||||
|
+ __u16 ee_len; /* number of blocks covered by extent */
|
||||||
|
+ __u16 ee_start_hi; /* high 16 bits of physical block */
|
||||||
|
+ __u32 ee_start; /* low 32 bits of physical block */
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * This is index on-disk structure.
|
||||||
|
+ * It's used at all the levels except the bottom.
|
||||||
|
+ */
|
||||||
|
+struct ext4_extent_idx {
|
||||||
|
+ __u32 ei_block; /* index covers logical blocks from 'block' */
|
||||||
|
+ __u32 ei_leaf; /* pointer to the physical block of the next *
|
||||||
|
+ * level. leaf or next index could be there */
|
||||||
|
+ __u16 ei_leaf_hi; /* high 16 bits of physical block */
|
||||||
|
+ __u16 ei_unused;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * Each block (leaves and indexes), even inode-stored has header.
|
||||||
|
+ */
|
||||||
|
+struct ext4_extent_header {
|
||||||
|
+ __u16 eh_magic; /* probably will support different formats */
|
||||||
|
+ __u16 eh_entries; /* number of valid entries */
|
||||||
|
+ __u16 eh_max; /* capacity of store in entries */
|
||||||
|
+ __u16 eh_depth; /* has tree real underlying blocks? */
|
||||||
|
+ __u32 eh_generation; /* generation of the tree */
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+#define EXT4_EXT_MAGIC 0xf30a
|
||||||
|
|
||||||
|
/* ext2/super.c */
|
||||||
|
#define log2(n) ffz(~(n))
|
||||||
|
@@ -279,6 +318,26 @@ ext2_rdfsb (int fsblock, int buffer)
|
||||||
|
EXT2_BLOCK_SIZE (SUPERBLOCK), (char *) buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
+/* Walk through extents index tree to find the good leaf */
|
||||||
|
+static struct ext4_extent_header *
|
||||||
|
+ext4_recurse_extent_index(struct ext4_extent_header *extent_block, int logical_block)
|
||||||
|
+{
|
||||||
|
+ int i;
|
||||||
|
+ struct ext4_extent_idx *index = (struct ext4_extent_idx *) (extent_block + 1);
|
||||||
|
+ if (extent_block->eh_magic != EXT4_EXT_MAGIC)
|
||||||
|
+ return NULL;
|
||||||
|
+ if (extent_block->eh_depth == 0)
|
||||||
|
+ return extent_block;
|
||||||
|
+ for (i = 0; i < extent_block->eh_entries; i++)
|
||||||
|
+ {
|
||||||
|
+ if (logical_block < index[i].ei_block)
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ if (i == 0 || !ext2_rdfsb(index[i-1].ei_leaf, DATABLOCK1))
|
||||||
|
+ return NULL;
|
||||||
|
+ return (ext4_recurse_extent_index((struct ext4_extent_header *) DATABLOCK1, logical_block));
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/* from
|
||||||
|
ext2/inode.c:ext2_bmap()
|
||||||
|
*/
|
||||||
|
--- grub-0.97/stage2/fsys_ext2fs.c~ 2008-12-28 20:19:00.000000000 +0100
|
||||||
|
+++ grub-0.97/stage2/fsys_ext2fs.c 2008-12-28 20:19:00.000000000 +0100
|
||||||
|
@@ -366,83 +366,106 @@
|
||||||
|
}
|
||||||
|
printf ("logical block %d\n", logical_block);
|
||||||
|
#endif /* E2DEBUG */
|
||||||
|
-
|
||||||
|
- /* if it is directly pointed to by the inode, return that physical addr */
|
||||||
|
- if (logical_block < EXT2_NDIR_BLOCKS)
|
||||||
|
- {
|
||||||
|
-#ifdef E2DEBUG
|
||||||
|
- printf ("returning %d\n", (unsigned char *) (INODE->i_block[logical_block]));
|
||||||
|
- printf ("returning %d\n", INODE->i_block[logical_block]);
|
||||||
|
-#endif /* E2DEBUG */
|
||||||
|
- return INODE->i_block[logical_block];
|
||||||
|
- }
|
||||||
|
- /* else */
|
||||||
|
- logical_block -= EXT2_NDIR_BLOCKS;
|
||||||
|
- /* try the indirect block */
|
||||||
|
- if (logical_block < EXT2_ADDR_PER_BLOCK (SUPERBLOCK))
|
||||||
|
+ /* standard ext2 inode */
|
||||||
|
+ if (!(INODE->i_flags & EXT4_EXTENTS_FL))
|
||||||
|
{
|
||||||
|
- if (mapblock1 != 1
|
||||||
|
- && !ext2_rdfsb (INODE->i_block[EXT2_IND_BLOCK], DATABLOCK1))
|
||||||
|
- {
|
||||||
|
- errnum = ERR_FSYS_CORRUPT;
|
||||||
|
- return -1;
|
||||||
|
- }
|
||||||
|
- mapblock1 = 1;
|
||||||
|
- return ((__u32 *) DATABLOCK1)[logical_block];
|
||||||
|
- }
|
||||||
|
- /* else */
|
||||||
|
- logical_block -= EXT2_ADDR_PER_BLOCK (SUPERBLOCK);
|
||||||
|
- /* now try the double indirect block */
|
||||||
|
- if (logical_block < (1 << (EXT2_ADDR_PER_BLOCK_BITS (SUPERBLOCK) * 2)))
|
||||||
|
- {
|
||||||
|
- int bnum;
|
||||||
|
- if (mapblock1 != 2
|
||||||
|
- && !ext2_rdfsb (INODE->i_block[EXT2_DIND_BLOCK], DATABLOCK1))
|
||||||
|
- {
|
||||||
|
- errnum = ERR_FSYS_CORRUPT;
|
||||||
|
- return -1;
|
||||||
|
- }
|
||||||
|
- mapblock1 = 2;
|
||||||
|
- if ((bnum = (((__u32 *) DATABLOCK1)
|
||||||
|
- [logical_block >> EXT2_ADDR_PER_BLOCK_BITS (SUPERBLOCK)]))
|
||||||
|
- != mapblock2
|
||||||
|
- && !ext2_rdfsb (bnum, DATABLOCK2))
|
||||||
|
- {
|
||||||
|
- errnum = ERR_FSYS_CORRUPT;
|
||||||
|
- return -1;
|
||||||
|
- }
|
||||||
|
- mapblock2 = bnum;
|
||||||
|
+ /* if it is directly pointed to by the inode, return that physical addr */
|
||||||
|
+ if (logical_block < EXT2_NDIR_BLOCKS)
|
||||||
|
+ {
|
||||||
|
+#ifdef E2DEBUG
|
||||||
|
+ printf ("returning %d\n", (unsigned char *) (INODE->i_block[logical_block]));
|
||||||
|
+ printf ("returning %d\n", INODE->i_block[logical_block]);
|
||||||
|
+#endif /* E2DEBUG */
|
||||||
|
+ return INODE->i_block[logical_block];
|
||||||
|
+ }
|
||||||
|
+ /* else */
|
||||||
|
+ logical_block -= EXT2_NDIR_BLOCKS;
|
||||||
|
+ /* try the indirect block */
|
||||||
|
+ if (logical_block < EXT2_ADDR_PER_BLOCK (SUPERBLOCK))
|
||||||
|
+ {
|
||||||
|
+ if (mapblock1 != 1
|
||||||
|
+ && !ext2_rdfsb (INODE->i_block[EXT2_IND_BLOCK], DATABLOCK1))
|
||||||
|
+ {
|
||||||
|
+ errnum = ERR_FSYS_CORRUPT;
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+ mapblock1 = 1;
|
||||||
|
+ return ((__u32 *) DATABLOCK1)[logical_block];
|
||||||
|
+ }
|
||||||
|
+ /* else */
|
||||||
|
+ logical_block -= EXT2_ADDR_PER_BLOCK (SUPERBLOCK);
|
||||||
|
+ /* now try the double indirect block */
|
||||||
|
+ if (logical_block < (1 << (EXT2_ADDR_PER_BLOCK_BITS (SUPERBLOCK) * 2)))
|
||||||
|
+ {
|
||||||
|
+ int bnum;
|
||||||
|
+ if (mapblock1 != 2
|
||||||
|
+ && !ext2_rdfsb (INODE->i_block[EXT2_DIND_BLOCK], DATABLOCK1))
|
||||||
|
+ {
|
||||||
|
+ errnum = ERR_FSYS_CORRUPT;
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+ mapblock1 = 2;
|
||||||
|
+ if ((bnum = (((__u32 *) DATABLOCK1)
|
||||||
|
+ [logical_block >> EXT2_ADDR_PER_BLOCK_BITS (SUPERBLOCK)]))
|
||||||
|
+ != mapblock2
|
||||||
|
+ && !ext2_rdfsb (bnum, DATABLOCK2))
|
||||||
|
+ {
|
||||||
|
+ errnum = ERR_FSYS_CORRUPT;
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+ mapblock2 = bnum;
|
||||||
|
+ return ((__u32 *) DATABLOCK2)
|
||||||
|
+ [logical_block & (EXT2_ADDR_PER_BLOCK (SUPERBLOCK) - 1)];
|
||||||
|
+ }
|
||||||
|
+ /* else */
|
||||||
|
+ mapblock2 = -1;
|
||||||
|
+ logical_block -= (1 << (EXT2_ADDR_PER_BLOCK_BITS (SUPERBLOCK) * 2));
|
||||||
|
+ if (mapblock1 != 3
|
||||||
|
+ && !ext2_rdfsb (INODE->i_block[EXT2_TIND_BLOCK], DATABLOCK1))
|
||||||
|
+ {
|
||||||
|
+ errnum = ERR_FSYS_CORRUPT;
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+ mapblock1 = 3;
|
||||||
|
+ if (!ext2_rdfsb (((__u32 *) DATABLOCK1)
|
||||||
|
+ [logical_block >> (EXT2_ADDR_PER_BLOCK_BITS (SUPERBLOCK)
|
||||||
|
+ * 2)],
|
||||||
|
+ DATABLOCK2))
|
||||||
|
+ {
|
||||||
|
+ errnum = ERR_FSYS_CORRUPT;
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+ if (!ext2_rdfsb (((__u32 *) DATABLOCK2)
|
||||||
|
+ [(logical_block >> EXT2_ADDR_PER_BLOCK_BITS (SUPERBLOCK))
|
||||||
|
+ & (EXT2_ADDR_PER_BLOCK (SUPERBLOCK) - 1)],
|
||||||
|
+ DATABLOCK2))
|
||||||
|
+ {
|
||||||
|
+ errnum = ERR_FSYS_CORRUPT;
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
return ((__u32 *) DATABLOCK2)
|
||||||
|
- [logical_block & (EXT2_ADDR_PER_BLOCK (SUPERBLOCK) - 1)];
|
||||||
|
- }
|
||||||
|
- /* else */
|
||||||
|
- mapblock2 = -1;
|
||||||
|
- logical_block -= (1 << (EXT2_ADDR_PER_BLOCK_BITS (SUPERBLOCK) * 2));
|
||||||
|
- if (mapblock1 != 3
|
||||||
|
- && !ext2_rdfsb (INODE->i_block[EXT2_TIND_BLOCK], DATABLOCK1))
|
||||||
|
- {
|
||||||
|
- errnum = ERR_FSYS_CORRUPT;
|
||||||
|
- return -1;
|
||||||
|
+ [logical_block & (EXT2_ADDR_PER_BLOCK (SUPERBLOCK) - 1)];
|
||||||
|
}
|
||||||
|
- mapblock1 = 3;
|
||||||
|
- if (!ext2_rdfsb (((__u32 *) DATABLOCK1)
|
||||||
|
- [logical_block >> (EXT2_ADDR_PER_BLOCK_BITS (SUPERBLOCK)
|
||||||
|
- * 2)],
|
||||||
|
- DATABLOCK2))
|
||||||
|
- {
|
||||||
|
- errnum = ERR_FSYS_CORRUPT;
|
||||||
|
- return -1;
|
||||||
|
- }
|
||||||
|
- if (!ext2_rdfsb (((__u32 *) DATABLOCK2)
|
||||||
|
- [(logical_block >> EXT2_ADDR_PER_BLOCK_BITS (SUPERBLOCK))
|
||||||
|
- & (EXT2_ADDR_PER_BLOCK (SUPERBLOCK) - 1)],
|
||||||
|
- DATABLOCK2))
|
||||||
|
+ /* inode is in extents format */
|
||||||
|
+ else
|
||||||
|
{
|
||||||
|
+ int i;
|
||||||
|
+ struct ext4_extent_header *extent_hdr = ext4_recurse_extent_index((struct ext4_extent_header *) INODE->i_block, logical_block);
|
||||||
|
+ struct ext4_extent *extent = (struct ext4_extent *) (extent_hdr + 1);
|
||||||
|
+ if ( extent_hdr == NULL || extent_hdr->eh_magic != EXT4_EXT_MAGIC)
|
||||||
|
+ {
|
||||||
|
+ errnum = ERR_FSYS_CORRUPT;
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+ for (i = 0; i<extent_hdr->eh_entries; i++)
|
||||||
|
+ {
|
||||||
|
+ if (extent[i].ee_block <= logical_block && logical_block < extent[i].ee_block + extent[i].ee_len && !(extent[i].ee_len>>15))
|
||||||
|
+ return (logical_block - extent[i].ee_block + extent[i].ee_start);
|
||||||
|
+ }
|
||||||
|
+ /* We should not arrive here */
|
||||||
|
errnum = ERR_FSYS_CORRUPT;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
- return ((__u32 *) DATABLOCK2)
|
||||||
|
- [logical_block & (EXT2_ADDR_PER_BLOCK (SUPERBLOCK) - 1)];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* preconditions: all preconds of ext2fs_block_map */
|
Loading…
Reference in New Issue
Block a user