|
@@ -1193,15 +1193,16 @@ write_begin_failed:
|
|
|
* i_size_read because we hold i_mutex.
|
|
|
*
|
|
|
* Add inode to orphan list in case we crash before truncate
|
|
|
- * finishes.
|
|
|
+ * finishes. Do this only if ext3_can_truncate() agrees so
|
|
|
+ * that orphan processing code is happy.
|
|
|
*/
|
|
|
- if (pos + len > inode->i_size)
|
|
|
+ if (pos + len > inode->i_size && ext3_can_truncate(inode))
|
|
|
ext3_orphan_add(handle, inode);
|
|
|
ext3_journal_stop(handle);
|
|
|
unlock_page(page);
|
|
|
page_cache_release(page);
|
|
|
if (pos + len > inode->i_size)
|
|
|
- vmtruncate(inode, inode->i_size);
|
|
|
+ ext3_truncate(inode);
|
|
|
}
|
|
|
if (ret == -ENOSPC && ext3_should_retry_alloc(inode->i_sb, &retries))
|
|
|
goto retry;
|
|
@@ -1287,7 +1288,7 @@ static int ext3_ordered_write_end(struct file *file,
|
|
|
* There may be allocated blocks outside of i_size because
|
|
|
* we failed to copy some data. Prepare for truncate.
|
|
|
*/
|
|
|
- if (pos + len > inode->i_size)
|
|
|
+ if (pos + len > inode->i_size && ext3_can_truncate(inode))
|
|
|
ext3_orphan_add(handle, inode);
|
|
|
ret2 = ext3_journal_stop(handle);
|
|
|
if (!ret)
|
|
@@ -1296,7 +1297,7 @@ static int ext3_ordered_write_end(struct file *file,
|
|
|
page_cache_release(page);
|
|
|
|
|
|
if (pos + len > inode->i_size)
|
|
|
- vmtruncate(inode, inode->i_size);
|
|
|
+ ext3_truncate(inode);
|
|
|
return ret ? ret : copied;
|
|
|
}
|
|
|
|
|
@@ -1315,14 +1316,14 @@ static int ext3_writeback_write_end(struct file *file,
|
|
|
* There may be allocated blocks outside of i_size because
|
|
|
* we failed to copy some data. Prepare for truncate.
|
|
|
*/
|
|
|
- if (pos + len > inode->i_size)
|
|
|
+ if (pos + len > inode->i_size && ext3_can_truncate(inode))
|
|
|
ext3_orphan_add(handle, inode);
|
|
|
ret = ext3_journal_stop(handle);
|
|
|
unlock_page(page);
|
|
|
page_cache_release(page);
|
|
|
|
|
|
if (pos + len > inode->i_size)
|
|
|
- vmtruncate(inode, inode->i_size);
|
|
|
+ ext3_truncate(inode);
|
|
|
return ret ? ret : copied;
|
|
|
}
|
|
|
|
|
@@ -1358,7 +1359,7 @@ static int ext3_journalled_write_end(struct file *file,
|
|
|
* There may be allocated blocks outside of i_size because
|
|
|
* we failed to copy some data. Prepare for truncate.
|
|
|
*/
|
|
|
- if (pos + len > inode->i_size)
|
|
|
+ if (pos + len > inode->i_size && ext3_can_truncate(inode))
|
|
|
ext3_orphan_add(handle, inode);
|
|
|
EXT3_I(inode)->i_state |= EXT3_STATE_JDATA;
|
|
|
if (inode->i_size > EXT3_I(inode)->i_disksize) {
|
|
@@ -1375,7 +1376,7 @@ static int ext3_journalled_write_end(struct file *file,
|
|
|
page_cache_release(page);
|
|
|
|
|
|
if (pos + len > inode->i_size)
|
|
|
- vmtruncate(inode, inode->i_size);
|
|
|
+ ext3_truncate(inode);
|
|
|
return ret ? ret : copied;
|
|
|
}
|
|
|
|