2017-12-18 06:00:59 +03:00
// SPDX-License-Identifier: GPL-2.0
2011-06-28 03:16:04 +04:00
/*
* linux / fs / ext4 / truncate . h
*
* Common inline functions needed for truncate support
*/
/*
* Truncate blocks that were not used by write . We have to truncate the
* pagecache as well so that corresponding buffers get properly unmapped .
*/
static inline void ext4_truncate_failed_write ( struct inode * inode )
{
2018-07-30 00:00:22 +03:00
/*
* We don ' t need to call ext4_break_layouts ( ) because the blocks we
* are truncating were never visible to userspace .
*/
2015-12-07 22:28:03 +03:00
down_write ( & EXT4_I ( inode ) - > i_mmap_sem ) ;
2011-06-28 03:16:04 +04:00
truncate_inode_pages ( inode - > i_mapping , inode - > i_size ) ;
ext4_truncate ( inode ) ;
2015-12-07 22:28:03 +03:00
up_write ( & EXT4_I ( inode ) - > i_mmap_sem ) ;
2011-06-28 03:16:04 +04:00
}
/*
* Work out how many blocks we need to proceed with the next chunk of a
* truncate transaction .
*/
static inline unsigned long ext4_blocks_for_truncate ( struct inode * inode )
{
ext4_lblk_t needed ;
needed = inode - > i_blocks > > ( inode - > i_sb - > s_blocksize_bits - 9 ) ;
/* Give ourselves just enough room to cope with inodes in which
* i_blocks is corrupt : we ' ve seen disk corruptions in the past
* which resulted in random data in an inode which looked enough
* like a regular file for ext4 to try to delete it . Things
* will go a bit crazy if that happens , but at least we should
* try not to panic the whole kernel . */
if ( needed < 2 )
needed = 2 ;
/* But we need to bound the transaction so we don't overflow the
* journal . */
if ( needed > EXT4_MAX_TRANS_DATA )
needed = EXT4_MAX_TRANS_DATA ;
return EXT4_DATA_TRANS_BLOCKS ( inode - > i_sb ) + needed ;
}