Messages in this thread Patch in this message | | | Date | Mon, 12 Sep 2011 11:31:29 -0400 | From | Christoph Hellwig <> | Subject | Re: Kernel 3.1.0-rc4 oops when connecting iPod |
| |
Yes, the shifts were the wrong way around. I'll leave the 9 in for now, we use it in so many places and if we're going to clean it up I'd do it in ne go.
Index: linux-2.6/fs/hfsplus/super.c =================================================================== --- linux-2.6.orig/fs/hfsplus/super.c 2011-09-12 11:20:33.866598100 -0400 +++ linux-2.6/fs/hfsplus/super.c 2011-09-12 11:20:52.538098052 -0400 @@ -344,6 +344,7 @@ static int hfsplus_fill_super(struct sup struct inode *root, *inode; struct qstr str; struct nls_table *nls = NULL; + u64 last_fs_block, last_fs_page; int err; err = -EINVAL; @@ -399,9 +400,13 @@ static int hfsplus_fill_super(struct sup if (!sbi->rsrc_clump_blocks) sbi->rsrc_clump_blocks = 1; - err = generic_check_addressable(sbi->alloc_blksz_shift, - sbi->total_blocks); - if (err) { + err = -EFBIG; + last_fs_block = sbi->total_blocks - 1; + 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"); goto out_free_vhdr; }
| |