aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext4/extents.c
diff options
context:
space:
mode:
authorTheodore Ts'o <tytso@mit.edu>2010-01-24 14:34:07 -0500
committerTheodore Ts'o <tytso@mit.edu>2010-01-24 14:34:07 -0500
commit19f5fb7ad679bb361222c7916086435020c37cce (patch)
tree9e301163075c4faaf340cf50afd51855c76acd8c /fs/ext4/extents.c
parentd2eecb03936878ec574ade5532fa83df7d75dde7 (diff)
ext4: Use bitops to read/modify EXT4_I(inode)->i_state
At several places we modify EXT4_I(inode)->i_state without holding i_mutex (ext4_release_file, ext4_bmap, ext4_journalled_writepage, ext4_do_update_inode, ...). These modifications are racy and we can lose updates to i_state. So convert handling of i_state to use bitops which are atomic. Cc: Jan Kara <jack@suse.cz> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs/ext4/extents.c')
-rw-r--r--fs/ext4/extents.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
index c56877972b0e..54616157c0f3 100644
--- a/fs/ext4/extents.c
+++ b/fs/ext4/extents.c
@@ -3076,7 +3076,7 @@ ext4_ext_handle_uninitialized_extents(handle_t *handle, struct inode *inode,
3076 if (io) 3076 if (io)
3077 io->flag = DIO_AIO_UNWRITTEN; 3077 io->flag = DIO_AIO_UNWRITTEN;
3078 else 3078 else
3079 EXT4_I(inode)->i_state |= EXT4_STATE_DIO_UNWRITTEN; 3079 ext4_set_inode_state(inode, EXT4_STATE_DIO_UNWRITTEN);
3080 goto out; 3080 goto out;
3081 } 3081 }
3082 /* async DIO end_io complete, convert the filled extent to written */ 3082 /* async DIO end_io complete, convert the filled extent to written */
@@ -3362,8 +3362,8 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode,
3362 if (io) 3362 if (io)
3363 io->flag = DIO_AIO_UNWRITTEN; 3363 io->flag = DIO_AIO_UNWRITTEN;
3364 else 3364 else
3365 EXT4_I(inode)->i_state |= 3365 ext4_set_inode_state(inode,
3366 EXT4_STATE_DIO_UNWRITTEN;; 3366 EXT4_STATE_DIO_UNWRITTEN);
3367 } 3367 }
3368 } 3368 }
3369 err = ext4_ext_insert_extent(handle, inode, path, &newex, flags); 3369 err = ext4_ext_insert_extent(handle, inode, path, &newex, flags);
@@ -3739,7 +3739,7 @@ static int ext4_xattr_fiemap(struct inode *inode,
3739 int error = 0; 3739 int error = 0;
3740 3740
3741 /* in-inode? */ 3741 /* in-inode? */
3742 if (EXT4_I(inode)->i_state & EXT4_STATE_XATTR) { 3742 if (ext4_test_inode_state(inode, EXT4_STATE_XATTR)) {
3743 struct ext4_iloc iloc; 3743 struct ext4_iloc iloc;
3744 int offset; /* offset of xattr in inode */ 3744 int offset; /* offset of xattr in inode */
3745 3745