Re: [Ocfs2-devel] [PATCH] ocfs2: validate bg_free_bits_count after update
On Tue, Oct 05, 2010 at 03:53:06PM -0700, Srinivas Eeda wrote: This patch adds a safe check to ensure bg_free_bits_count doesn't exceed bg_bits in a group descriptor. This is to avoid on disk corruption that was seen recently. debugfs: group 52803072 Group Chain: 179 Parent Inode: 11 Generation: 2959379682 CRC32: ECC: ## Block#TotalUsed Free Contig Size 052803072 322564294965350 34202182074032 .. Signed-off-by: Srinivas Eeda srinivas.e...@oracle.com This patch is now in the merge-window branch of ocfs2.git. Joel -- Life's Little Instruction Book #252 Take good care of those you love. Joel Becker Consulting Software Developer Oracle E-mail: joel.bec...@oracle.com Phone: (650) 506-8127 ___ Ocfs2-devel mailing list Ocfs2-devel@oss.oracle.com http://oss.oracle.com/mailman/listinfo/ocfs2-devel
[Ocfs2-devel] [PATCH] ocfs2: validate bg_free_bits_count after update
This patch adds a safe check to ensure bg_free_bits_count doesn't exceed bg_bits in a group descriptor. This is to avoid on disk corruption that was seen recently. debugfs: group 52803072 Group Chain: 179 Parent Inode: 11 Generation: 2959379682 CRC32: ECC: ## Block#TotalUsed Free Contig Size 052803072 322564294965350 34202182074032 .. Signed-off-by: Srinivas Eeda srinivas.e...@oracle.com --- fs/ocfs2/suballoc.c | 16 1 files changed, 16 insertions(+), 0 deletions(-) diff --git a/fs/ocfs2/suballoc.c b/fs/ocfs2/suballoc.c index 849c2f0..5fed60d 100644 --- a/fs/ocfs2/suballoc.c +++ b/fs/ocfs2/suballoc.c @@ -1380,6 +1380,14 @@ static inline int ocfs2_block_group_set_bits(handle_t *handle, } le16_add_cpu(bg-bg_free_bits_count, -num_bits); + if (le16_to_cpu(bg-bg_free_bits_count) le16_to_cpu(bg-bg_bits)) { + ocfs2_error(alloc_inode-i_sb, Group descriptor # %llu has bit +count %u but claims %u are freed. num_bits %d, + (unsigned long long)le64_to_cpu(bg-bg_blkno), + le16_to_cpu(bg-bg_bits), + le16_to_cpu(bg-bg_free_bits_count), num_bits); + return -EROFS; + } while(num_bits--) ocfs2_set_bit(bit_off++, bitmap); @@ -2419,6 +2427,14 @@ static int ocfs2_block_group_clear_bits(handle_t *handle, (unsigned long *) undo_bg-bg_bitmap); } le16_add_cpu(bg-bg_free_bits_count, num_bits); + if (le16_to_cpu(bg-bg_free_bits_count) le16_to_cpu(bg-bg_bits)) { + ocfs2_error(alloc_inode-i_sb, Group descriptor # %llu has bit +count %u but claims %u are freed. num_bits %d, + (unsigned long long)le64_to_cpu(bg-bg_blkno), + le16_to_cpu(bg-bg_bits), + le16_to_cpu(bg-bg_free_bits_count), num_bits); + return -EROFS; + } if (undo_fn) jbd_unlock_bh_state(group_bh); -- 1.5.6.5 ___ Ocfs2-devel mailing list Ocfs2-devel@oss.oracle.com http://oss.oracle.com/mailman/listinfo/ocfs2-devel
Re: [Ocfs2-devel] [PATCH] ocfs2: validate bg_free_bits_count after update
Acked-by: Sunil Mushransunil.mush...@oracle.com On 10/05/2010 03:53 PM, Srinivas Eeda wrote: This patch adds a safe check to ensure bg_free_bits_count doesn't exceed bg_bits in a group descriptor. This is to avoid on disk corruption that was seen recently. debugfs: group52803072 Group Chain: 179 Parent Inode: 11 Generation: 2959379682 CRC32: ECC: ## Block#TotalUsed Free Contig Size 052803072 322564294965350 34202182074032 .. Signed-off-by: Srinivas Eedasrinivas.e...@oracle.com --- fs/ocfs2/suballoc.c | 16 1 files changed, 16 insertions(+), 0 deletions(-) diff --git a/fs/ocfs2/suballoc.c b/fs/ocfs2/suballoc.c index 849c2f0..5fed60d 100644 --- a/fs/ocfs2/suballoc.c +++ b/fs/ocfs2/suballoc.c @@ -1380,6 +1380,14 @@ static inline int ocfs2_block_group_set_bits(handle_t *handle, } le16_add_cpu(bg-bg_free_bits_count, -num_bits); + if (le16_to_cpu(bg-bg_free_bits_count) le16_to_cpu(bg-bg_bits)) { + ocfs2_error(alloc_inode-i_sb, Group descriptor # %llu has bit + count %u but claims %u are freed. num_bits %d, + (unsigned long long)le64_to_cpu(bg-bg_blkno), + le16_to_cpu(bg-bg_bits), + le16_to_cpu(bg-bg_free_bits_count), num_bits); + return -EROFS; + } while(num_bits--) ocfs2_set_bit(bit_off++, bitmap); @@ -2419,6 +2427,14 @@ static int ocfs2_block_group_clear_bits(handle_t *handle, (unsigned long *) undo_bg-bg_bitmap); } le16_add_cpu(bg-bg_free_bits_count, num_bits); + if (le16_to_cpu(bg-bg_free_bits_count) le16_to_cpu(bg-bg_bits)) { + ocfs2_error(alloc_inode-i_sb, Group descriptor # %llu has bit + count %u but claims %u are freed. num_bits %d, + (unsigned long long)le64_to_cpu(bg-bg_blkno), + le16_to_cpu(bg-bg_bits), + le16_to_cpu(bg-bg_free_bits_count), num_bits); + return -EROFS; + } if (undo_fn) jbd_unlock_bh_state(group_bh); ___ Ocfs2-devel mailing list Ocfs2-devel@oss.oracle.com http://oss.oracle.com/mailman/listinfo/ocfs2-devel