diff options
author | Tao Ma <tao.ma@oracle.com> | 2010-03-02 22:26:27 -0500 |
---|---|---|
committer | Joel Becker <joel.becker@oracle.com> | 2010-03-17 15:07:21 -0400 |
commit | 78c37eb0d5e6a9727b12ea0f1821795ffaa66cfe (patch) | |
tree | d789252a4335a1ac0910d34be29fe43bc4153d9c | |
parent | ee860b6a650360c91f5d5f9a94262aad9be90015 (diff) |
ocfs2: Change bg_chain check for ocfs2_validate_gd_parent.
In ocfs2_validate_gd_parent, we check bg_chain against the
cl_next_free_rec of the dinode. Actually in resize, we have
the chance of bg_chain == cl_next_free_rec. So add some
additional condition check for it.
I also rename paramter "clean_error" to "resize", since the
old one is not clearly enough to indicate that we should only
meet with this case in resize.
btw, the correpsonding bug is
http://oss.oracle.com/bugzilla/show_bug.cgi?id=1230.
Signed-off-by: Tao Ma <tao.ma@oracle.com>
Signed-off-by: Joel Becker <joel.becker@oracle.com>
-rw-r--r-- | fs/ocfs2/suballoc.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/fs/ocfs2/suballoc.c b/fs/ocfs2/suballoc.c index c3c60bc3e072..0016503d83ef 100644 --- a/fs/ocfs2/suballoc.c +++ b/fs/ocfs2/suballoc.c | |||
@@ -152,7 +152,7 @@ static u32 ocfs2_bits_per_group(struct ocfs2_chain_list *cl) | |||
152 | 152 | ||
153 | #define do_error(fmt, ...) \ | 153 | #define do_error(fmt, ...) \ |
154 | do{ \ | 154 | do{ \ |
155 | if (clean_error) \ | 155 | if (resize) \ |
156 | mlog(ML_ERROR, fmt "\n", ##__VA_ARGS__); \ | 156 | mlog(ML_ERROR, fmt "\n", ##__VA_ARGS__); \ |
157 | else \ | 157 | else \ |
158 | ocfs2_error(sb, fmt, ##__VA_ARGS__); \ | 158 | ocfs2_error(sb, fmt, ##__VA_ARGS__); \ |
@@ -160,7 +160,7 @@ static u32 ocfs2_bits_per_group(struct ocfs2_chain_list *cl) | |||
160 | 160 | ||
161 | static int ocfs2_validate_gd_self(struct super_block *sb, | 161 | static int ocfs2_validate_gd_self(struct super_block *sb, |
162 | struct buffer_head *bh, | 162 | struct buffer_head *bh, |
163 | int clean_error) | 163 | int resize) |
164 | { | 164 | { |
165 | struct ocfs2_group_desc *gd = (struct ocfs2_group_desc *)bh->b_data; | 165 | struct ocfs2_group_desc *gd = (struct ocfs2_group_desc *)bh->b_data; |
166 | 166 | ||
@@ -211,7 +211,7 @@ static int ocfs2_validate_gd_self(struct super_block *sb, | |||
211 | static int ocfs2_validate_gd_parent(struct super_block *sb, | 211 | static int ocfs2_validate_gd_parent(struct super_block *sb, |
212 | struct ocfs2_dinode *di, | 212 | struct ocfs2_dinode *di, |
213 | struct buffer_head *bh, | 213 | struct buffer_head *bh, |
214 | int clean_error) | 214 | int resize) |
215 | { | 215 | { |
216 | unsigned int max_bits; | 216 | unsigned int max_bits; |
217 | struct ocfs2_group_desc *gd = (struct ocfs2_group_desc *)bh->b_data; | 217 | struct ocfs2_group_desc *gd = (struct ocfs2_group_desc *)bh->b_data; |
@@ -233,8 +233,11 @@ static int ocfs2_validate_gd_parent(struct super_block *sb, | |||
233 | return -EINVAL; | 233 | return -EINVAL; |
234 | } | 234 | } |
235 | 235 | ||
236 | if (le16_to_cpu(gd->bg_chain) >= | 236 | /* In resize, we may meet the case bg_chain == cl_next_free_rec. */ |
237 | le16_to_cpu(di->id2.i_chain.cl_next_free_rec)) { | 237 | if ((le16_to_cpu(gd->bg_chain) > |
238 | le16_to_cpu(di->id2.i_chain.cl_next_free_rec)) || | ||
239 | ((le16_to_cpu(gd->bg_chain) == | ||
240 | le16_to_cpu(di->id2.i_chain.cl_next_free_rec)) && !resize)) { | ||
238 | do_error("Group descriptor #%llu has bad chain %u", | 241 | do_error("Group descriptor #%llu has bad chain %u", |
239 | (unsigned long long)bh->b_blocknr, | 242 | (unsigned long long)bh->b_blocknr, |
240 | le16_to_cpu(gd->bg_chain)); | 243 | le16_to_cpu(gd->bg_chain)); |