aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext2
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ext2')
-rw-r--r--fs/ext2/balloc.c50
-rw-r--r--fs/ext2/ext2.h7
-rw-r--r--fs/ext2/ioctl.c5
-rw-r--r--fs/ext2/super.c32
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
72static inline int
73block_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)
86static struct buffer_head * 78static struct buffer_head *
87read_block_bitmap(struct super_block *sb, unsigned int block_group) 79read_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
127error_out: 93error_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
136static void release_blocks(struct super_block *sb, int count) 97static 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
1465static inline int test_root(int a, int b) 1425static 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 */
179extern const struct inode_operations ext2_fast_symlink_inode_operations; 179extern const struct inode_operations ext2_fast_symlink_inode_operations;
180extern const struct inode_operations ext2_symlink_inode_operations; 180extern const struct inode_operations ext2_symlink_inode_operations;
181
182static inline ext2_fsblk_t
183ext2_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)
680static loff_t ext2_max_size(int bits) 680static 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