From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1KFAx7-0000Hg-PR for mharc-grub-devel@gnu.org; Sat, 05 Jul 2008 12:49:37 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KFAx5-0000Ex-TL for grub-devel@gnu.org; Sat, 05 Jul 2008 12:49:36 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KFAx5-0000DZ-3O for grub-devel@gnu.org; Sat, 05 Jul 2008 12:49:35 -0400 Received: from [199.232.76.173] (port=46559 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KFAx4-0000DG-RU for grub-devel@gnu.org; Sat, 05 Jul 2008 12:49:34 -0400 Received: from mx20.gnu.org ([199.232.41.8]:22622) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1KFAx3-0003v4-Py for grub-devel@gnu.org; Sat, 05 Jul 2008 12:49:34 -0400 Received: from smtp-vbr9.xs4all.nl ([194.109.24.29]) by mx20.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1KF5OO-0002sZ-H4 for grub-devel@gnu.org; Sat, 05 Jul 2008 06:53:24 -0400 Received: from localhost.localdomain (249-174.surfsnel.dsl.internl.net [145.99.174.249]) by smtp-vbr9.xs4all.nl (8.13.8/8.13.8) with ESMTP id m65ArHfq073998 for ; Sat, 5 Jul 2008 12:53:20 +0200 (CEST) (envelope-from mgerards@xs4all.nl) From: Marco Gerards To: The development of GRUB 2 References: Mail-Copies-To: mgerards@xs4all.nl Date: Sat, 05 Jul 2008 13:01:51 +0200 In-Reply-To: (bean123ch@gmail.com's message of "Sat, 5 Jul 2008 01:59:56 +0800") Message-ID: <87prpsfvc0.fsf@xs4all.nl> User-Agent: Gnus/5.110006 (No Gnus v0.6) Emacs/21.4 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Virus-Scanned: by XS4ALL Virus Scanner X-detected-kernel: by mx20.gnu.org: FreeBSD 4.6-4.9 X-detected-kernel: by monty-python.gnu.org: Linux 2.6, seldom 2.4 (older, 4) Subject: Re: [PATCH] ext4 extent support X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: The development of GRUB 2 List-Id: The development of GRUB 2 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 05 Jul 2008 16:49:36 -0000 Hi Bean, Bean writes: > This patch add support for extents in ext4. This is really great! :D Can you also provide a changelog entry? > diff --git a/fs/ext2.c b/fs/ext2.c > index 22fd272..3518dcf 100644 > --- a/fs/ext2.c > +++ b/fs/ext2.c > @@ -86,6 +86,8 @@ > #define EXT3_JOURNAL_FLAG_DELETED 4 > #define EXT3_JOURNAL_FLAG_LAST_TAG 8 > > +#define EXT4_EXTENTS_FLAG 0x80000 > + > /* The ext2 superblock. */ > struct grub_ext2_sblock > { > @@ -226,6 +228,33 @@ struct grub_ext3_journal_sblock > grub_uint32_t start; > }; > > +#define EXT4_EXT_MAGIC 0xf30a > + > +struct grub_ext4_extent_header > +{ > + grub_uint16_t magic; > + grub_uint16_t entries; > + grub_uint16_t max; > + grub_uint16_t depth; > + grub_uint32_t generation; > +}; > + > +struct grub_ext4_extent > +{ > + grub_uint32_t block; > + grub_uint16_t len; > + grub_uint16_t start_hi; > + grub_uint32_t start; > +}; > + > +struct grub_ext4_extent_idx > +{ > + grub_uint32_t block; > + grub_uint32_t leaf; > + grub_uint16_t leaf_hi; > + grub_uint16_t unused; > +}; > + > struct grub_fshelp_node > { > struct grub_ext2_data *data; > @@ -262,6 +291,46 @@ grub_ext2_blockgroup (struct grub_ext2_data *data, int group, > sizeof (struct grub_ext2_block_group), (char *) blkgrp); > } > > +static struct grub_ext4_extent_header * > +grub_ext4_find_leaf (struct grub_ext2_data *data, > + struct grub_ext4_extent_header *ext_block, > + grub_uint32_t fileblock) > +{ > + char buf[EXT2_BLOCK_SIZE(data)]; > + struct grub_ext4_extent_idx *index; > + > + while (1) > + { > + int i; > + grub_disk_addr_t block; > + > + index = (struct grub_ext4_extent_idx *) (ext_block + 1); > + > + if (grub_le_to_cpu16(ext_block->magic) != EXT4_EXT_MAGIC) > + return 0; > + > + if (ext_block->depth == 0) > + return ext_block; > + > + for (i = 0; i < grub_le_to_cpu16 (ext_block->entries); i++) > + { > + if (fileblock < grub_le_to_cpu32(index[i].block)) > + break; > + } > + > + if (i == 0) > + return 0; > + > + block = grub_le_to_cpu16 (index[i].leaf_hi); > + block = (block << 32) + grub_le_to_cpu32 (index[i].leaf); > + if (grub_disk_read (data->disk, > + block << LOG2_EXT2_BLOCK_SIZE (data), > + 0, sizeof (buf), buf)) > + return 0; > + > + ext_block = (struct grub_ext4_extent_header *) buf; > + } > +} > > static grub_disk_addr_t > grub_ext2_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock) > @@ -272,6 +341,41 @@ grub_ext2_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock) > unsigned int blksz = EXT2_BLOCK_SIZE (data); > int log2_blksz = LOG2_EXT2_BLOCK_SIZE (data); > > + if (inode->flags & EXT4_EXTENTS_FLAG) > + { > + struct grub_ext4_extent_header *leaf; > + struct grub_ext4_extent *ext; > + int i; > + > + leaf = grub_ext4_find_leaf (data, > + (struct grub_ext4_extent_header *) inode->blocks.dir_blocks, > + fileblock); > + if (! leaf) > + { > + grub_error (GRUB_ERR_BAD_FS, "invalid extent"); > + return -1; > + } > + > + ext = (struct grub_ext4_extent *) (leaf + 1); > + for (i = 0; i < grub_le_to_cpu16 (leaf->entries); i++) > + if ((fileblock >= grub_le_to_cpu32 (ext[i].block)) && > + (fileblock < grub_le_to_cpu32 (ext[i].block) + > + grub_le_to_cpu16 (ext[i].len)) && > + ((grub_le_to_cpu16 (ext[i].len) >> 15) == 0)) > + { > + grub_disk_addr_t start; > + > + start = grub_le_to_cpu16 (ext[i].start_hi); > + start = (start << 32) + grub_le_to_cpu32 (ext[i].start); > + return fileblock - grub_le_to_cpu32 (ext[i].block) + start; > + } > + > + > + > + grub_printf ("HH\n"); Whoops? ;-) > + return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, > + "ext2fs doesn't support extents"); Why the error? I thought you have added extent support? Doesn't this mean the extent has another error of some kind? -- Marco