Sida 1 av 1

Hjälp med att applicera trasig patch...

Postat: 17 okt 2008, 16:15
av Emil.s
Håller på att försöka få igång Ext4 på min root disk, men för att få det att funka så lär man patcha grub, annars kan man inte kärnan läsas in...

Grub hittar ni här:
ftp://alpha.gnu.org/gnu/grub/grub-0.97.tar.gz

Patchen finns i original här:
http://www.mail-archive.com/bug-grub@gn ... 11458.html

Dock så verkar det som att långa rader har kortats ner... Har försökt att göra något åt det själv, men det funkar inte helt... Min patch finns på:
ftp://sandnabba.se/grub-Ext4-patch

Men när man försöker att patcha så får man:
Hunk #4 FAILED at 307.
1 out of 4 hunks FAILED -- saving rejects to file stage2/fsys_ext2fs.c.rej
stage2/fsys_ext2fs.c.rej:

Kod: Markera allt

root@Sandnabba.se: /usr/src/grub-0.97 #> cat stage2/fsys_ext2fs.c.rej
*************** ext2fs_block_map (int logical_block)
*** 366,471 ****
      }
    printf ("logical block %d\n", logical_block);
  #endif /* E2DEBUG */
-   /* standard ext2 inode */
-   if (!(INODE->i_flags & EXT4_EXTENTS_FL))
      {
-       /* 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)];
      }
-   /* 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;
      }
  }

  /* preconditions: all preconds of ext2fs_block_map */
--- 307,389 ----
      }
    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))
      {
+       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)];
  }

  /* preconditions: all preconds of ext2fs_block_map */
Någon idé om hur man får till det?

Re: Hjälp med att applicera trasig patch...

Postat: 17 okt 2008, 21:18
av Emil.s
Glöm det... Hittade patchen på Mandrivas forum. Hittar inte adressen nu dock...

Re: Hjälp med att applicera trasig patch...

Postat: 17 okt 2008, 23:27
av Xappe
annars kan du väl ha en bootpartition med ett annat filsystem, så borde inte grub ha nåt problem...

Re: Hjälp med att applicera trasig patch...

Postat: 17 okt 2008, 23:32
av Emil.s
Xappe skrev:annars kan du väl ha en bootpartition med ett annat filsystem, så borde inte grub ha nåt problem...
Jo, trodde det jag med. Dock så funkade det ändå inte med denna... Verkara vara något med init systemet (men ubuntu kör ju uppstart?!).
Aja, Ext4 diskussionen fortsätter här:
http://ubuntu-se.org/phpBB3/viewtopic.php?f=55&t=32656