diff options
author | David S. Miller <davem@davemloft.net> | 2012-02-21 20:22:27 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-02-21 20:22:27 -0500 |
commit | 879a15b45f8fc6f44469401c9bbe6bb12d2965f4 (patch) | |
tree | 1f14a2a94500d458d13eef886cdabd625fdb264a | |
parent | 2f40e206ea4e8c7193c10e3f3bb4522c304f6314 (diff) | |
download | silo-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.c | 8 |
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]) { |