Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4
* 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4: ext4: Remove bogus BUG() check in ext4_bmap() ext4: Fix building with EXT4FS_DEBUG ext4: Initialize the new group descriptor when resizing the filesystem ext4: Fix ext4_free_blocks() w/o a journal when files have indirect blocks jbd2: On a __journal_expect() assertion failure printk "JBD2", not "EXT3-fs" ext3: Add sanity check to make_indexed_dir ext4: Add sanity check to make_indexed_dir ext4: only use i_size_high for regular files ext4: fix wrong use of do_div
This commit is contained in:
commit
c01a25e7cf
@ -1358,7 +1358,7 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry,
|
|||||||
struct fake_dirent *fde;
|
struct fake_dirent *fde;
|
||||||
|
|
||||||
blocksize = dir->i_sb->s_blocksize;
|
blocksize = dir->i_sb->s_blocksize;
|
||||||
dxtrace(printk("Creating index\n"));
|
dxtrace(printk(KERN_DEBUG "Creating index: inode %lu\n", dir->i_ino));
|
||||||
retval = ext3_journal_get_write_access(handle, bh);
|
retval = ext3_journal_get_write_access(handle, bh);
|
||||||
if (retval) {
|
if (retval) {
|
||||||
ext3_std_error(dir->i_sb, retval);
|
ext3_std_error(dir->i_sb, retval);
|
||||||
@ -1367,6 +1367,19 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry,
|
|||||||
}
|
}
|
||||||
root = (struct dx_root *) bh->b_data;
|
root = (struct dx_root *) bh->b_data;
|
||||||
|
|
||||||
|
/* The 0th block becomes the root, move the dirents out */
|
||||||
|
fde = &root->dotdot;
|
||||||
|
de = (struct ext3_dir_entry_2 *)((char *)fde +
|
||||||
|
ext3_rec_len_from_disk(fde->rec_len));
|
||||||
|
if ((char *) de >= (((char *) root) + blocksize)) {
|
||||||
|
ext3_error(dir->i_sb, __func__,
|
||||||
|
"invalid rec_len for '..' in inode %lu",
|
||||||
|
dir->i_ino);
|
||||||
|
brelse(bh);
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
len = ((char *) root) + blocksize - (char *) de;
|
||||||
|
|
||||||
bh2 = ext3_append (handle, dir, &block, &retval);
|
bh2 = ext3_append (handle, dir, &block, &retval);
|
||||||
if (!(bh2)) {
|
if (!(bh2)) {
|
||||||
brelse(bh);
|
brelse(bh);
|
||||||
@ -1375,11 +1388,6 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry,
|
|||||||
EXT3_I(dir)->i_flags |= EXT3_INDEX_FL;
|
EXT3_I(dir)->i_flags |= EXT3_INDEX_FL;
|
||||||
data1 = bh2->b_data;
|
data1 = bh2->b_data;
|
||||||
|
|
||||||
/* The 0th block becomes the root, move the dirents out */
|
|
||||||
fde = &root->dotdot;
|
|
||||||
de = (struct ext3_dir_entry_2 *)((char *)fde +
|
|
||||||
ext3_rec_len_from_disk(fde->rec_len));
|
|
||||||
len = ((char *) root) + blocksize - (char *) de;
|
|
||||||
memcpy (data1, de, len);
|
memcpy (data1, de, len);
|
||||||
de = (struct ext3_dir_entry_2 *) data1;
|
de = (struct ext3_dir_entry_2 *) data1;
|
||||||
top = data1 + len;
|
top = data1 + len;
|
||||||
|
@ -684,15 +684,15 @@ ext4_fsblk_t ext4_count_free_blocks(struct super_block *sb)
|
|||||||
gdp = ext4_get_group_desc(sb, i, NULL);
|
gdp = ext4_get_group_desc(sb, i, NULL);
|
||||||
if (!gdp)
|
if (!gdp)
|
||||||
continue;
|
continue;
|
||||||
desc_count += le16_to_cpu(gdp->bg_free_blocks_count);
|
desc_count += ext4_free_blks_count(sb, gdp);
|
||||||
brelse(bitmap_bh);
|
brelse(bitmap_bh);
|
||||||
bitmap_bh = ext4_read_block_bitmap(sb, i);
|
bitmap_bh = ext4_read_block_bitmap(sb, i);
|
||||||
if (bitmap_bh == NULL)
|
if (bitmap_bh == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
x = ext4_count_free(bitmap_bh, sb->s_blocksize);
|
x = ext4_count_free(bitmap_bh, sb->s_blocksize);
|
||||||
printk(KERN_DEBUG "group %lu: stored = %d, counted = %u\n",
|
printk(KERN_DEBUG "group %u: stored = %d, counted = %u\n",
|
||||||
i, le16_to_cpu(gdp->bg_free_blocks_count), x);
|
i, ext4_free_blks_count(sb, gdp), x);
|
||||||
bitmap_count += x;
|
bitmap_count += x;
|
||||||
}
|
}
|
||||||
brelse(bitmap_bh);
|
brelse(bitmap_bh);
|
||||||
|
@ -1206,8 +1206,11 @@ static inline void ext4_r_blocks_count_set(struct ext4_super_block *es,
|
|||||||
|
|
||||||
static inline loff_t ext4_isize(struct ext4_inode *raw_inode)
|
static inline loff_t ext4_isize(struct ext4_inode *raw_inode)
|
||||||
{
|
{
|
||||||
return ((loff_t)le32_to_cpu(raw_inode->i_size_high) << 32) |
|
if (S_ISREG(le16_to_cpu(raw_inode->i_mode)))
|
||||||
le32_to_cpu(raw_inode->i_size_lo);
|
return ((loff_t)le32_to_cpu(raw_inode->i_size_high) << 32) |
|
||||||
|
le32_to_cpu(raw_inode->i_size_lo);
|
||||||
|
else
|
||||||
|
return (loff_t) le32_to_cpu(raw_inode->i_size_lo);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void ext4_isize_set(struct ext4_inode *raw_inode, loff_t i_size)
|
static inline void ext4_isize_set(struct ext4_inode *raw_inode, loff_t i_size)
|
||||||
|
@ -3048,7 +3048,7 @@ retry:
|
|||||||
WARN_ON(ret <= 0);
|
WARN_ON(ret <= 0);
|
||||||
printk(KERN_ERR "%s: ext4_ext_get_blocks "
|
printk(KERN_ERR "%s: ext4_ext_get_blocks "
|
||||||
"returned error inode#%lu, block=%u, "
|
"returned error inode#%lu, block=%u, "
|
||||||
"max_blocks=%lu", __func__,
|
"max_blocks=%u", __func__,
|
||||||
inode->i_ino, block, max_blocks);
|
inode->i_ino, block, max_blocks);
|
||||||
#endif
|
#endif
|
||||||
ext4_mark_inode_dirty(handle, inode);
|
ext4_mark_inode_dirty(handle, inode);
|
||||||
|
@ -360,9 +360,9 @@ static int ext4_block_to_path(struct inode *inode,
|
|||||||
final = ptrs;
|
final = ptrs;
|
||||||
} else {
|
} else {
|
||||||
ext4_warning(inode->i_sb, "ext4_block_to_path",
|
ext4_warning(inode->i_sb, "ext4_block_to_path",
|
||||||
"block %lu > max",
|
"block %lu > max in inode %lu",
|
||||||
i_block + direct_blocks +
|
i_block + direct_blocks +
|
||||||
indirect_blocks + double_blocks);
|
indirect_blocks + double_blocks, inode->i_ino);
|
||||||
}
|
}
|
||||||
if (boundary)
|
if (boundary)
|
||||||
*boundary = final - 1 - (i_block & (ptrs - 1));
|
*boundary = final - 1 - (i_block & (ptrs - 1));
|
||||||
@ -2821,9 +2821,6 @@ static sector_t ext4_bmap(struct address_space *mapping, sector_t block)
|
|||||||
filemap_write_and_wait(mapping);
|
filemap_write_and_wait(mapping);
|
||||||
}
|
}
|
||||||
|
|
||||||
BUG_ON(!EXT4_JOURNAL(inode) &&
|
|
||||||
EXT4_I(inode)->i_state & EXT4_STATE_JDATA);
|
|
||||||
|
|
||||||
if (EXT4_JOURNAL(inode) && EXT4_I(inode)->i_state & EXT4_STATE_JDATA) {
|
if (EXT4_JOURNAL(inode) && EXT4_I(inode)->i_state & EXT4_STATE_JDATA) {
|
||||||
/*
|
/*
|
||||||
* This is a REALLY heavyweight approach, but the use of
|
* This is a REALLY heavyweight approach, but the use of
|
||||||
@ -3622,7 +3619,7 @@ static void ext4_free_data(handle_t *handle, struct inode *inode,
|
|||||||
* block pointed to itself, it would have been detached when
|
* block pointed to itself, it would have been detached when
|
||||||
* the block was cleared. Check for this instead of OOPSing.
|
* the block was cleared. Check for this instead of OOPSing.
|
||||||
*/
|
*/
|
||||||
if (bh2jh(this_bh))
|
if ((EXT4_JOURNAL(inode) == NULL) || bh2jh(this_bh))
|
||||||
ext4_handle_dirty_metadata(handle, inode, this_bh);
|
ext4_handle_dirty_metadata(handle, inode, this_bh);
|
||||||
else
|
else
|
||||||
ext4_error(inode->i_sb, __func__,
|
ext4_error(inode->i_sb, __func__,
|
||||||
|
@ -3025,7 +3025,7 @@ ext4_mb_mark_diskspace_used(struct ext4_allocation_context *ac,
|
|||||||
goto out_err;
|
goto out_err;
|
||||||
|
|
||||||
ext4_debug("using block group %u(%d)\n", ac->ac_b_ex.fe_group,
|
ext4_debug("using block group %u(%d)\n", ac->ac_b_ex.fe_group,
|
||||||
gdp->bg_free_blocks_count);
|
ext4_free_blks_count(sb, gdp));
|
||||||
|
|
||||||
err = ext4_journal_get_write_access(handle, gdp_bh);
|
err = ext4_journal_get_write_access(handle, gdp_bh);
|
||||||
if (err)
|
if (err)
|
||||||
|
@ -1368,7 +1368,7 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry,
|
|||||||
struct fake_dirent *fde;
|
struct fake_dirent *fde;
|
||||||
|
|
||||||
blocksize = dir->i_sb->s_blocksize;
|
blocksize = dir->i_sb->s_blocksize;
|
||||||
dxtrace(printk(KERN_DEBUG "Creating index\n"));
|
dxtrace(printk(KERN_DEBUG "Creating index: inode %lu\n", dir->i_ino));
|
||||||
retval = ext4_journal_get_write_access(handle, bh);
|
retval = ext4_journal_get_write_access(handle, bh);
|
||||||
if (retval) {
|
if (retval) {
|
||||||
ext4_std_error(dir->i_sb, retval);
|
ext4_std_error(dir->i_sb, retval);
|
||||||
@ -1377,6 +1377,20 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry,
|
|||||||
}
|
}
|
||||||
root = (struct dx_root *) bh->b_data;
|
root = (struct dx_root *) bh->b_data;
|
||||||
|
|
||||||
|
/* The 0th block becomes the root, move the dirents out */
|
||||||
|
fde = &root->dotdot;
|
||||||
|
de = (struct ext4_dir_entry_2 *)((char *)fde +
|
||||||
|
ext4_rec_len_from_disk(fde->rec_len));
|
||||||
|
if ((char *) de >= (((char *) root) + blocksize)) {
|
||||||
|
ext4_error(dir->i_sb, __func__,
|
||||||
|
"invalid rec_len for '..' in inode %lu",
|
||||||
|
dir->i_ino);
|
||||||
|
brelse(bh);
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
len = ((char *) root) + blocksize - (char *) de;
|
||||||
|
|
||||||
|
/* Allocate new block for the 0th block's dirents */
|
||||||
bh2 = ext4_append(handle, dir, &block, &retval);
|
bh2 = ext4_append(handle, dir, &block, &retval);
|
||||||
if (!(bh2)) {
|
if (!(bh2)) {
|
||||||
brelse(bh);
|
brelse(bh);
|
||||||
@ -1385,11 +1399,6 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry,
|
|||||||
EXT4_I(dir)->i_flags |= EXT4_INDEX_FL;
|
EXT4_I(dir)->i_flags |= EXT4_INDEX_FL;
|
||||||
data1 = bh2->b_data;
|
data1 = bh2->b_data;
|
||||||
|
|
||||||
/* The 0th block becomes the root, move the dirents out */
|
|
||||||
fde = &root->dotdot;
|
|
||||||
de = (struct ext4_dir_entry_2 *)((char *)fde +
|
|
||||||
ext4_rec_len_from_disk(fde->rec_len));
|
|
||||||
len = ((char *) root) + blocksize - (char *) de;
|
|
||||||
memcpy (data1, de, len);
|
memcpy (data1, de, len);
|
||||||
de = (struct ext4_dir_entry_2 *) data1;
|
de = (struct ext4_dir_entry_2 *) data1;
|
||||||
top = data1 + len;
|
top = data1 + len;
|
||||||
|
@ -861,12 +861,13 @@ int ext4_group_add(struct super_block *sb, struct ext4_new_group_data *input)
|
|||||||
gdp = (struct ext4_group_desc *)((char *)primary->b_data +
|
gdp = (struct ext4_group_desc *)((char *)primary->b_data +
|
||||||
gdb_off * EXT4_DESC_SIZE(sb));
|
gdb_off * EXT4_DESC_SIZE(sb));
|
||||||
|
|
||||||
|
memset(gdp, 0, EXT4_DESC_SIZE(sb));
|
||||||
ext4_block_bitmap_set(sb, gdp, input->block_bitmap); /* LV FIXME */
|
ext4_block_bitmap_set(sb, gdp, input->block_bitmap); /* LV FIXME */
|
||||||
ext4_inode_bitmap_set(sb, gdp, input->inode_bitmap); /* LV FIXME */
|
ext4_inode_bitmap_set(sb, gdp, input->inode_bitmap); /* LV FIXME */
|
||||||
ext4_inode_table_set(sb, gdp, input->inode_table); /* LV FIXME */
|
ext4_inode_table_set(sb, gdp, input->inode_table); /* LV FIXME */
|
||||||
ext4_free_blks_set(sb, gdp, input->free_blocks_count);
|
ext4_free_blks_set(sb, gdp, input->free_blocks_count);
|
||||||
ext4_free_inodes_set(sb, gdp, EXT4_INODES_PER_GROUP(sb));
|
ext4_free_inodes_set(sb, gdp, EXT4_INODES_PER_GROUP(sb));
|
||||||
gdp->bg_flags |= cpu_to_le16(EXT4_BG_INODE_ZEROED);
|
gdp->bg_flags = cpu_to_le16(EXT4_BG_INODE_ZEROED);
|
||||||
gdp->bg_checksum = ext4_group_desc_csum(sbi, input->group, gdp);
|
gdp->bg_checksum = ext4_group_desc_csum(sbi, input->group, gdp);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -37,10 +37,10 @@
|
|||||||
#include <linux/proc_fs.h>
|
#include <linux/proc_fs.h>
|
||||||
#include <linux/debugfs.h>
|
#include <linux/debugfs.h>
|
||||||
#include <linux/seq_file.h>
|
#include <linux/seq_file.h>
|
||||||
|
#include <linux/math64.h>
|
||||||
|
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
#include <asm/div64.h>
|
|
||||||
|
|
||||||
EXPORT_SYMBOL(jbd2_journal_start);
|
EXPORT_SYMBOL(jbd2_journal_start);
|
||||||
EXPORT_SYMBOL(jbd2_journal_restart);
|
EXPORT_SYMBOL(jbd2_journal_restart);
|
||||||
@ -846,8 +846,8 @@ static int jbd2_seq_info_show(struct seq_file *seq, void *v)
|
|||||||
jiffies_to_msecs(s->stats->u.run.rs_flushing / s->stats->ts_tid));
|
jiffies_to_msecs(s->stats->u.run.rs_flushing / s->stats->ts_tid));
|
||||||
seq_printf(seq, " %ums logging transaction\n",
|
seq_printf(seq, " %ums logging transaction\n",
|
||||||
jiffies_to_msecs(s->stats->u.run.rs_logging / s->stats->ts_tid));
|
jiffies_to_msecs(s->stats->u.run.rs_logging / s->stats->ts_tid));
|
||||||
seq_printf(seq, " %luus average transaction commit time\n",
|
seq_printf(seq, " %lluus average transaction commit time\n",
|
||||||
do_div(s->journal->j_average_commit_time, 1000));
|
div_u64(s->journal->j_average_commit_time, 1000));
|
||||||
seq_printf(seq, " %lu handles per transaction\n",
|
seq_printf(seq, " %lu handles per transaction\n",
|
||||||
s->stats->u.run.rs_handle_count / s->stats->ts_tid);
|
s->stats->u.run.rs_handle_count / s->stats->ts_tid);
|
||||||
seq_printf(seq, " %lu blocks per transaction\n",
|
seq_printf(seq, " %lu blocks per transaction\n",
|
||||||
|
@ -308,7 +308,8 @@ void buffer_assertion_failure(struct buffer_head *bh);
|
|||||||
int val = (expr); \
|
int val = (expr); \
|
||||||
if (!val) { \
|
if (!val) { \
|
||||||
printk(KERN_ERR \
|
printk(KERN_ERR \
|
||||||
"EXT3-fs unexpected failure: %s;\n",# expr); \
|
"JBD2 unexpected failure: %s: %s;\n", \
|
||||||
|
__func__, #expr); \
|
||||||
printk(KERN_ERR why "\n"); \
|
printk(KERN_ERR why "\n"); \
|
||||||
} \
|
} \
|
||||||
val; \
|
val; \
|
||||||
|
Loading…
Reference in New Issue
Block a user