diff options
Diffstat (limited to 'fs/ext4/super.c')
-rw-r--r-- | fs/ext4/super.c | 45 |
1 files changed, 42 insertions, 3 deletions
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 64067de70c6f..c79e46b7f159 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
@@ -1600,19 +1600,58 @@ static void ext4_orphan_cleanup (struct super_block * sb, | |||
1600 | #endif | 1600 | #endif |
1601 | sb->s_flags = s_flags; /* Restore MS_RDONLY status */ | 1601 | sb->s_flags = s_flags; /* Restore MS_RDONLY status */ |
1602 | } | 1602 | } |
1603 | /* | ||
1604 | * Maximal extent format file size. | ||
1605 | * Resulting logical blkno at s_maxbytes must fit in our on-disk | ||
1606 | * extent format containers, within a sector_t, and within i_blocks | ||
1607 | * in the vfs. ext4 inode has 48 bits of i_block in fsblock units, | ||
1608 | * so that won't be a limiting factor. | ||
1609 | * | ||
1610 | * Note, this does *not* consider any metadata overhead for vfs i_blocks. | ||
1611 | */ | ||
1612 | static loff_t ext4_max_size(int blkbits) | ||
1613 | { | ||
1614 | loff_t res; | ||
1615 | loff_t upper_limit = MAX_LFS_FILESIZE; | ||
1616 | |||
1617 | /* small i_blocks in vfs inode? */ | ||
1618 | if (sizeof(blkcnt_t) < sizeof(u64)) { | ||
1619 | /* | ||
1620 | * CONFIG_LSF is not enabled implies the inode | ||
1621 | * i_block represent total blocks in 512 bytes | ||
1622 | * 32 == size of vfs inode i_blocks * 8 | ||
1623 | */ | ||
1624 | upper_limit = (1LL << 32) - 1; | ||
1625 | |||
1626 | /* total blocks in file system block size */ | ||
1627 | upper_limit >>= (blkbits - 9); | ||
1628 | upper_limit <<= blkbits; | ||
1629 | } | ||
1630 | |||
1631 | /* 32-bit extent-start container, ee_block */ | ||
1632 | res = 1LL << 32; | ||
1633 | res <<= blkbits; | ||
1634 | res -= 1; | ||
1635 | |||
1636 | /* Sanity check against vm- & vfs- imposed limits */ | ||
1637 | if (res > upper_limit) | ||
1638 | res = upper_limit; | ||
1639 | |||
1640 | return res; | ||
1641 | } | ||
1603 | 1642 | ||
1604 | /* | 1643 | /* |
1605 | * Maximal file size. There is a direct, and {,double-,triple-}indirect | 1644 | * Maximal bitmap file size. There is a direct, and {,double-,triple-}indirect |
1606 | * block limit, and also a limit of (2^48 - 1) 512-byte sectors in i_blocks. | 1645 | * block limit, and also a limit of (2^48 - 1) 512-byte sectors in i_blocks. |
1607 | * We need to be 1 filesystem block less than the 2^48 sector limit. | 1646 | * We need to be 1 filesystem block less than the 2^48 sector limit. |
1608 | */ | 1647 | */ |
1609 | static loff_t ext4_max_size(int bits) | 1648 | static loff_t ext4_max_bitmap_size(int bits) |
1610 | { | 1649 | { |
1611 | loff_t res = EXT4_NDIR_BLOCKS; | 1650 | loff_t res = EXT4_NDIR_BLOCKS; |
1612 | int meta_blocks; | 1651 | int meta_blocks; |
1613 | loff_t upper_limit; | 1652 | loff_t upper_limit; |
1614 | /* This is calculated to be the largest file size for a | 1653 | /* This is calculated to be the largest file size for a |
1615 | * dense, file such that the total number of | 1654 | * dense, bitmapped file such that the total number of |
1616 | * sectors in the file, including data and all indirect blocks, | 1655 | * sectors in the file, including data and all indirect blocks, |
1617 | * does not exceed 2^48 -1 | 1656 | * does not exceed 2^48 -1 |
1618 | * __u32 i_blocks_lo and _u16 i_blocks_high representing the | 1657 | * __u32 i_blocks_lo and _u16 i_blocks_high representing the |