From: Pavel Roskin <proski@gnu.org>
To: The development of GRUB 2 <grub-devel@gnu.org>
Subject: Re: [PATCH] biosdisk / open_device() messing up offsets
Date: Sun, 08 Jun 2008 21:43:58 -0400 [thread overview]
Message-ID: <1212975838.3863.35.camel@dv> (raw)
In-Reply-To: <ca0f59980806081157v1d6fd59ducd9998c52a2196bc@mail.gmail.com>
On Mon, 2008-06-09 at 02:57 +0800, Bean wrote:
> Thanks, can you also give me the output of dumpe2fs ?
>
> dumpe2fs /dev/sda1
I'll send it privately, as it won't compress much.
I was trying to find out which change breaks the ext3 support. It turns
out grub-fstest starts working if I comment out this line in fs/ext2.c:
log->mapping[num++] = grub_be_to_cpu32 (tag->block);
Alternatively, I could replace it with
log->mapping[num++] = GRUB_FSHELP_JOURNAL_UNUSED_MAPPING;
and grub-fstest would list /boot properly. I added some debug prints,
to see which states it goes through, and here's the end of the output:
descriptor
commit
descriptor
commit
descriptor
commit
descriptor
commit
descriptor
commit
descriptor
commit
descriptor
commit
revoke
descriptor
commit
num = 15628, last_num = 15627
grub/ System.map vmlinuz-2.6.26-rc4-wl.old vmlinuz
System.map-2.6.26-rc4-wl.old vmlinuz-2.6.26-rc4-wl
System.map-2.6.26-rc4-wl initrd-2.6.26-rc4-wl.img memtest86+-2.01
The number of the blocks is quite large, but we are never hitting the
"default" case. "revoke" wasn't present in subsequent runs. The
numbers (num and last_num) keep growing every time by about 20.
I also tried to see what happens on the fshelp.c side. So I applied
this patch:
diff --git a/fs/fshelp.c b/fs/fshelp.c
index faec1f7..027b579 100644
--- a/fs/fshelp.c
+++ b/fs/fshelp.c
@@ -329,12 +329,18 @@ grub_fshelp_map_block (grub_fshelp_journal_t log, grub_disk_addr_t block)
if (map_block < 0)
return block;
+ grub_printf("map_block = %ld, start_block = %ld, first_block = %ld, last_block = %d\n",
+ map_block, log->start_block, log->first_block, log->last_block);
map_block += log->start_block;
if (map_block >= log->last_block)
map_block -= log->last_block - log->first_block;
if (log->type == GRUB_FSHELP_JOURNAL_TYPE_BLOCK)
return log->blkno + map_block;
- else
- return log->get_block (log->node, map_block);
+ else {
+ grub_disk_addr_t ret;
+ ret = log->get_block (log->node, map_block);
+ grub_printf("map_block = %ld, block = %ld, ret = %ld\n", map_block, block, ret);
+ return ret;
+ }
}
That's what I get:
# ./grub-fstest /dev/sda1 ls /boot
map_block = 18988, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9345, block = 1, ret = 10901
map_block = 18780, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9137, block = 1027, ret = 10692
map_block = 18988, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9345, block = 1, ret = 10901
map_block = 18780, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9137, block = 1027, ret = 10692
map_block = 18988, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9345, block = 1, ret = 10901
But if I change "return ret;" to "return block;" to ignore the lookup, I
get this:
# ./grub-fstest /dev/sda1 ls /boot
map_block = 19373, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9730, block = 1, ret = 11286
map_block = 19209, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9566, block = 1027, ret = 11122
map_block = 19373, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9730, block = 1, ret = 11286
map_block = 19209, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9566, block = 1027, ret = 11122
map_block = 19373, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9730, block = 1, ret = 11286
map_block = 12763, start_block = 23124, first_block = 1, last_block = 32768
map_block = 3120, block = 15237122, ret = 4670
grub/ System.map vmlinuz-2.6.26-rc4-wl.old vmlinuz
System.map-2.6.26-rc4-wl.old vmlinuz-2.6.26-rc4-wl
System.map-2.6.26-rc4-wl initrd-2.6.26-rc4-wl.img memtest86+-2.01
One thing that surprises me is that the value we are supposed to return
is always below 12000.
Then I created file /boot/foo, ran sync several times, and that's what I
get if "block" is returned:
# ./grub-fstest /dev/sda1 ls /boot
map_block = 19438, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9795, block = 1, ret = 11351
map_block = 19630, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9987, block = 1027, ret = 11543
map_block = 19438, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9795, block = 1, ret = 11351
map_block = 19630, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9987, block = 1027, ret = 11543
map_block = 19438, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9795, block = 1, ret = 11351
map_block = 19627, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9984, block = 15237122, ret = 11540
map_block = 19628, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9985, block = 15239168, ret = 11541
map_block = 19628, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9985, block = 15239168, ret = 11541
map_block = 19628, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9985, block = 15239168, ret = 11541
map_block = 19628, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9985, block = 15239168, ret = 11541
map_block = 19628, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9985, block = 15239168, ret = 11541
map_block = 19628, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9985, block = 15239168, ret = 11541
grub/ map_block = 19628, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9985, block = 15239168, ret = 11541
map_block = 19628, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9985, block = 15239168, ret = 11541
System.map map_block = 19628, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9985, block = 15239168, ret = 11541
map_block = 19628, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9985, block = 15239168, ret = 11541
vmlinuz-2.6.26-rc4-wl.old map_block = 19628, start_block = 23124, first_block = 1, last_block =
32768
map_block = 9985, block = 15239168, ret = 11541
map_block = 19628, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9985, block = 15239168, ret = 11541
vmlinuz map_block = 19628, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9985, block = 15239168, ret = 11541
map_block = 19628, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9985, block = 15239168, ret = 11541
System.map-2.6.26-rc4-wl.old map_block = 19628, start_block = 23124, first_block = 1, last_block
= 32768
map_block = 9985, block = 15239168, ret = 11541
map_block = 19628, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9985, block = 15239168, ret = 11541
vmlinuz-2.6.26-rc4-wl map_block = 19628, start_block = 23124, first_block = 1, last_block = 3276
8
map_block = 9985, block = 15239168, ret = 11541
map_block = 19628, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9985, block = 15239168, ret = 11541
System.map-2.6.26-rc4-wl map_block = 19628, start_block = 23124, first_block = 1, last_block = 3
2768
map_block = 9985, block = 15239168, ret = 11541
map_block = 19628, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9985, block = 15239168, ret = 11541
foo map_block = 19628, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9985, block = 15239168, ret = 11541
map_block = 19628, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9985, block = 15239168, ret = 11541
initrd-2.6.26-rc4-wl.img map_block = 19628, start_block = 23124, first_block = 1, last_block = 3
2768
map_block = 9985, block = 15239168, ret = 11541
map_block = 19628, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9985, block = 15239168, ret = 11541
memtest86+-2.01
But I get this if "ret" is returned:
# ./grub-fstest /dev/sda1 ls /boot
map_block = 19438, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9795, block = 1, ret = 11351
map_block = 19656, start_block = 23124, first_block = 1, last_block = 32768
map_block = 10013, block = 1027, ret = 11569
map_block = 19438, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9795, block = 1, ret = 11351
map_block = 19656, start_block = 23124, first_block = 1, last_block = 32768
map_block = 10013, block = 1027, ret = 11569
map_block = 19438, start_block = 23124, first_block = 1, last_block = 32768
map_block = 9795, block = 1, ret = 11351
"ret" is still in the same region.
--
Regards,
Pavel Roskin
next prev parent reply other threads:[~2008-06-09 1:44 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-06-04 23:35 [PATCH] biosdisk / open_device() messing up offsets Robert Millan
2008-06-05 1:47 ` Pavel Roskin
2008-06-05 21:12 ` Robert Millan
2008-06-06 15:56 ` Robert Millan
2008-06-06 22:53 ` Pavel Roskin
2008-06-06 23:38 ` Robert Millan
2008-06-07 2:58 ` Pavel Roskin
2008-06-08 19:29 ` Robert Millan
2008-06-07 6:33 ` Pavel Roskin
2008-06-07 7:48 ` Bean
2008-06-08 6:00 ` Pavel Roskin
2008-06-08 6:44 ` Bean
2008-06-08 6:52 ` Pavel Roskin
2008-06-08 7:11 ` Bean
2008-06-08 7:29 ` Pavel Roskin
2008-06-08 11:49 ` Bean
2008-06-08 18:42 ` Pavel Roskin
2008-06-08 18:57 ` Bean
2008-06-09 1:43 ` Pavel Roskin [this message]
2008-06-09 18:30 ` Bean
2008-06-10 7:16 ` Bean
2008-06-10 18:26 ` Pavel Roskin
2008-06-10 18:51 ` Bean
2008-06-10 20:19 ` Pavel Roskin
2008-06-10 22:58 ` Pavel Roskin
2008-06-10 23:18 ` [RFC PATCH] " Pavel Roskin
2008-06-11 5:25 ` Bean
2008-06-12 4:01 ` Pavel Roskin
2008-06-12 6:22 ` Pavel Roskin
2008-06-12 9:51 ` Bean
2008-06-12 16:25 ` Pavel Roskin
2008-06-13 3:48 ` Bean
2008-06-13 4:31 ` Pavel Roskin
2008-06-13 4:39 ` Bean
2008-06-13 5:00 ` Pavel Roskin
2008-06-13 5:18 ` Bean
2008-06-07 8:37 ` Bean
2008-06-08 5:41 ` Pavel Roskin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1212975838.3863.35.camel@dv \
--to=proski@gnu.org \
--cc=grub-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.