|
@@ -1243,6 +1243,7 @@ int jbd2_journal_forget (handle_t *handle, struct buffer_head *bh)
|
|
|
struct journal_head *jh;
|
|
|
int drop_reserve = 0;
|
|
|
int err = 0;
|
|
|
+ int was_modified = 0;
|
|
|
|
|
|
BUFFER_TRACE(bh, "entry");
|
|
|
|
|
@@ -1261,6 +1262,9 @@ int jbd2_journal_forget (handle_t *handle, struct buffer_head *bh)
|
|
|
goto not_jbd;
|
|
|
}
|
|
|
|
|
|
+ /* keep track of wether or not this transaction modified us */
|
|
|
+ was_modified = jh->b_modified;
|
|
|
+
|
|
|
/*
|
|
|
* The buffer's going from the transaction, we must drop
|
|
|
* all references -bzzz
|
|
@@ -1278,7 +1282,12 @@ int jbd2_journal_forget (handle_t *handle, struct buffer_head *bh)
|
|
|
|
|
|
JBUFFER_TRACE(jh, "belongs to current transaction: unfile");
|
|
|
|
|
|
- drop_reserve = 1;
|
|
|
+ /*
|
|
|
+ * we only want to drop a reference if this transaction
|
|
|
+ * modified the buffer
|
|
|
+ */
|
|
|
+ if (was_modified)
|
|
|
+ drop_reserve = 1;
|
|
|
|
|
|
/*
|
|
|
* We are no longer going to journal this buffer.
|
|
@@ -1318,7 +1327,13 @@ int jbd2_journal_forget (handle_t *handle, struct buffer_head *bh)
|
|
|
if (jh->b_next_transaction) {
|
|
|
J_ASSERT(jh->b_next_transaction == transaction);
|
|
|
jh->b_next_transaction = NULL;
|
|
|
- drop_reserve = 1;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * only drop a reference if this transaction modified
|
|
|
+ * the buffer
|
|
|
+ */
|
|
|
+ if (was_modified)
|
|
|
+ drop_reserve = 1;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -2090,7 +2105,7 @@ void __jbd2_journal_refile_buffer(struct journal_head *jh)
|
|
|
jh->b_transaction = jh->b_next_transaction;
|
|
|
jh->b_next_transaction = NULL;
|
|
|
__jbd2_journal_file_buffer(jh, jh->b_transaction,
|
|
|
- was_dirty ? BJ_Metadata : BJ_Reserved);
|
|
|
+ jh->b_modified ? BJ_Metadata : BJ_Reserved);
|
|
|
J_ASSERT_JH(jh, jh->b_transaction->t_state == T_RUNNING);
|
|
|
|
|
|
if (was_dirty)
|