|
|
@@ -761,7 +761,8 @@ static loff_t ext2_max_size(int bits)
|
|
|
{
|
|
|
loff_t res = EXT2_NDIR_BLOCKS;
|
|
|
int meta_blocks;
|
|
|
- loff_t upper_limit;
|
|
|
+ unsigned int upper_limit;
|
|
|
+ unsigned int ppb = 1 << (bits-2);
|
|
|
|
|
|
/* This is calculated to be the largest file size for a
|
|
|
* dense, file such that the total number of
|
|
|
@@ -775,24 +776,34 @@ static loff_t ext2_max_size(int bits)
|
|
|
/* total blocks in file system block size */
|
|
|
upper_limit >>= (bits - 9);
|
|
|
|
|
|
+ /* Compute how many blocks we can address by block tree */
|
|
|
+ res += 1LL << (bits-2);
|
|
|
+ res += 1LL << (2*(bits-2));
|
|
|
+ res += 1LL << (3*(bits-2));
|
|
|
+ /* Does block tree limit file size? */
|
|
|
+ if (res < upper_limit)
|
|
|
+ goto check_lfs;
|
|
|
|
|
|
+ res = upper_limit;
|
|
|
+ /* How many metadata blocks are needed for addressing upper_limit? */
|
|
|
+ upper_limit -= EXT2_NDIR_BLOCKS;
|
|
|
/* indirect blocks */
|
|
|
meta_blocks = 1;
|
|
|
+ upper_limit -= ppb;
|
|
|
/* double indirect blocks */
|
|
|
- meta_blocks += 1 + (1LL << (bits-2));
|
|
|
- /* tripple indirect blocks */
|
|
|
- meta_blocks += 1 + (1LL << (bits-2)) + (1LL << (2*(bits-2)));
|
|
|
-
|
|
|
- upper_limit -= meta_blocks;
|
|
|
- upper_limit <<= bits;
|
|
|
-
|
|
|
- res += 1LL << (bits-2);
|
|
|
- res += 1LL << (2*(bits-2));
|
|
|
- res += 1LL << (3*(bits-2));
|
|
|
+ if (upper_limit < ppb * ppb) {
|
|
|
+ meta_blocks += 1 + DIV_ROUND_UP(upper_limit, ppb);
|
|
|
+ res -= meta_blocks;
|
|
|
+ goto check_lfs;
|
|
|
+ }
|
|
|
+ meta_blocks += 1 + ppb;
|
|
|
+ upper_limit -= ppb * ppb;
|
|
|
+ /* tripple indirect blocks for the rest */
|
|
|
+ meta_blocks += 1 + DIV_ROUND_UP(upper_limit, ppb) +
|
|
|
+ DIV_ROUND_UP(upper_limit, ppb*ppb);
|
|
|
+ res -= meta_blocks;
|
|
|
+check_lfs:
|
|
|
res <<= bits;
|
|
|
- if (res > upper_limit)
|
|
|
- res = upper_limit;
|
|
|
-
|
|
|
if (res > MAX_LFS_FILESIZE)
|
|
|
res = MAX_LFS_FILESIZE;
|
|
|
|