[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: hfs breakage
From: |
Marco Gerards |
Subject: |
Re: hfs breakage |
Date: |
Wed, 23 Jan 2008 20:40:56 +0100 |
User-agent: |
Gnus/5.110006 (No Gnus v0.6) Emacs/21.4 (gnu/linux) |
Bean <address@hidden> writes:
[...]
>> Yes, it seems so to me at least. I was talking about my code :-)
>
> ok then, i just revert to the original code. however, there is still a
> small bug in grub_hfs_find_node. please see the new patch below.
No need to revert it, you improved it!
>> >> What was the problem here?
>> >
>> > extents file and catalog file uses special file number, 3 and 4,
>> > respectively. for example, in sda.img, sector 5:
>> >
>> > 00 00 00 00 00 00 00 00 FF 01 00 01 00 00 07 00
>> > 00 00 00 04 00 2D 04 C3 00 0F 00 00 00 00 00 00
>> >
>> > this is the first extent of catalog file that's not stored in super
>> > block, you can see that it use 4 as the file number.
>>
>> This applies in general? I do not have a working mac around ATM to
>> test with...
>
> i guess so, but i don't have mac to test on, maybe someone can verify it.
:-)
> * fs/hfs.c (grub_hfs_cnid_t): Add magic values for cnid
_t is for types, can you prefix this with "type"?
So this would become:
* fs/hfs.c (grub_hfs_cnid_t): New type.
> (grub_hfs_iterate_records): Use the correct file number for extents
> and catalog file. Fix problem in next index calculation.
". " -> ". "
> (grub_hfs_find_node): Fix a bug that can cause the function to return
> 1 even if no match is found.
> +/* Catalog node ID (CNID). */
> +enum
> + {
> + GRUB_HFS_CNID_ROOT_PARENT = 1,
> + GRUB_HFS_CNID_ROOT = 2,
> + GRUB_HFS_CNID_EXT = 3,
> + GRUB_HFS_CNID_CAT = 4,
> + GRUB_HFS_CNID_BAD = 5
> + } grub_hfs_cnid_t;
+ type
> /* A node descriptor. This is the header of every node. */
> struct grub_hfs_node
> {
> @@ -447,7 +457,8 @@ grub_hfs_iterate_records (struct grub_hfs_data
> *data, int type, int idx,
>
> /* Read the node into memory. */
> blk = grub_hfs_block (data, dat,
> - 0, idx / (data->blksz / nodesize), 0);
> + (type == 0) ? GRUB_HFS_CNID_CAT :
> GRUB_HFS_CNID_EXT,
> + idx / (data->blksz / nodesize), 0);
> blk += (idx % (data->blksz / nodesize));
> if (grub_errno)
> return grub_errno;
> @@ -481,10 +492,7 @@ grub_hfs_iterate_records (struct grub_hfs_data
> *data, int type, int idx,
> return 0;
> }
>
> - if (idx % (data->blksz / nodesize) == 0)
> - idx = grub_be_to_cpu32 (node.node.next);
> - else
> - idx++;
> + idx = grub_be_to_cpu32 (node.node.next);
> } while (idx && this);
>
> return 0;
> @@ -501,6 +509,7 @@ grub_hfs_find_node (struct grub_hfs_data *data, char *key,
> {
> int found = -1;
> int isleaf = 0;
> + int done = 0;
>
> auto int node_found (struct grub_hfs_node *, struct grub_hfs_record *);
>
> @@ -532,6 +541,8 @@ grub_hfs_find_node (struct grub_hfs_data *data, char *key,
> /* Found it!!!! */
> if (cmp == 0)
> {
> + done = 1;
> +
> grub_memcpy (datar, rec->data,
> rec->datalen < datalen ? rec->datalen : datalen);
> return 1;
> @@ -548,7 +559,7 @@ grub_hfs_find_node (struct grub_hfs_data *data, char *key,
> return 0;
>
> if (isleaf)
> - return 1;
> + return done;
>
> return grub_hfs_find_node (data, key, found, type, datar, datalen);
> }
>
>
> --
> Bean
>
>
> _______________________________________________
> Grub-devel mailing list
> address@hidden
> http://lists.gnu.org/mailman/listinfo/grub-devel