Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux...
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 18 Mar 2011 00:41:19 +0000 (17:41 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 18 Mar 2011 00:41:19 +0000 (17:41 -0700)
* '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

fs/ext3/balloc.c
fs/ext3/namei.c
fs/ext3/super.c
fs/jbd/journal.c
fs/jbd2/journal.c
fs/quota/quota_v2.c

index 045995c8ce5acd27c51fbebf50ceeaaaf3311b93..153242187fce7b3ddade632f538d8bec5ab47724 100644 (file)
@@ -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));
                percpu_counter_sub(&sbi->s_freeblocks_counter, next - start);
 
+               free_blocks -= next - start;
                /* Do not issue a TRIM on extents smaller than minblocks */
                if ((next - start) < minblocks)
                        goto free_extent;
@@ -2040,7 +2041,7 @@ free_extent:
                cond_resched();
 
                /* No more suitable extents */
-               if ((free_blocks - count) < minblocks)
+               if (free_blocks < minblocks)
                        break;
        }
 
@@ -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);
        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;
        minlen = range->minlen >> sb->s_blocksize_bits;
        trimmed = 0;
@@ -2099,10 +2101,6 @@ int ext3_trim_fs(struct super_block *sb, struct fstrim_range *range)
                return -EINVAL;
        if (start >= max_blks)
                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)
                len = max_blks - start;
 
@@ -2129,10 +2127,15 @@ int ext3_trim_fs(struct super_block *sb, struct fstrim_range *range)
                if (free_blocks < minlen)
                        continue;
 
-               if (len >= EXT3_BLOCKS_PER_GROUP(sb))
-                       len -= (EXT3_BLOCKS_PER_GROUP(sb) - first_block);
-               else
+               /*
+                * For all the groups except the last one, last block will
+                * 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;
+               len -= last_block - first_block;
 
                ret = ext3_trim_all_free(sb, group, first_block,
                                        last_block, minlen);
index 0521a007ae6defc3434f501850c72682a83398eb..32f3b869585927400a035259c0fee27e312b39c8 100644 (file)
@@ -1540,8 +1540,8 @@ static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry,
                        goto cleanup;
                node2 = (struct dx_node *)(bh2->b_data);
                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.inode = 0;
                BUFFER_TRACE(frame->bh, "get_write_access");
                err = ext3_journal_get_write_access(handle, frame->bh);
                if (err)
index 9cc19a1dea8ecb4276715bc920f02956290f74f7..071689f86e18bf8991f3d43f528d3fee8b06d6af 100644 (file)
@@ -1464,6 +1464,13 @@ static void ext3_orphan_cleanup (struct super_block * sb,
                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 (es->s_last_orphan)
                        jbd_debug(1, "Errors on filesystem, "
index da1b5e4ffce1200675e5cf7690e08d0545b304d8..eb11601f2e00f5c3c5d242fc0d571d80c0d0953c 100644 (file)
@@ -839,7 +839,7 @@ journal_t * journal_init_inode (struct inode *inode)
        err = journal_bmap(journal, 0, &blocknr);
        /* If that failed, give up */
        if (err) {
-               printk(KERN_ERR "%s: Cannnot locate journal superblock\n",
+               printk(KERN_ERR "%s: Cannot locate journal superblock\n",
                       __func__);
                goto out_err;
        }
index 97e73469b2c48f0ed1104d5a12e1ddb54102983e..90407b8fece7475b9d733e51047464fa94f209fd 100644 (file)
@@ -991,7 +991,7 @@ journal_t * jbd2_journal_init_inode (struct inode *inode)
        err = jbd2_journal_bmap(journal, 0, &blocknr);
        /* If that failed, give up */
        if (err) {
-               printk(KERN_ERR "%s: Cannnot locate journal superblock\n",
+               printk(KERN_ERR "%s: Cannot locate journal superblock\n",
                       __func__);
                goto out_err;
        }
index 65444d29406bf3c782b2741dc25f9dd571691096..f1ab3604db5a4972d427b64d762df9c02a47f9de 100644 (file)
@@ -112,7 +112,7 @@ static int v2_read_file_info(struct super_block *sb, int type)
        if (!info->dqi_priv) {
                printk(KERN_WARNING
                       "Not enough memory for quota information structure.\n");
-               return -1;
+               return -ENOMEM;
        }
        qinfo = info->dqi_priv;
        if (version == 0) {