]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - fs/ext4/ext4_jbd2.c
Merge tag 'upstream-5.5-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/ubifs
[linux.git] / fs / ext4 / ext4_jbd2.c
index 7c70b08d104c002e129415d197728d2e6f014e35..d3b8cdea5df75ec6ddce7a1ee80217cc5c6e100d 100644 (file)
@@ -65,12 +65,14 @@ static int ext4_journal_check_start(struct super_block *sb)
 }
 
 handle_t *__ext4_journal_start_sb(struct super_block *sb, unsigned int line,
-                                 int type, int blocks, int rsv_blocks)
+                                 int type, int blocks, int rsv_blocks,
+                                 int revoke_creds)
 {
        journal_t *journal;
        int err;
 
-       trace_ext4_journal_start(sb, blocks, rsv_blocks, _RET_IP_);
+       trace_ext4_journal_start(sb, blocks, rsv_blocks, revoke_creds,
+                                _RET_IP_);
        err = ext4_journal_check_start(sb);
        if (err < 0)
                return ERR_PTR(err);
@@ -78,8 +80,8 @@ handle_t *__ext4_journal_start_sb(struct super_block *sb, unsigned int line,
        journal = EXT4_SB(sb)->s_journal;
        if (!journal)
                return ext4_get_nojournal();
-       return jbd2__journal_start(journal, blocks, rsv_blocks, GFP_NOFS,
-                                  type, line);
+       return jbd2__journal_start(journal, blocks, rsv_blocks, revoke_creds,
+                                  GFP_NOFS, type, line);
 }
 
 int __ext4_journal_stop(const char *where, unsigned int line, handle_t *handle)
@@ -119,8 +121,8 @@ handle_t *__ext4_journal_start_reserved(handle_t *handle, unsigned int line,
                return ext4_get_nojournal();
 
        sb = handle->h_journal->j_private;
-       trace_ext4_journal_start_reserved(sb, handle->h_buffer_credits,
-                                         _RET_IP_);
+       trace_ext4_journal_start_reserved(sb,
+                               jbd2_handle_buffer_credits(handle), _RET_IP_);
        err = ext4_journal_check_start(sb);
        if (err < 0) {
                jbd2_journal_free_reserved(handle);
@@ -133,6 +135,19 @@ handle_t *__ext4_journal_start_reserved(handle_t *handle, unsigned int line,
        return handle;
 }
 
+int __ext4_journal_ensure_credits(handle_t *handle, int check_cred,
+                                 int extend_cred, int revoke_cred)
+{
+       if (!ext4_handle_valid(handle))
+               return 0;
+       if (jbd2_handle_buffer_credits(handle) >= check_cred &&
+           handle->h_revoke_credits >= revoke_cred)
+               return 0;
+       extend_cred = max(0, extend_cred - jbd2_handle_buffer_credits(handle));
+       revoke_cred = max(0, revoke_cred - handle->h_revoke_credits);
+       return ext4_journal_extend(handle, extend_cred, revoke_cred);
+}
+
 static void ext4_journal_abort_handle(const char *caller, unsigned int line,
                                      const char *err_fn,
                                      struct buffer_head *bh,
@@ -278,7 +293,7 @@ int __ext4_handle_dirty_metadata(const char *where, unsigned int line,
                                       handle->h_type,
                                       handle->h_line_no,
                                       handle->h_requested_credits,
-                                      handle->h_buffer_credits, err);
+                                      jbd2_handle_buffer_credits(handle), err);
                                return err;
                        }
                        ext4_error_inode(inode, where, line,
@@ -289,7 +304,8 @@ int __ext4_handle_dirty_metadata(const char *where, unsigned int line,
                                         handle->h_type,
                                         handle->h_line_no,
                                         handle->h_requested_credits,
-                                        handle->h_buffer_credits, err);
+                                        jbd2_handle_buffer_credits(handle),
+                                        err);
                }
        } else {
                if (inode)