diff options
author | Curt Wohlgemuth <curtw@google.com> | 2010-02-16 15:06:29 -0500 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2010-02-16 15:06:29 -0500 |
commit | 73b50c1c92666d326b5fa2c945d46509f2f6d91f (patch) | |
tree | 87e2cc6fed3259a83364ede33d8f4d68173f8175 /fs/ext4/inode.c | |
parent | ba869023eac8354b17acdcff82b851ea8e7b1809 (diff) |
ext4: Fix BUG_ON at fs/buffer.c:652 in no journal mode
Calls to ext4_handle_dirty_metadata should only pass in an inode
pointer for inode-specific metadata, and not for shared metadata
blocks such as inode table blocks, block group descriptors, the
superblock, etc.
The BUG_ON can get tripped when updating a special device (such as a
block device) that is opened (so that i_mapping is set in
fs/block_dev.c) and the file system is mounted in no journal mode.
Addresses-Google-Bug: #2404870
Signed-off-by: Curt Wohlgemuth <curtw@google.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs/ext4/inode.c')
-rw-r--r-- | fs/ext4/inode.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 536067bcf75b..ecac8c5a6f5c 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
@@ -5120,7 +5120,7 @@ static int ext4_do_update_inode(handle_t *handle, | |||
5120 | EXT4_FEATURE_RO_COMPAT_LARGE_FILE); | 5120 | EXT4_FEATURE_RO_COMPAT_LARGE_FILE); |
5121 | sb->s_dirt = 1; | 5121 | sb->s_dirt = 1; |
5122 | ext4_handle_sync(handle); | 5122 | ext4_handle_sync(handle); |
5123 | err = ext4_handle_dirty_metadata(handle, inode, | 5123 | err = ext4_handle_dirty_metadata(handle, NULL, |
5124 | EXT4_SB(sb)->s_sbh); | 5124 | EXT4_SB(sb)->s_sbh); |
5125 | } | 5125 | } |
5126 | } | 5126 | } |
@@ -5149,7 +5149,7 @@ static int ext4_do_update_inode(handle_t *handle, | |||
5149 | } | 5149 | } |
5150 | 5150 | ||
5151 | BUFFER_TRACE(bh, "call ext4_handle_dirty_metadata"); | 5151 | BUFFER_TRACE(bh, "call ext4_handle_dirty_metadata"); |
5152 | rc = ext4_handle_dirty_metadata(handle, inode, bh); | 5152 | rc = ext4_handle_dirty_metadata(handle, NULL, bh); |
5153 | if (!err) | 5153 | if (!err) |
5154 | err = rc; | 5154 | err = rc; |
5155 | ext4_clear_inode_state(inode, EXT4_STATE_NEW); | 5155 | ext4_clear_inode_state(inode, EXT4_STATE_NEW); |
@@ -5701,7 +5701,7 @@ static int ext4_pin_inode(handle_t *handle, struct inode *inode) | |||
5701 | err = jbd2_journal_get_write_access(handle, iloc.bh); | 5701 | err = jbd2_journal_get_write_access(handle, iloc.bh); |
5702 | if (!err) | 5702 | if (!err) |
5703 | err = ext4_handle_dirty_metadata(handle, | 5703 | err = ext4_handle_dirty_metadata(handle, |
5704 | inode, | 5704 | NULL, |
5705 | iloc.bh); | 5705 | iloc.bh); |
5706 | brelse(iloc.bh); | 5706 | brelse(iloc.bh); |
5707 | } | 5707 | } |