Theodore Ts'o | 9f125d6 | 2011-06-27 19:16:04 -0400 | [diff] [blame] | 1 | /* |
| 2 | * linux/fs/ext4/truncate.h |
| 3 | * |
| 4 | * Common inline functions needed for truncate support |
| 5 | */ |
| 6 | |
| 7 | /* |
| 8 | * Truncate blocks that were not used by write. We have to truncate the |
| 9 | * pagecache as well so that corresponding buffers get properly unmapped. |
| 10 | */ |
| 11 | static inline void ext4_truncate_failed_write(struct inode *inode) |
| 12 | { |
Jan Kara | ea3d720 | 2015-12-07 14:28:03 -0500 | [diff] [blame] | 13 | down_write(&EXT4_I(inode)->i_mmap_sem); |
Theodore Ts'o | 9f125d6 | 2011-06-27 19:16:04 -0400 | [diff] [blame] | 14 | truncate_inode_pages(inode->i_mapping, inode->i_size); |
| 15 | ext4_truncate(inode); |
Jan Kara | ea3d720 | 2015-12-07 14:28:03 -0500 | [diff] [blame] | 16 | up_write(&EXT4_I(inode)->i_mmap_sem); |
Theodore Ts'o | 9f125d6 | 2011-06-27 19:16:04 -0400 | [diff] [blame] | 17 | } |
| 18 | |
| 19 | /* |
| 20 | * Work out how many blocks we need to proceed with the next chunk of a |
| 21 | * truncate transaction. |
| 22 | */ |
| 23 | static inline unsigned long ext4_blocks_for_truncate(struct inode *inode) |
| 24 | { |
| 25 | ext4_lblk_t needed; |
| 26 | |
| 27 | needed = inode->i_blocks >> (inode->i_sb->s_blocksize_bits - 9); |
| 28 | |
| 29 | /* Give ourselves just enough room to cope with inodes in which |
| 30 | * i_blocks is corrupt: we've seen disk corruptions in the past |
| 31 | * which resulted in random data in an inode which looked enough |
| 32 | * like a regular file for ext4 to try to delete it. Things |
| 33 | * will go a bit crazy if that happens, but at least we should |
| 34 | * try not to panic the whole kernel. */ |
| 35 | if (needed < 2) |
| 36 | needed = 2; |
| 37 | |
| 38 | /* But we need to bound the transaction so we don't overflow the |
| 39 | * journal. */ |
| 40 | if (needed > EXT4_MAX_TRANS_DATA) |
| 41 | needed = EXT4_MAX_TRANS_DATA; |
| 42 | |
| 43 | return EXT4_DATA_TRANS_BLOCKS(inode->i_sb) + needed; |
| 44 | } |
| 45 | |