diff options
author | Theodore Ts'o <tytso@mit.edu> | 2010-01-24 14:34:07 -0500 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2010-01-24 14:34:07 -0500 |
commit | 19f5fb7ad679bb361222c7916086435020c37cce (patch) | |
tree | 9e301163075c4faaf340cf50afd51855c76acd8c /fs/ext4/extents.c | |
parent | d2eecb03936878ec574ade5532fa83df7d75dde7 (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.c | 8 |
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 | ||