aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext3/inode.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ext3/inode.c')
-rw-r--r--fs/ext3/inode.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c
index 05be496c892f1..55531ed7ea499 100644
--- a/fs/ext3/inode.c
+++ b/fs/ext3/inode.c
@@ -708,6 +708,7 @@ ext3_get_block_handle(handle_t *handle, struct inode *inode, sector_t iblock,
int boundary = 0;
int depth = ext3_block_to_path(inode, iblock, offsets, &boundary);
struct ext3_inode_info *ei = EXT3_I(inode);
+ struct super_block *sb = inode->i_sb;
J_ASSERT(handle != NULL || create == 0);
@@ -752,6 +753,13 @@ out:
goal = 0;
down(&ei->truncate_sem);
+
+ /* lazy initialize the block allocation info here if necessary */
+ if (test_opt(sb, RESERVATION) && S_ISREG(inode->i_mode)
+ && (!ei->i_rsv_window)) {
+ ext3_alloc_init_reservation(inode);
+ }
+
if (ext3_find_goal(inode, iblock, chain, partial, &goal) < 0) {
up(&ei->truncate_sem);
goto changed;
@@ -2149,8 +2157,6 @@ void ext3_truncate(struct inode * inode)
if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
return;
- ext3_discard_reservation(inode);
-
/*
* We have to lock the EOF page here, because lock_page() nests
* outside journal_start().
@@ -2275,6 +2281,9 @@ do_indirects:
case EXT3_TIND_BLOCK:
;
}
+
+ ext3_discard_reservation(inode);
+
up(&ei->truncate_sem);
inode->i_mtime = inode->i_ctime = CURRENT_TIME_SEC;
ext3_mark_inode_dirty(handle, inode);
@@ -2494,7 +2503,7 @@ void ext3_read_inode(struct inode * inode)
ei->i_acl = EXT3_ACL_NOT_CACHED;
ei->i_default_acl = EXT3_ACL_NOT_CACHED;
#endif
- ei->i_rsv_window.rsv_end = EXT3_RESERVE_WINDOW_NOT_ALLOCATED;
+ ei->i_rsv_window = NULL;
if (__ext3_get_inode_loc(inode, &iloc, 0))
goto bad_inode;
@@ -2556,10 +2565,6 @@ void ext3_read_inode(struct inode * inode)
ei->i_disksize = inode->i_size;
inode->i_generation = le32_to_cpu(raw_inode->i_generation);
ei->i_block_group = iloc.block_group;
- ei->i_rsv_window.rsv_start = 0;
- ei->i_rsv_window.rsv_end= 0;
- atomic_set(&ei->i_rsv_window.rsv_goal_size, EXT3_DEFAULT_RESERVE_BLOCKS);
- seqlock_init(&ei->i_rsv_window.rsv_seqlock);
/*
* NOTE! The in-memory inode i_data array is in little-endian order
* even on big-endian machines: we do NOT byteswap the block numbers!