|
@@ -788,7 +788,7 @@ err_out:
|
|
|
int ext3_get_blocks_handle(handle_t *handle, struct inode *inode,
|
|
|
sector_t iblock, unsigned long maxblocks,
|
|
|
struct buffer_head *bh_result,
|
|
|
- int create, int extend_disksize)
|
|
|
+ int create)
|
|
|
{
|
|
|
int err = -EIO;
|
|
|
int offsets[4];
|
|
@@ -911,13 +911,6 @@ int ext3_get_blocks_handle(handle_t *handle, struct inode *inode,
|
|
|
if (!err)
|
|
|
err = ext3_splice_branch(handle, inode, iblock,
|
|
|
partial, indirect_blks, count);
|
|
|
- /*
|
|
|
- * i_disksize growing is protected by truncate_mutex. Don't forget to
|
|
|
- * protect it if you're about to implement concurrent
|
|
|
- * ext3_get_block() -bzzz
|
|
|
- */
|
|
|
- if (!err && extend_disksize && inode->i_size > ei->i_disksize)
|
|
|
- ei->i_disksize = inode->i_size;
|
|
|
mutex_unlock(&ei->truncate_mutex);
|
|
|
if (err)
|
|
|
goto cleanup;
|
|
@@ -972,7 +965,7 @@ static int ext3_get_block(struct inode *inode, sector_t iblock,
|
|
|
}
|
|
|
|
|
|
ret = ext3_get_blocks_handle(handle, inode, iblock,
|
|
|
- max_blocks, bh_result, create, 0);
|
|
|
+ max_blocks, bh_result, create);
|
|
|
if (ret > 0) {
|
|
|
bh_result->b_size = (ret << inode->i_blkbits);
|
|
|
ret = 0;
|
|
@@ -1005,7 +998,7 @@ struct buffer_head *ext3_getblk(handle_t *handle, struct inode *inode,
|
|
|
dummy.b_blocknr = -1000;
|
|
|
buffer_trace_init(&dummy.b_history);
|
|
|
err = ext3_get_blocks_handle(handle, inode, block, 1,
|
|
|
- &dummy, create, 1);
|
|
|
+ &dummy, create);
|
|
|
/*
|
|
|
* ext3_get_blocks_handle() returns number of blocks
|
|
|
* mapped. 0 in case of a HOLE.
|
|
@@ -1193,15 +1186,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 +1281,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 +1290,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 +1309,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 +1352,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 +1369,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;
|
|
|
}
|
|
|
|