All of lore.kernel.org
 help / color / mirror / Atom feed
From: Marco Gerards <mgerards@xs4all.nl>
To: The development of GRUB 2 <grub-devel@gnu.org>
Subject: Re: hfs breakage
Date: Wed, 23 Jan 2008 20:40:56 +0100	[thread overview]
Message-ID: <873asocotz.fsf@xs4all.nl> (raw)
In-Reply-To: <ca0f59980801230856i5882577v4bd23dd1d95c882@mail.gmail.com> (bean123ch@gmail.com's message of "Thu, 24 Jan 2008 00:56:40 +0800")

Bean <bean123ch@gmail.com> 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
> Grub-devel@gnu.org
> http://lists.gnu.org/mailman/listinfo/grub-devel




  reply	other threads:[~2008-01-23 19:39 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-01-16  0:38 hfs breakage Pavel Roskin
2008-01-19  7:12 ` Bean
2008-01-20 22:06   ` Pavel Roskin
2008-01-21 10:38   ` Marco Gerards
2008-01-22 10:39     ` Bean
2008-01-23  9:01       ` Marco Gerards
2008-01-23 16:56         ` Bean
2008-01-23 19:40           ` Marco Gerards [this message]
2008-01-23 20:26             ` Bean

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=873asocotz.fsf@xs4all.nl \
    --to=mgerards@xs4all.nl \
    --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.