Commit 77aa56ba authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs-2.6

* 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs-2.6:
  ext3: Always set dx_node's fake_dirent explicitly.
  ext3: Fix an overflow in ext3_trim_fs.
  jbd: Remove one to many n's in a word.
  ext3: skip orphan cleanup on rocompat fs
  ext2: Fix link count corruption under heavy link+rename load
  ext3: speed up group trim with the right free block count.
  ext3: Adjust trim start with first_data_block.
  quota: return -ENOMEM when memory allocation fails
parents 17919837 0c755de0
...@@ -1991,6 +1991,7 @@ ext3_grpblk_t ext3_trim_all_free(struct super_block *sb, unsigned int group, ...@@ -1991,6 +1991,7 @@ ext3_grpblk_t ext3_trim_all_free(struct super_block *sb, unsigned int group,
spin_unlock(sb_bgl_lock(sbi, group)); spin_unlock(sb_bgl_lock(sbi, group));
percpu_counter_sub(&sbi->s_freeblocks_counter, next - start); percpu_counter_sub(&sbi->s_freeblocks_counter, next - start);
free_blocks -= next - start;
/* Do not issue a TRIM on extents smaller than minblocks */ /* Do not issue a TRIM on extents smaller than minblocks */
if ((next - start) < minblocks) if ((next - start) < minblocks)
goto free_extent; goto free_extent;
...@@ -2040,7 +2041,7 @@ ext3_grpblk_t ext3_trim_all_free(struct super_block *sb, unsigned int group, ...@@ -2040,7 +2041,7 @@ ext3_grpblk_t ext3_trim_all_free(struct super_block *sb, unsigned int group,
cond_resched(); cond_resched();
/* No more suitable extents */ /* No more suitable extents */
if ((free_blocks - count) < minblocks) if (free_blocks < minblocks)
break; break;
} }
...@@ -2090,7 +2091,8 @@ int ext3_trim_fs(struct super_block *sb, struct fstrim_range *range) ...@@ -2090,7 +2091,8 @@ int ext3_trim_fs(struct super_block *sb, struct fstrim_range *range)
ext3_fsblk_t max_blks = le32_to_cpu(es->s_blocks_count); ext3_fsblk_t max_blks = le32_to_cpu(es->s_blocks_count);
int ret = 0; int ret = 0;
start = range->start >> sb->s_blocksize_bits; start = (range->start >> sb->s_blocksize_bits) +
le32_to_cpu(es->s_first_data_block);
len = range->len >> sb->s_blocksize_bits; len = range->len >> sb->s_blocksize_bits;
minlen = range->minlen >> sb->s_blocksize_bits; minlen = range->minlen >> sb->s_blocksize_bits;
trimmed = 0; trimmed = 0;
...@@ -2099,10 +2101,6 @@ int ext3_trim_fs(struct super_block *sb, struct fstrim_range *range) ...@@ -2099,10 +2101,6 @@ int ext3_trim_fs(struct super_block *sb, struct fstrim_range *range)
return -EINVAL; return -EINVAL;
if (start >= max_blks) if (start >= max_blks)
goto out; goto out;
if (start < le32_to_cpu(es->s_first_data_block)) {
len -= le32_to_cpu(es->s_first_data_block) - start;
start = le32_to_cpu(es->s_first_data_block);
}
if (start + len > max_blks) if (start + len > max_blks)
len = max_blks - start; len = max_blks - start;
...@@ -2129,10 +2127,15 @@ int ext3_trim_fs(struct super_block *sb, struct fstrim_range *range) ...@@ -2129,10 +2127,15 @@ int ext3_trim_fs(struct super_block *sb, struct fstrim_range *range)
if (free_blocks < minlen) if (free_blocks < minlen)
continue; continue;
if (len >= EXT3_BLOCKS_PER_GROUP(sb)) /*
len -= (EXT3_BLOCKS_PER_GROUP(sb) - first_block); * For all the groups except the last one, last block will
else * always be EXT3_BLOCKS_PER_GROUP(sb), so we only need to
* change it for the last group in which case first_block +
* len < EXT3_BLOCKS_PER_GROUP(sb).
*/
if (first_block + len < EXT3_BLOCKS_PER_GROUP(sb))
last_block = first_block + len; last_block = first_block + len;
len -= last_block - first_block;
ret = ext3_trim_all_free(sb, group, first_block, ret = ext3_trim_all_free(sb, group, first_block,
last_block, minlen); last_block, minlen);
......
...@@ -1540,8 +1540,8 @@ static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry, ...@@ -1540,8 +1540,8 @@ static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry,
goto cleanup; goto cleanup;
node2 = (struct dx_node *)(bh2->b_data); node2 = (struct dx_node *)(bh2->b_data);
entries2 = node2->entries; entries2 = node2->entries;
memset(&node2->fake, 0, sizeof(struct fake_dirent));
node2->fake.rec_len = ext3_rec_len_to_disk(sb->s_blocksize); node2->fake.rec_len = ext3_rec_len_to_disk(sb->s_blocksize);
node2->fake.inode = 0;
BUFFER_TRACE(frame->bh, "get_write_access"); BUFFER_TRACE(frame->bh, "get_write_access");
err = ext3_journal_get_write_access(handle, frame->bh); err = ext3_journal_get_write_access(handle, frame->bh);
if (err) if (err)
......
...@@ -1464,6 +1464,13 @@ static void ext3_orphan_cleanup (struct super_block * sb, ...@@ -1464,6 +1464,13 @@ static void ext3_orphan_cleanup (struct super_block * sb,
return; return;
} }
/* Check if feature set allows readwrite operations */
if (EXT3_HAS_RO_COMPAT_FEATURE(sb, ~EXT3_FEATURE_RO_COMPAT_SUPP)) {
ext3_msg(sb, KERN_INFO, "Skipping orphan cleanup due to "
"unknown ROCOMPAT features");
return;
}
if (EXT3_SB(sb)->s_mount_state & EXT3_ERROR_FS) { if (EXT3_SB(sb)->s_mount_state & EXT3_ERROR_FS) {
if (es->s_last_orphan) if (es->s_last_orphan)
jbd_debug(1, "Errors on filesystem, " jbd_debug(1, "Errors on filesystem, "
......
...@@ -839,7 +839,7 @@ journal_t * journal_init_inode (struct inode *inode) ...@@ -839,7 +839,7 @@ journal_t * journal_init_inode (struct inode *inode)
err = journal_bmap(journal, 0, &blocknr); err = journal_bmap(journal, 0, &blocknr);
/* If that failed, give up */ /* If that failed, give up */
if (err) { if (err) {
printk(KERN_ERR "%s: Cannnot locate journal superblock\n", printk(KERN_ERR "%s: Cannot locate journal superblock\n",
__func__); __func__);
goto out_err; goto out_err;
} }
......
...@@ -991,7 +991,7 @@ journal_t * jbd2_journal_init_inode (struct inode *inode) ...@@ -991,7 +991,7 @@ journal_t * jbd2_journal_init_inode (struct inode *inode)
err = jbd2_journal_bmap(journal, 0, &blocknr); err = jbd2_journal_bmap(journal, 0, &blocknr);
/* If that failed, give up */ /* If that failed, give up */
if (err) { if (err) {
printk(KERN_ERR "%s: Cannnot locate journal superblock\n", printk(KERN_ERR "%s: Cannot locate journal superblock\n",
__func__); __func__);
goto out_err; goto out_err;
} }
......
...@@ -112,7 +112,7 @@ static int v2_read_file_info(struct super_block *sb, int type) ...@@ -112,7 +112,7 @@ static int v2_read_file_info(struct super_block *sb, int type)
if (!info->dqi_priv) { if (!info->dqi_priv) {
printk(KERN_WARNING printk(KERN_WARNING
"Not enough memory for quota information structure.\n"); "Not enough memory for quota information structure.\n");
return -1; return -ENOMEM;
} }
qinfo = info->dqi_priv; qinfo = info->dqi_priv;
if (version == 0) { if (version == 0) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment