diff --git a/ChangeLog b/ChangeLog index 8e13775..be2eca0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2009-08-13 Vladimir Serbinenko + Handle group offset on UFS1. + + * fs/ufs.c (grub_ufs_sblock): New field 'cylg_mask'. + (grub_ufs_read_inode) [!MODE_UFS2]: handle cylg_offset and cylg_mask. + +2009-08-13 Vladimir Serbinenko + Split ufs.mod into ufs1.mod and ufs2.mod. * conf/common.rmk (grub_probe_SOURCES): Add fs/ufs2.c. diff --git a/fs/ufs.c b/fs/ufs.c index 7f254af..13727f8 100644 --- a/fs/ufs.c +++ b/fs/ufs.c @@ -88,7 +88,7 @@ struct grub_ufs_sblock /* The start of the cylinder group. */ grub_uint32_t cylg_offset; - grub_uint8_t unused3[4]; + grub_uint32_t cylg_mask; grub_uint32_t mtime; grub_uint8_t unused4[12]; @@ -360,6 +360,11 @@ grub_ufs_read_inode (struct grub_ufs_data *data, int ino, char *inode) /* The first block of the group. */ int grpblk = group * (grub_le_to_cpu32 (sblock->frags_per_group)); +#ifndef MODE_UFS2 + grpblk += grub_le_to_cpu32 (sblock->cylg_offset) + * (group & (~grub_le_to_cpu32 (sblock->cylg_mask))); +#endif + if (!inode) { inode = (char *) &data->inode;