hfsplus: fix filesystem size checks
generic_check_addressable can't deal with hfsplus's larger than page size allocation blocks, so simply opencode the checks that we actually need in hfsplus_fill_super. Signed-off-by: Christoph Hellwig <hch@tuxera.com> Reported-by: Pavel Ivanov <paivanof@gmail.com> Tested-by: Pavel Ivanov <paivanof@gmail.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
f588c960fc
commit
f1fcd9f0e9
1 changed files with 8 additions and 3 deletions
|
@ -344,6 +344,7 @@ static int hfsplus_fill_super(struct super_block *sb, void *data, int silent)
|
||||||
struct inode *root, *inode;
|
struct inode *root, *inode;
|
||||||
struct qstr str;
|
struct qstr str;
|
||||||
struct nls_table *nls = NULL;
|
struct nls_table *nls = NULL;
|
||||||
|
u64 last_fs_block, last_fs_page;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
err = -EINVAL;
|
err = -EINVAL;
|
||||||
|
@ -399,9 +400,13 @@ static int hfsplus_fill_super(struct super_block *sb, void *data, int silent)
|
||||||
if (!sbi->rsrc_clump_blocks)
|
if (!sbi->rsrc_clump_blocks)
|
||||||
sbi->rsrc_clump_blocks = 1;
|
sbi->rsrc_clump_blocks = 1;
|
||||||
|
|
||||||
err = generic_check_addressable(sbi->alloc_blksz_shift,
|
err = -EFBIG;
|
||||||
sbi->total_blocks);
|
last_fs_block = sbi->total_blocks - 1;
|
||||||
if (err) {
|
last_fs_page = (last_fs_block << sbi->alloc_blksz_shift) >>
|
||||||
|
PAGE_CACHE_SHIFT;
|
||||||
|
|
||||||
|
if ((last_fs_block > (sector_t)(~0ULL) >> (sbi->alloc_blksz_shift - 9)) ||
|
||||||
|
(last_fs_page > (pgoff_t)(~0ULL))) {
|
||||||
printk(KERN_ERR "hfs: filesystem size too large.\n");
|
printk(KERN_ERR "hfs: filesystem size too large.\n");
|
||||||
goto out_free_vhdr;
|
goto out_free_vhdr;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue