diff options
Diffstat (limited to 'fs/ext2')
-rw-r--r-- | fs/ext2/balloc.c | 50 | ||||
-rw-r--r-- | fs/ext2/ext2.h | 7 | ||||
-rw-r--r-- | fs/ext2/ioctl.c | 5 | ||||
-rw-r--r-- | fs/ext2/super.c | 32 |
4 files changed, 45 insertions, 49 deletions
diff --git a/fs/ext2/balloc.c b/fs/ext2/balloc.c index 18a42de25b55..377ad172d74b 100644 --- a/fs/ext2/balloc.c +++ b/fs/ext2/balloc.c | |||
@@ -69,14 +69,6 @@ struct ext2_group_desc * ext2_get_group_desc(struct super_block * sb, | |||
69 | return desc + offset; | 69 | return desc + offset; |
70 | } | 70 | } |
71 | 71 | ||
72 | static inline int | ||
73 | block_in_use(unsigned long block, struct super_block *sb, unsigned char *map) | ||
74 | { | ||
75 | return ext2_test_bit ((block - | ||
76 | le32_to_cpu(EXT2_SB(sb)->s_es->s_first_data_block)) % | ||
77 | EXT2_BLOCKS_PER_GROUP(sb), map); | ||
78 | } | ||
79 | |||
80 | /* | 72 | /* |
81 | * Read the bitmap for a given block_group, reading into the specified | 73 | * Read the bitmap for a given block_group, reading into the specified |
82 | * slot in the superblock's bitmap cache. | 74 | * slot in the superblock's bitmap cache. |
@@ -86,51 +78,20 @@ block_in_use(unsigned long block, struct super_block *sb, unsigned char *map) | |||
86 | static struct buffer_head * | 78 | static struct buffer_head * |
87 | read_block_bitmap(struct super_block *sb, unsigned int block_group) | 79 | read_block_bitmap(struct super_block *sb, unsigned int block_group) |
88 | { | 80 | { |
89 | int i; | ||
90 | struct ext2_group_desc * desc; | 81 | struct ext2_group_desc * desc; |
91 | struct buffer_head * bh = NULL; | 82 | struct buffer_head * bh = NULL; |
92 | unsigned int bitmap_blk; | 83 | |
93 | |||
94 | desc = ext2_get_group_desc (sb, block_group, NULL); | 84 | desc = ext2_get_group_desc (sb, block_group, NULL); |
95 | if (!desc) | 85 | if (!desc) |
96 | return NULL; | 86 | goto error_out; |
97 | bitmap_blk = le32_to_cpu(desc->bg_block_bitmap); | 87 | bh = sb_bread(sb, le32_to_cpu(desc->bg_block_bitmap)); |
98 | bh = sb_bread(sb, bitmap_blk); | ||
99 | if (!bh) | 88 | if (!bh) |
100 | ext2_error (sb, __FUNCTION__, | 89 | ext2_error (sb, "read_block_bitmap", |
101 | "Cannot read block bitmap - " | 90 | "Cannot read block bitmap - " |
102 | "block_group = %d, block_bitmap = %u", | 91 | "block_group = %d, block_bitmap = %u", |
103 | block_group, le32_to_cpu(desc->bg_block_bitmap)); | 92 | block_group, le32_to_cpu(desc->bg_block_bitmap)); |
104 | |||
105 | /* check whether block bitmap block number is set */ | ||
106 | if (!block_in_use(bitmap_blk, sb, bh->b_data)) { | ||
107 | /* bad block bitmap */ | ||
108 | goto error_out; | ||
109 | } | ||
110 | /* check whether the inode bitmap block number is set */ | ||
111 | bitmap_blk = le32_to_cpu(desc->bg_inode_bitmap); | ||
112 | if (!block_in_use(bitmap_blk, sb, bh->b_data)) { | ||
113 | /* bad block bitmap */ | ||
114 | goto error_out; | ||
115 | } | ||
116 | /* check whether the inode table block number is set */ | ||
117 | bitmap_blk = le32_to_cpu(desc->bg_inode_table); | ||
118 | for (i = 0; i < EXT2_SB(sb)->s_itb_per_group; i++, bitmap_blk++) { | ||
119 | if (!block_in_use(bitmap_blk, sb, bh->b_data)) { | ||
120 | /* bad block bitmap */ | ||
121 | goto error_out; | ||
122 | } | ||
123 | } | ||
124 | |||
125 | return bh; | ||
126 | |||
127 | error_out: | 93 | error_out: |
128 | brelse(bh); | 94 | return bh; |
129 | ext2_error(sb, __FUNCTION__, | ||
130 | "Invalid block bitmap - " | ||
131 | "block_group = %d, block = %u", | ||
132 | block_group, bitmap_blk); | ||
133 | return NULL; | ||
134 | } | 95 | } |
135 | 96 | ||
136 | static void release_blocks(struct super_block *sb, int count) | 97 | static void release_blocks(struct super_block *sb, int count) |
@@ -1461,7 +1422,6 @@ unsigned long ext2_count_free_blocks (struct super_block * sb) | |||
1461 | #endif | 1422 | #endif |
1462 | } | 1423 | } |
1463 | 1424 | ||
1464 | |||
1465 | static inline int test_root(int a, int b) | 1425 | static inline int test_root(int a, int b) |
1466 | { | 1426 | { |
1467 | int num = b; | 1427 | int num = b; |
diff --git a/fs/ext2/ext2.h b/fs/ext2/ext2.h index 7730388c4931..c87ae29c19cb 100644 --- a/fs/ext2/ext2.h +++ b/fs/ext2/ext2.h | |||
@@ -178,3 +178,10 @@ extern const struct inode_operations ext2_special_inode_operations; | |||
178 | /* symlink.c */ | 178 | /* symlink.c */ |
179 | extern const struct inode_operations ext2_fast_symlink_inode_operations; | 179 | extern const struct inode_operations ext2_fast_symlink_inode_operations; |
180 | extern const struct inode_operations ext2_symlink_inode_operations; | 180 | extern const struct inode_operations ext2_symlink_inode_operations; |
181 | |||
182 | static inline ext2_fsblk_t | ||
183 | ext2_group_first_block_no(struct super_block *sb, unsigned long group_no) | ||
184 | { | ||
185 | return group_no * (ext2_fsblk_t)EXT2_BLOCKS_PER_GROUP(sb) + | ||
186 | le32_to_cpu(EXT2_SB(sb)->s_es->s_first_data_block); | ||
187 | } | ||
diff --git a/fs/ext2/ioctl.c b/fs/ext2/ioctl.c index c2324d5fe4ac..320b2cb3d4d2 100644 --- a/fs/ext2/ioctl.c +++ b/fs/ext2/ioctl.c | |||
@@ -47,6 +47,11 @@ int ext2_ioctl (struct inode * inode, struct file * filp, unsigned int cmd, | |||
47 | flags &= ~EXT2_DIRSYNC_FL; | 47 | flags &= ~EXT2_DIRSYNC_FL; |
48 | 48 | ||
49 | mutex_lock(&inode->i_mutex); | 49 | mutex_lock(&inode->i_mutex); |
50 | /* Is it quota file? Do not allow user to mess with it */ | ||
51 | if (IS_NOQUOTA(inode)) { | ||
52 | mutex_unlock(&inode->i_mutex); | ||
53 | return -EPERM; | ||
54 | } | ||
50 | oldflags = ei->i_flags; | 55 | oldflags = ei->i_flags; |
51 | 56 | ||
52 | /* | 57 | /* |
diff --git a/fs/ext2/super.c b/fs/ext2/super.c index 154e25f13d77..6abaf75163f0 100644 --- a/fs/ext2/super.c +++ b/fs/ext2/super.c | |||
@@ -680,11 +680,31 @@ static int ext2_check_descriptors (struct super_block * sb) | |||
680 | static loff_t ext2_max_size(int bits) | 680 | static loff_t ext2_max_size(int bits) |
681 | { | 681 | { |
682 | loff_t res = EXT2_NDIR_BLOCKS; | 682 | loff_t res = EXT2_NDIR_BLOCKS; |
683 | /* This constant is calculated to be the largest file size for a | 683 | int meta_blocks; |
684 | * dense, 4k-blocksize file such that the total number of | 684 | loff_t upper_limit; |
685 | |||
686 | /* This is calculated to be the largest file size for a | ||
687 | * dense, file such that the total number of | ||
685 | * sectors in the file, including data and all indirect blocks, | 688 | * sectors in the file, including data and all indirect blocks, |
686 | * does not exceed 2^32. */ | 689 | * does not exceed 2^32 -1 |
687 | const loff_t upper_limit = 0x1ff7fffd000LL; | 690 | * __u32 i_blocks representing the total number of |
691 | * 512 bytes blocks of the file | ||
692 | */ | ||
693 | upper_limit = (1LL << 32) - 1; | ||
694 | |||
695 | /* total blocks in file system block size */ | ||
696 | upper_limit >>= (bits - 9); | ||
697 | |||
698 | |||
699 | /* indirect blocks */ | ||
700 | meta_blocks = 1; | ||
701 | /* double indirect blocks */ | ||
702 | meta_blocks += 1 + (1LL << (bits-2)); | ||
703 | /* tripple indirect blocks */ | ||
704 | meta_blocks += 1 + (1LL << (bits-2)) + (1LL << (2*(bits-2))); | ||
705 | |||
706 | upper_limit -= meta_blocks; | ||
707 | upper_limit <<= bits; | ||
688 | 708 | ||
689 | res += 1LL << (bits-2); | 709 | res += 1LL << (bits-2); |
690 | res += 1LL << (2*(bits-2)); | 710 | res += 1LL << (2*(bits-2)); |
@@ -692,6 +712,10 @@ static loff_t ext2_max_size(int bits) | |||
692 | res <<= bits; | 712 | res <<= bits; |
693 | if (res > upper_limit) | 713 | if (res > upper_limit) |
694 | res = upper_limit; | 714 | res = upper_limit; |
715 | |||
716 | if (res > MAX_LFS_FILESIZE) | ||
717 | res = MAX_LFS_FILESIZE; | ||
718 | |||
695 | return res; | 719 | return res; |
696 | } | 720 | } |
697 | 721 | ||