summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2012-02-21 20:22:27 -0500
committerDavid S. Miller <davem@davemloft.net>2012-02-21 20:22:27 -0500
commit879a15b45f8fc6f44469401c9bbe6bb12d2965f4 (patch)
tree1f14a2a94500d458d13eef886cdabd625fdb264a
parent2f40e206ea4e8c7193c10e3f3bb4522c304f6314 (diff)
downloadsilo-879a15b45f8fc6f44469401c9bbe6bb12d2965f4.tar.gz
ext2: Calculate group descriptor location properly.
Calculate the block and offset correctly for group descriptors. The existing code would work properly only for the first block of descriptors. Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--second/fs/ext2.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/second/fs/ext2.c b/second/fs/ext2.c
index 710695a..7eb665f 100644
--- a/second/fs/ext2.c
+++ b/second/fs/ext2.c
@@ -57,6 +57,8 @@ struct silo_ext2_state {
__u32 block_size;
__u32 addr_per_block;
__u32 addr_per_block_bits;
+ __u32 desc_per_block;
+ __u32 desc_per_block_bits;
};
static struct silo_ext2_state *sstate;
@@ -285,8 +287,8 @@ static void read_group(struct silo_ext2_state *s, __u32 grp_no,
__u32 first = ext2_to_cpu_32(s->super->s_first_data_block);
__u32 blk, offset;
- blk = first + 1;
- offset = grp_no * sizeof(*grp);
+ blk = first + 1 + (grp_no >> s->desc_per_block_bits);
+ offset = (grp_no & (s->desc_per_block - 1)) * sizeof(*grp);
read_data(s, blk, offset, sizeof(*grp), grp);
}
@@ -371,6 +373,8 @@ static int open_ext2(char *device)
s->addr_per_block = s->block_size / sizeof(__u32);
s->addr_per_block_bits = calc_ilog2(s->addr_per_block);
+ s->desc_per_block = s->block_size / sizeof(struct ext2_group_desc);
+ s->desc_per_block_bits = calc_ilog2(s->desc_per_block);
s->scratch_block[0] = malloc(s->block_size * 4);
if (!s->scratch_block[0]) {