From: Aneesh Kumar K.V Date: Tue, 2 Jun 2009 12:09:25 +0000 (-0400) Subject: ext4: Fix discard of inode prealloc space with delayed allocation. X-Git-Tag: v2.6.27.25~12 X-Git-Url: http://git.openpandora.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5f1839fa7f1f9431fe85dc512ed765caf96bdc1f;p=pandora-kernel.git ext4: Fix discard of inode prealloc space with delayed allocation. (cherry picked from commit d6014301b5599fba395c42a1e96a7fe86f7d0b2d) With delayed allocation we should not/cannot discard inode prealloc space during file close. We would still have dirty pages for which we haven't allocated blocks yet. With this fix after each get_blocks request we check whether we have zero reserved blocks and if yes and we don't have any writers on the file we discard inode prealloc space. Signed-off-by: Aneesh Kumar K.V Signed-off-by: "Theodore Ts'o" Signed-off-by: Greg Kroah-Hartman --- diff --git a/fs/ext4/file.c b/fs/ext4/file.c index b080072bc507..c0d02f82c920 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c @@ -39,7 +39,8 @@ static int ext4_release_file (struct inode * inode, struct file * filp) } /* if we are the last writer on the inode, drop the block reservation */ if ((filp->f_mode & FMODE_WRITE) && - (atomic_read(&inode->i_writecount) == 1)) + (atomic_read(&inode->i_writecount) == 1) && + !EXT4_I(inode)->i_reserved_data_blocks) { down_write(&EXT4_I(inode)->i_data_sem); ext4_discard_reservation(inode); diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 89eb1dc24d7a..06fe69415d9c 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -1046,6 +1046,14 @@ static void ext4_da_update_reserve_space(struct inode *inode, int used) EXT4_I(inode)->i_reserved_meta_blocks = mdb; EXT4_I(inode)->i_allocated_meta_blocks = 0; spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); + + /* + * If we have done all the pending block allocations and if + * there aren't any writers on the inode, we can discard the + * inode's preallocations. + */ + if (!total && (atomic_read(&inode->i_writecount) == 0)) + ext4_discard_reservation(inode); } /*