Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target...
[linux-2.6-block.git] / fs / ext4 / ialloc.c
index 3f32c80124470e772c8f79dce042ccadde3bd66f..32fd2b9075dd4029925d11adb0b84df1a399a8b1 100644 (file)
@@ -634,8 +634,10 @@ static int find_group_other(struct super_block *sb, struct inode *parent,
  * For other inodes, search forward from the parent directory's block
  * group to find a free inode.
  */
-struct inode *ext4_new_inode(handle_t *handle, struct inode *dir, umode_t mode,
-                            const struct qstr *qstr, __u32 goal, uid_t *owner)
+struct inode *__ext4_new_inode(handle_t *handle, struct inode *dir,
+                              umode_t mode, const struct qstr *qstr,
+                              __u32 goal, uid_t *owner, int handle_type,
+                              unsigned int line_no, int nblocks)
 {
        struct super_block *sb;
        struct buffer_head *inode_bitmap_bh = NULL;
@@ -725,6 +727,15 @@ repeat_in_this_group:
                                   "inode=%lu", ino + 1);
                        continue;
                }
+               if (!handle) {
+                       BUG_ON(nblocks <= 0);
+                       handle = __ext4_journal_start_sb(dir->i_sb, line_no,
+                                                        handle_type, nblocks);
+                       if (IS_ERR(handle)) {
+                               err = PTR_ERR(handle);
+                               goto fail;
+                       }
+               }
                BUFFER_TRACE(inode_bitmap_bh, "get_write_access");
                err = ext4_journal_get_write_access(handle, inode_bitmap_bh);
                if (err)
@@ -1017,17 +1028,17 @@ iget_failed:
        inode = NULL;
 bad_orphan:
        ext4_warning(sb, "bad orphan inode %lu!  e2fsck was run?", ino);
-       printk(KERN_NOTICE "ext4_test_bit(bit=%d, block=%llu) = %d\n",
+       printk(KERN_WARNING "ext4_test_bit(bit=%d, block=%llu) = %d\n",
               bit, (unsigned long long)bitmap_bh->b_blocknr,
               ext4_test_bit(bit, bitmap_bh->b_data));
-       printk(KERN_NOTICE "inode=%p\n", inode);
+       printk(KERN_WARNING "inode=%p\n", inode);
        if (inode) {
-               printk(KERN_NOTICE "is_bad_inode(inode)=%d\n",
+               printk(KERN_WARNING "is_bad_inode(inode)=%d\n",
                       is_bad_inode(inode));
-               printk(KERN_NOTICE "NEXT_ORPHAN(inode)=%u\n",
+               printk(KERN_WARNING "NEXT_ORPHAN(inode)=%u\n",
                       NEXT_ORPHAN(inode));
-               printk(KERN_NOTICE "max_ino=%lu\n", max_ino);
-               printk(KERN_NOTICE "i_nlink=%u\n", inode->i_nlink);
+               printk(KERN_WARNING "max_ino=%lu\n", max_ino);
+               printk(KERN_WARNING "i_nlink=%u\n", inode->i_nlink);
                /* Avoid freeing blocks if we got a bad deleted inode */
                if (inode->i_nlink == 0)
                        inode->i_blocks = 0;
@@ -1137,7 +1148,7 @@ int ext4_init_inode_table(struct super_block *sb, ext4_group_t group,
        if (gdp->bg_flags & cpu_to_le16(EXT4_BG_INODE_ZEROED))
                goto out;
 
-       handle = ext4_journal_start_sb(sb, 1);
+       handle = ext4_journal_start_sb(sb, EXT4_HT_MISC, 1);
        if (IS_ERR(handle)) {
                ret = PTR_ERR(handle);
                goto out;