Merge tag 'drm-intel-next-fixes-2015-07-02' of git://anongit.freedesktop.org/drm...
[linux-2.6-microblaze.git] / fs / jbd2 / transaction.c
index cbe8b3a..f3d0617 100644 (file)
@@ -1280,6 +1280,8 @@ void jbd2_buffer_abort_trigger(struct journal_head *jh,
        triggers->t_abort(triggers, jh2bh(jh));
 }
 
+
+
 /**
  * int jbd2_journal_dirty_metadata() -  mark a buffer as containing dirty metadata
  * @handle: transaction to add buffer to.
@@ -1312,36 +1314,12 @@ int jbd2_journal_dirty_metadata(handle_t *handle, struct buffer_head *bh)
 
        if (is_handle_aborted(handle))
                return -EROFS;
-       if (!buffer_jbd(bh)) {
+       journal = transaction->t_journal;
+       jh = jbd2_journal_grab_journal_head(bh);
+       if (!jh) {
                ret = -EUCLEAN;
                goto out;
        }
-       /*
-        * We don't grab jh reference here since the buffer must be part
-        * of the running transaction.
-        */
-       jh = bh2jh(bh);
-       J_ASSERT_JH(jh, jh->b_transaction == transaction ||
-                       jh->b_next_transaction == transaction);
-       if (jh->b_modified == 1) {
-               /*
-                * If it's in our transaction it must be in BJ_Metadata list.
-                * The assertion is unreliable since we may see jh in
-                * inconsistent state unless we grab bh_state lock. But this
-                * is crutial to catch bugs so let's do a reliable check until
-                * the lockless handling is fully proven.
-                */
-               if (jh->b_transaction == transaction &&
-                   jh->b_jlist != BJ_Metadata) {
-                       jbd_lock_bh_state(bh);
-                       J_ASSERT_JH(jh, jh->b_transaction != transaction ||
-                                       jh->b_jlist == BJ_Metadata);
-                       jbd_unlock_bh_state(bh);
-               }
-               goto out;
-       }
-
-       journal = transaction->t_journal;
        jbd_debug(5, "journal_head %p\n", jh);
        JBUFFER_TRACE(jh, "entry");
 
@@ -1432,6 +1410,7 @@ int jbd2_journal_dirty_metadata(handle_t *handle, struct buffer_head *bh)
        spin_unlock(&journal->j_list_lock);
 out_unlock_bh:
        jbd_unlock_bh_state(bh);
+       jbd2_journal_put_journal_head(jh);
 out:
        JBUFFER_TRACE(jh, "exit");
        return ret;