diff options
-rw-r--r-- | fs/ext4/inode.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 0ac31a06422b..2a9ffd528dd1 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
@@ -1149,6 +1149,7 @@ int ext4_get_blocks_wrap(handle_t *handle, struct inode *inode, sector_t block, | |||
1149 | int retval; | 1149 | int retval; |
1150 | 1150 | ||
1151 | clear_buffer_mapped(bh); | 1151 | clear_buffer_mapped(bh); |
1152 | clear_buffer_unwritten(bh); | ||
1152 | 1153 | ||
1153 | /* | 1154 | /* |
1154 | * Try to see if we can get the block without requesting | 1155 | * Try to see if we can get the block without requesting |
@@ -1179,6 +1180,18 @@ int ext4_get_blocks_wrap(handle_t *handle, struct inode *inode, sector_t block, | |||
1179 | return retval; | 1180 | return retval; |
1180 | 1181 | ||
1181 | /* | 1182 | /* |
1183 | * When we call get_blocks without the create flag, the | ||
1184 | * BH_Unwritten flag could have gotten set if the blocks | ||
1185 | * requested were part of a uninitialized extent. We need to | ||
1186 | * clear this flag now that we are committed to convert all or | ||
1187 | * part of the uninitialized extent to be an initialized | ||
1188 | * extent. This is because we need to avoid the combination | ||
1189 | * of BH_Unwritten and BH_Mapped flags being simultaneously | ||
1190 | * set on the buffer_head. | ||
1191 | */ | ||
1192 | clear_buffer_unwritten(bh); | ||
1193 | |||
1194 | /* | ||
1182 | * New blocks allocate and/or writing to uninitialized extent | 1195 | * New blocks allocate and/or writing to uninitialized extent |
1183 | * will possibly result in updating i_data, so we take | 1196 | * will possibly result in updating i_data, so we take |
1184 | * the write lock of i_data_sem, and call get_blocks() | 1197 | * the write lock of i_data_sem, and call get_blocks() |