ext4: Allow ext4 to run without a journal
[deliverable/linux.git] / fs / ext4 / ialloc.c
index 2a117e286e5420c6d5567961a14b340162b14a67..9dd21b75f4bcedb92be432e2788b15976fd19489 100644 (file)
@@ -253,12 +253,12 @@ void ext4_free_inode(handle_t *handle, struct inode *inode)
                                spin_unlock(sb_bgl_lock(sbi, flex_group));
                        }
                }
-               BUFFER_TRACE(bh2, "call ext4_journal_dirty_metadata");
-               err = ext4_journal_dirty_metadata(handle, bh2);
+               BUFFER_TRACE(bh2, "call ext4_handle_dirty_metadata");
+               err = ext4_handle_dirty_metadata(handle, NULL, bh2);
                if (!fatal) fatal = err;
        }
-       BUFFER_TRACE(bitmap_bh, "call ext4_journal_dirty_metadata");
-       err = ext4_journal_dirty_metadata(handle, bitmap_bh);
+       BUFFER_TRACE(bitmap_bh, "call ext4_handle_dirty_metadata");
+       err = ext4_handle_dirty_metadata(handle, NULL, bitmap_bh);
        if (!fatal)
                fatal = err;
        sb->s_dirt = 1;
@@ -656,15 +656,16 @@ repeat_in_this_group:
                                                ino, bitmap_bh->b_data)) {
                                /* we won it */
                                BUFFER_TRACE(bitmap_bh,
-                                       "call ext4_journal_dirty_metadata");
-                               err = ext4_journal_dirty_metadata(handle,
+                                       "call ext4_handle_dirty_metadata");
+                               err = ext4_handle_dirty_metadata(handle,
+                                                               inode,
                                                                bitmap_bh);
                                if (err)
                                        goto fail;
                                goto got;
                        }
                        /* we lost it */
-                       jbd2_journal_release_buffer(handle, bitmap_bh);
+                       ext4_handle_release_buffer(handle, bitmap_bh);
 
                        if (++ino < EXT4_INODES_PER_GROUP(sb))
                                goto repeat_in_this_group;
@@ -726,7 +727,8 @@ got:
                /* Don't need to dirty bitmap block if we didn't change it */
                if (free) {
                        BUFFER_TRACE(block_bh, "dirty block bitmap");
-                       err = ext4_journal_dirty_metadata(handle, block_bh);
+                       err = ext4_handle_dirty_metadata(handle,
+                                                       NULL, block_bh);
                }
 
                brelse(block_bh);
@@ -771,8 +773,8 @@ got:
        }
        gdp->bg_checksum = ext4_group_desc_csum(sbi, group, gdp);
        spin_unlock(sb_bgl_lock(sbi, group));
-       BUFFER_TRACE(bh2, "call ext4_journal_dirty_metadata");
-       err = ext4_journal_dirty_metadata(handle, bh2);
+       BUFFER_TRACE(bh2, "call ext4_handle_dirty_metadata");
+       err = ext4_handle_dirty_metadata(handle, NULL, bh2);
        if (err) goto fail;
 
        percpu_counter_dec(&sbi->s_freeinodes_counter);
@@ -787,7 +789,7 @@ got:
                spin_unlock(sb_bgl_lock(sbi, flex_group));
        }
 
-       inode->i_uid = current->fsuid;
+       inode->i_uid = current_fsuid();
        if (test_opt(sb, GRPID))
                inode->i_gid = dir->i_gid;
        else if (dir->i_mode & S_ISGID) {
@@ -795,7 +797,7 @@ got:
                if (S_ISDIR(mode))
                        mode |= S_ISGID;
        } else
-               inode->i_gid = current->fsgid;
+               inode->i_gid = current_fsgid();
        inode->i_mode = mode;
 
        inode->i_ino = ino + group * EXT4_INODES_PER_GROUP(sb);
@@ -825,8 +827,11 @@ got:
 
        ext4_set_inode_flags(inode);
        if (IS_DIRSYNC(inode))
-               handle->h_sync = 1;
-       insert_inode_hash(inode);
+               ext4_handle_sync(handle);
+       if (insert_inode_locked(inode) < 0) {
+               err = -EINVAL;
+               goto fail_drop;
+       }
        spin_lock(&sbi->s_next_gen_lock);
        inode->i_generation = sbi->s_next_generation++;
        spin_unlock(&sbi->s_next_gen_lock);
@@ -881,6 +886,7 @@ fail_drop:
        DQUOT_DROP(inode);
        inode->i_flags |= S_NOQUOTA;
        inode->i_nlink = 0;
+       unlock_new_inode(inode);
        iput(inode);
        brelse(bitmap_bh);
        return ERR_PTR(err);
@@ -1024,4 +1030,3 @@ unsigned long ext4_count_dirs(struct super_block * sb)
        }
        return count;
 }
-
This page took 0.028139 seconds and 5 git commands to generate.