From c60cee8ee16c512ad73370e611a9d226c140c939 Mon Sep 17 00:00:00 2001 From: phcoder Date: Fri, 14 Aug 2009 13:42:03 +0000 Subject: [PATCH] 2009-08-14 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. --- ChangeLog | 7 +++++++ fs/ufs.c | 7 ++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 0cae2ec9d..c808913a9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2009-08-14 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-14 Vladimir Serbinenko Split ufs.mod into ufs1.mod and ufs2.mod. diff --git a/fs/ufs.c b/fs/ufs.c index 75398617d..797a45d13 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;