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>
This commit is contained in:
committed by
Theodore Ts'o
parent
24676da469
commit
12e9b89200
+4
-4
@@ -273,7 +273,7 @@ static inline int ext4_should_journal_data(struct inode *inode)
|
||||
return 1;
|
||||
if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA)
|
||||
return 1;
|
||||
if (EXT4_I(inode)->i_flags & EXT4_JOURNAL_DATA_FL)
|
||||
if (ext4_test_inode_flag(inode, EXT4_INODE_JOURNAL_DATA))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
@@ -284,7 +284,7 @@ static inline int ext4_should_order_data(struct inode *inode)
|
||||
return 0;
|
||||
if (!S_ISREG(inode->i_mode))
|
||||
return 0;
|
||||
if (EXT4_I(inode)->i_flags & EXT4_JOURNAL_DATA_FL)
|
||||
if (ext4_test_inode_flag(inode, EXT4_INODE_JOURNAL_DATA))
|
||||
return 0;
|
||||
if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_ORDERED_DATA)
|
||||
return 1;
|
||||
@@ -297,7 +297,7 @@ static inline int ext4_should_writeback_data(struct inode *inode)
|
||||
return 0;
|
||||
if (EXT4_JOURNAL(inode) == NULL)
|
||||
return 1;
|
||||
if (EXT4_I(inode)->i_flags & EXT4_JOURNAL_DATA_FL)
|
||||
if (ext4_test_inode_flag(inode, EXT4_INODE_JOURNAL_DATA))
|
||||
return 0;
|
||||
if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_WRITEBACK_DATA)
|
||||
return 1;
|
||||
@@ -321,7 +321,7 @@ static inline int ext4_should_dioread_nolock(struct inode *inode)
|
||||
return 0;
|
||||
if (!S_ISREG(inode->i_mode))
|
||||
return 0;
|
||||
if (!(EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL))
|
||||
if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)))
|
||||
return 0;
|
||||
if (ext4_should_journal_data(inode))
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user