| From 78c37eb0d5e6a9727b12ea0f1821795ffaa66cfe Mon Sep 17 00:00:00 2001 |
| From: Tao Ma <tao.ma@oracle.com> |
| Date: Wed, 3 Mar 2010 11:26:27 +0800 |
| Subject: ocfs2: Change bg_chain check for ocfs2_validate_gd_parent. |
| |
| From: Tao Ma <tao.ma@oracle.com> |
| |
| commit 78c37eb0d5e6a9727b12ea0f1821795ffaa66cfe upstream. |
| |
| 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> |
| Cc: maximilian attems <max@stro.at> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| fs/ocfs2/suballoc.c | 13 ++++++++----- |
| 1 file changed, 8 insertions(+), 5 deletions(-) |
| |
| --- a/fs/ocfs2/suballoc.c |
| +++ b/fs/ocfs2/suballoc.c |
| @@ -152,7 +152,7 @@ static u32 ocfs2_bits_per_group(struct o |
| |
| #define do_error(fmt, ...) \ |
| do{ \ |
| - if (clean_error) \ |
| + if (resize) \ |
| mlog(ML_ERROR, fmt "\n", ##__VA_ARGS__); \ |
| else \ |
| ocfs2_error(sb, fmt, ##__VA_ARGS__); \ |
| @@ -160,7 +160,7 @@ static u32 ocfs2_bits_per_group(struct o |
| |
| static int ocfs2_validate_gd_self(struct super_block *sb, |
| struct buffer_head *bh, |
| - int clean_error) |
| + int resize) |
| { |
| struct ocfs2_group_desc *gd = (struct ocfs2_group_desc *)bh->b_data; |
| |
| @@ -211,7 +211,7 @@ static int ocfs2_validate_gd_self(struct |
| static int ocfs2_validate_gd_parent(struct super_block *sb, |
| struct ocfs2_dinode *di, |
| struct buffer_head *bh, |
| - int clean_error) |
| + int resize) |
| { |
| unsigned int max_bits; |
| struct ocfs2_group_desc *gd = (struct ocfs2_group_desc *)bh->b_data; |
| @@ -233,8 +233,11 @@ static int ocfs2_validate_gd_parent(stru |
| return -EINVAL; |
| } |
| |
| - if (le16_to_cpu(gd->bg_chain) >= |
| - le16_to_cpu(di->id2.i_chain.cl_next_free_rec)) { |
| + /* In resize, we may meet the case bg_chain == cl_next_free_rec. */ |
| + if ((le16_to_cpu(gd->bg_chain) > |
| + le16_to_cpu(di->id2.i_chain.cl_next_free_rec)) || |
| + ((le16_to_cpu(gd->bg_chain) == |
| + le16_to_cpu(di->id2.i_chain.cl_next_free_rec)) && !resize)) { |
| do_error("Group descriptor #%llu has bad chain %u", |
| (unsigned long long)bh->b_blocknr, |
| le16_to_cpu(gd->bg_chain)); |