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/ext4_jbd2.h | |
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/ext4_jbd2.h')
-rw-r--r-- | fs/ext4/ext4_jbd2.h | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/fs/ext4/ext4_jbd2.h b/fs/ext4/ext4_jbd2.h index b79ad5126468..dade0c024797 100644 --- a/fs/ext4/ext4_jbd2.h +++ b/fs/ext4/ext4_jbd2.h | |||
@@ -273,7 +273,7 @@ static inline int ext4_should_journal_data(struct inode *inode) | |||
273 | return 1; | 273 | return 1; |
274 | if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) | 274 | if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) |
275 | return 1; | 275 | return 1; |
276 | if (EXT4_I(inode)->i_flags & EXT4_JOURNAL_DATA_FL) | 276 | if (ext4_test_inode_flag(inode, EXT4_INODE_JOURNAL_DATA)) |
277 | return 1; | 277 | return 1; |
278 | return 0; | 278 | return 0; |
279 | } | 279 | } |
@@ -284,7 +284,7 @@ static inline int ext4_should_order_data(struct inode *inode) | |||
284 | return 0; | 284 | return 0; |
285 | if (!S_ISREG(inode->i_mode)) | 285 | if (!S_ISREG(inode->i_mode)) |
286 | return 0; | 286 | return 0; |
287 | if (EXT4_I(inode)->i_flags & EXT4_JOURNAL_DATA_FL) | 287 | if (ext4_test_inode_flag(inode, EXT4_INODE_JOURNAL_DATA)) |
288 | return 0; | 288 | return 0; |
289 | if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_ORDERED_DATA) | 289 | if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_ORDERED_DATA) |
290 | return 1; | 290 | return 1; |
@@ -297,7 +297,7 @@ static inline int ext4_should_writeback_data(struct inode *inode) | |||
297 | return 0; | 297 | return 0; |
298 | if (EXT4_JOURNAL(inode) == NULL) | 298 | if (EXT4_JOURNAL(inode) == NULL) |
299 | return 1; | 299 | return 1; |
300 | if (EXT4_I(inode)->i_flags & EXT4_JOURNAL_DATA_FL) | 300 | if (ext4_test_inode_flag(inode, EXT4_INODE_JOURNAL_DATA)) |
301 | return 0; | 301 | return 0; |
302 | if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_WRITEBACK_DATA) | 302 | if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_WRITEBACK_DATA) |
303 | return 1; | 303 | return 1; |
@@ -321,7 +321,7 @@ static inline int ext4_should_dioread_nolock(struct inode *inode) | |||
321 | return 0; | 321 | return 0; |
322 | if (!S_ISREG(inode->i_mode)) | 322 | if (!S_ISREG(inode->i_mode)) |
323 | return 0; | 323 | return 0; |
324 | if (!(EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL)) | 324 | if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) |
325 | return 0; | 325 | return 0; |
326 | if (ext4_should_journal_data(inode)) | 326 | if (ext4_should_journal_data(inode)) |
327 | return 0; | 327 | return 0; |