diff options
author | Dmitry Monakhov <dmonakhov@openvz.org> | 2010-05-16 22:00:00 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2010-05-16 22:00:00 -0400 |
commit | 12e9b892002d9af057655d35b44db8ee9243b0dc (patch) | |
tree | c5831b4bcf98eebdd39158d08dab97c198f5c683 /fs/ext4/mballoc.c | |
parent | 24676da469f50f433baa347845639662c561d1f6 (diff) |
ext4: Use bitops to read/modify i_flags in struct ext4_inode_info
At several places we modify EXT4_I(inode)->i_flags without holding
i_mutex (ext4_do_update_inode, ...). These modifications are racy and
we can lose updates to i_flags. So convert handling of i_flags to use
bitops which are atomic.
https://bugzilla.kernel.org/show_bug.cgi?id=15792
Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs/ext4/mballoc.c')
-rw-r--r-- | fs/ext4/mballoc.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index e5dcdc9bd56b..0bdc0188e5e2 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c | |||
@@ -2006,7 +2006,7 @@ ext4_mb_regular_allocator(struct ext4_allocation_context *ac) | |||
2006 | sbi = EXT4_SB(sb); | 2006 | sbi = EXT4_SB(sb); |
2007 | ngroups = ext4_get_groups_count(sb); | 2007 | ngroups = ext4_get_groups_count(sb); |
2008 | /* non-extent files are limited to low blocks/groups */ | 2008 | /* non-extent files are limited to low blocks/groups */ |
2009 | if (!(EXT4_I(ac->ac_inode)->i_flags & EXT4_EXTENTS_FL)) | 2009 | if (!(ext4_test_inode_flag(ac->ac_inode, EXT4_INODE_EXTENTS))) |
2010 | ngroups = sbi->s_blockfile_groups; | 2010 | ngroups = sbi->s_blockfile_groups; |
2011 | 2011 | ||
2012 | BUG_ON(ac->ac_status == AC_STATUS_FOUND); | 2012 | BUG_ON(ac->ac_status == AC_STATUS_FOUND); |
@@ -3171,7 +3171,7 @@ ext4_mb_use_preallocated(struct ext4_allocation_context *ac) | |||
3171 | continue; | 3171 | continue; |
3172 | 3172 | ||
3173 | /* non-extent files can't have physical blocks past 2^32 */ | 3173 | /* non-extent files can't have physical blocks past 2^32 */ |
3174 | if (!(EXT4_I(ac->ac_inode)->i_flags & EXT4_EXTENTS_FL) && | 3174 | if (!(ext4_test_inode_flag(ac->ac_inode, EXT4_INODE_EXTENTS)) && |
3175 | pa->pa_pstart + pa->pa_len > EXT4_MAX_BLOCK_FILE_PHYS) | 3175 | pa->pa_pstart + pa->pa_len > EXT4_MAX_BLOCK_FILE_PHYS) |
3176 | continue; | 3176 | continue; |
3177 | 3177 | ||