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
10 changed files with 49 additions and 30 deletions
|
@ -1358,7 +1358,7 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry,
|
|||
struct fake_dirent *fde;
|
||||
|
||||
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);
|
||||
if (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;
|
||||
|
||||
/* 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);
|
||||
if (!(bh2)) {
|
||||
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;
|
||||
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);
|
||||
de = (struct ext3_dir_entry_2 *) data1;
|
||||
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);
|
||||
if (!gdp)
|
||||
continue;
|
||||
desc_count += le16_to_cpu(gdp->bg_free_blocks_count);
|
||||
desc_count += ext4_free_blks_count(sb, gdp);
|
||||
brelse(bitmap_bh);
|
||||
bitmap_bh = ext4_read_block_bitmap(sb, i);
|
||||
if (bitmap_bh == NULL)
|
||||
continue;
|
||||
|
||||
x = ext4_count_free(bitmap_bh, sb->s_blocksize);
|
||||
printk(KERN_DEBUG "group %lu: stored = %d, counted = %u\n",
|
||||
i, le16_to_cpu(gdp->bg_free_blocks_count), x);
|
||||
printk(KERN_DEBUG "group %u: stored = %d, counted = %u\n",
|
||||
i, ext4_free_blks_count(sb, gdp), x);
|
||||
bitmap_count += x;
|
||||
}
|
||||
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)
|
||||
{
|
||||
return ((loff_t)le32_to_cpu(raw_inode->i_size_high) << 32) |
|
||||
le32_to_cpu(raw_inode->i_size_lo);
|
||||
if (S_ISREG(le16_to_cpu(raw_inode->i_mode)))
|
||||
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)
|
||||
|
|
|
@ -3048,7 +3048,7 @@ long ext4_fallocate(struct inode *inode, int mode, loff_t offset, loff_t len)
|
|||
WARN_ON(ret <= 0);
|
||||
printk(KERN_ERR "%s: ext4_ext_get_blocks "
|
||||
"returned error inode#%lu, block=%u, "
|
||||
"max_blocks=%lu", __func__,
|
||||
"max_blocks=%u", __func__,
|
||||
inode->i_ino, block, max_blocks);
|
||||
#endif
|
||||
ext4_mark_inode_dirty(handle, inode);
|
||||
|
|
|
@ -360,9 +360,9 @@ static int ext4_block_to_path(struct inode *inode,
|
|||
final = ptrs;
|
||||
} else {
|
||||
ext4_warning(inode->i_sb, "ext4_block_to_path",
|
||||
"block %lu > max",
|
||||
"block %lu > max in inode %lu",
|
||||
i_block + direct_blocks +
|
||||
indirect_blocks + double_blocks);
|
||||
indirect_blocks + double_blocks, inode->i_ino);
|
||||
}
|
||||
if (boundary)
|
||||
*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);
|
||||
}
|
||||
|
||||
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) {
|
||||
/*
|
||||
* 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
|
||||
* 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);
|
||||
else
|
||||
ext4_error(inode->i_sb, __func__,
|
||||
|
|
|
@ -3025,7 +3025,7 @@ ext4_mb_mark_diskspace_used(struct ext4_allocation_context *ac,
|
|||
goto out_err;
|
||||
|
||||
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);
|
||||
if (err)
|
||||
|
|
|
@ -1368,7 +1368,7 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry,
|
|||
struct fake_dirent *fde;
|
||||
|
||||
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);
|
||||
if (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;
|
||||
|
||||
/* 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);
|
||||
if (!(bh2)) {
|
||||
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;
|
||||
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);
|
||||
de = (struct ext4_dir_entry_2 *) data1;
|
||||
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 +
|
||||
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_inode_bitmap_set(sb, gdp, input->inode_bitmap); /* 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_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);
|
||||
|
||||
/*
|
||||
|
|
|
@ -37,10 +37,10 @@
|
|||
#include <linux/proc_fs.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/math64.h>
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/div64.h>
|
||||
|
||||
EXPORT_SYMBOL(jbd2_journal_start);
|
||||
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));
|
||||
seq_printf(seq, " %ums logging transaction\n",
|
||||
jiffies_to_msecs(s->stats->u.run.rs_logging / s->stats->ts_tid));
|
||||
seq_printf(seq, " %luus average transaction commit time\n",
|
||||
do_div(s->journal->j_average_commit_time, 1000));
|
||||
seq_printf(seq, " %lluus average transaction commit time\n",
|
||||
div_u64(s->journal->j_average_commit_time, 1000));
|
||||
seq_printf(seq, " %lu handles per transaction\n",
|
||||
s->stats->u.run.rs_handle_count / s->stats->ts_tid);
|
||||
seq_printf(seq, " %lu blocks per transaction\n",
|
||||
|
|
|
@ -308,7 +308,8 @@ void buffer_assertion_failure(struct buffer_head *bh);
|
|||
int val = (expr); \
|
||||
if (!val) { \
|
||||
printk(KERN_ERR \
|
||||
"EXT3-fs unexpected failure: %s;\n",# expr); \
|
||||
"JBD2 unexpected failure: %s: %s;\n", \
|
||||
__func__, #expr); \
|
||||
printk(KERN_ERR why "\n"); \
|
||||
} \
|
||||
val; \
|
||||
|
|
Loading…
Reference in a new issue