diff options
-rw-r--r-- | fs/ext3/inode.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c index 5f51fed5c750..4d7da6f6184b 100644 --- a/fs/ext3/inode.c +++ b/fs/ext3/inode.c | |||
@@ -1193,15 +1193,16 @@ write_begin_failed: | |||
1193 | * i_size_read because we hold i_mutex. | 1193 | * i_size_read because we hold i_mutex. |
1194 | * | 1194 | * |
1195 | * Add inode to orphan list in case we crash before truncate | 1195 | * Add inode to orphan list in case we crash before truncate |
1196 | * finishes. | 1196 | * finishes. Do this only if ext3_can_truncate() agrees so |
1197 | * that orphan processing code is happy. | ||
1197 | */ | 1198 | */ |
1198 | if (pos + len > inode->i_size) | 1199 | if (pos + len > inode->i_size && ext3_can_truncate(inode)) |
1199 | ext3_orphan_add(handle, inode); | 1200 | ext3_orphan_add(handle, inode); |
1200 | ext3_journal_stop(handle); | 1201 | ext3_journal_stop(handle); |
1201 | unlock_page(page); | 1202 | unlock_page(page); |
1202 | page_cache_release(page); | 1203 | page_cache_release(page); |
1203 | if (pos + len > inode->i_size) | 1204 | if (pos + len > inode->i_size) |
1204 | vmtruncate(inode, inode->i_size); | 1205 | ext3_truncate(inode); |
1205 | } | 1206 | } |
1206 | if (ret == -ENOSPC && ext3_should_retry_alloc(inode->i_sb, &retries)) | 1207 | if (ret == -ENOSPC && ext3_should_retry_alloc(inode->i_sb, &retries)) |
1207 | goto retry; | 1208 | goto retry; |
@@ -1287,7 +1288,7 @@ static int ext3_ordered_write_end(struct file *file, | |||
1287 | * There may be allocated blocks outside of i_size because | 1288 | * There may be allocated blocks outside of i_size because |
1288 | * we failed to copy some data. Prepare for truncate. | 1289 | * we failed to copy some data. Prepare for truncate. |
1289 | */ | 1290 | */ |
1290 | if (pos + len > inode->i_size) | 1291 | if (pos + len > inode->i_size && ext3_can_truncate(inode)) |
1291 | ext3_orphan_add(handle, inode); | 1292 | ext3_orphan_add(handle, inode); |
1292 | ret2 = ext3_journal_stop(handle); | 1293 | ret2 = ext3_journal_stop(handle); |
1293 | if (!ret) | 1294 | if (!ret) |
@@ -1296,7 +1297,7 @@ static int ext3_ordered_write_end(struct file *file, | |||
1296 | page_cache_release(page); | 1297 | page_cache_release(page); |
1297 | 1298 | ||
1298 | if (pos + len > inode->i_size) | 1299 | if (pos + len > inode->i_size) |
1299 | vmtruncate(inode, inode->i_size); | 1300 | ext3_truncate(inode); |
1300 | return ret ? ret : copied; | 1301 | return ret ? ret : copied; |
1301 | } | 1302 | } |
1302 | 1303 | ||
@@ -1315,14 +1316,14 @@ static int ext3_writeback_write_end(struct file *file, | |||
1315 | * There may be allocated blocks outside of i_size because | 1316 | * There may be allocated blocks outside of i_size because |
1316 | * we failed to copy some data. Prepare for truncate. | 1317 | * we failed to copy some data. Prepare for truncate. |
1317 | */ | 1318 | */ |
1318 | if (pos + len > inode->i_size) | 1319 | if (pos + len > inode->i_size && ext3_can_truncate(inode)) |
1319 | ext3_orphan_add(handle, inode); | 1320 | ext3_orphan_add(handle, inode); |
1320 | ret = ext3_journal_stop(handle); | 1321 | ret = ext3_journal_stop(handle); |
1321 | unlock_page(page); | 1322 | unlock_page(page); |
1322 | page_cache_release(page); | 1323 | page_cache_release(page); |
1323 | 1324 | ||
1324 | if (pos + len > inode->i_size) | 1325 | if (pos + len > inode->i_size) |
1325 | vmtruncate(inode, inode->i_size); | 1326 | ext3_truncate(inode); |
1326 | return ret ? ret : copied; | 1327 | return ret ? ret : copied; |
1327 | } | 1328 | } |
1328 | 1329 | ||
@@ -1358,7 +1359,7 @@ static int ext3_journalled_write_end(struct file *file, | |||
1358 | * There may be allocated blocks outside of i_size because | 1359 | * There may be allocated blocks outside of i_size because |
1359 | * we failed to copy some data. Prepare for truncate. | 1360 | * we failed to copy some data. Prepare for truncate. |
1360 | */ | 1361 | */ |
1361 | if (pos + len > inode->i_size) | 1362 | if (pos + len > inode->i_size && ext3_can_truncate(inode)) |
1362 | ext3_orphan_add(handle, inode); | 1363 | ext3_orphan_add(handle, inode); |
1363 | EXT3_I(inode)->i_state |= EXT3_STATE_JDATA; | 1364 | EXT3_I(inode)->i_state |= EXT3_STATE_JDATA; |
1364 | if (inode->i_size > EXT3_I(inode)->i_disksize) { | 1365 | if (inode->i_size > EXT3_I(inode)->i_disksize) { |
@@ -1375,7 +1376,7 @@ static int ext3_journalled_write_end(struct file *file, | |||
1375 | page_cache_release(page); | 1376 | page_cache_release(page); |
1376 | 1377 | ||
1377 | if (pos + len > inode->i_size) | 1378 | if (pos + len > inode->i_size) |
1378 | vmtruncate(inode, inode->i_size); | 1379 | ext3_truncate(inode); |
1379 | return ret ? ret : copied; | 1380 | return ret ? ret : copied; |
1380 | } | 1381 | } |
1381 | 1382 | ||