linux/fs/ext4/truncate.h
<<
>>
Prefs
   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 */
  11static inline void ext4_truncate_failed_write(struct inode *inode)
  12{
  13        truncate_inode_pages(inode->i_mapping, inode->i_size);
  14        ext4_truncate(inode);
  15}
  16
  17/*
  18 * Work out how many blocks we need to proceed with the next chunk of a
  19 * truncate transaction.
  20 */
  21static inline unsigned long ext4_blocks_for_truncate(struct inode *inode)
  22{
  23        ext4_lblk_t needed;
  24
  25        needed = inode->i_blocks >> (inode->i_sb->s_blocksize_bits - 9);
  26
  27        /* Give ourselves just enough room to cope with inodes in which
  28         * i_blocks is corrupt: we've seen disk corruptions in the past
  29         * which resulted in random data in an inode which looked enough
  30         * like a regular file for ext4 to try to delete it.  Things
  31         * will go a bit crazy if that happens, but at least we should
  32         * try not to panic the whole kernel. */
  33        if (needed < 2)
  34                needed = 2;
  35
  36        /* But we need to bound the transaction so we don't overflow the
  37         * journal. */
  38        if (needed > EXT4_MAX_TRANS_DATA)
  39                needed = EXT4_MAX_TRANS_DATA;
  40
  41        return EXT4_DATA_TRANS_BLOCKS(inode->i_sb) + needed;
  42}
  43
  44