History

jbd2: Account descriptor blocks into t_outstanding_credits

Currently, journal descriptor blocks were not accounted in transaction->t_outstanding_credits and we were just leaving some slack space in the journal for them (in jbd2_log_space_left() and jbd2_space_needed()). This is making proper accounting (and reservation we want to add) of descriptor blocks difficult so switch to accounting descriptor blocks in transaction->t_outstanding_credits and just reserve the same amount of credits in t_outstanding credits for journal descriptor blocks when creating transaction.

Jan Kara committed 7 years ago

Commit 9f356e51 parent ec8b6f64 files · +24 −25Browse files

Showing the changes to include/linux (1 of 4 files). Show all

Unified · Split

include/linux/jbd2.h+7−15
@@ -681,8 +681,10 @@ struct transaction_s · 680 unmodified lines
681681 atomic_t t_updates;
682682
683683 /*
684− * Number of buffers reserved for use by all handles in this transaction
685− * handle but not yet modified. [none]
684+ * Number of blocks reserved for this transaction in the journal.
685+ * This is including all credits reserved when starting transaction
686+ * handles as well as all journal descriptor blocks needed for this
687+ * transaction. [none]
686688 */
687689 atomic_t t_outstanding_credits;
688690
@@ -1560,20 +1562,13 @@ static inline int jbd2_journal_has_csum_v2or3(journal_t *journal) · 871 unmodified lines
15601562 return journal->j_chksum_driver != NULL;
15611563 }
15621564
1563−/*
1564− * We reserve t_outstanding_credits >> JBD2_CONTROL_BLOCKS_SHIFT for
1565− * transaction control blocks.
1566− */
1567−#define JBD2_CONTROL_BLOCKS_SHIFT 5
1568−
15691565 /*
15701566 * Return the minimum number of blocks which must be free in the journal
15711567 * before a new transaction may be started. Must be called under j_state_lock.
15721568 */
15731569 static inline int jbd2_space_needed(journal_t *journal)
15741570 {
1575− int nblocks = journal->j_max_transaction_buffers;
1576− return nblocks + (nblocks >> JBD2_CONTROL_BLOCKS_SHIFT);
1571+ return journal->j_max_transaction_buffers;
15771572 }
15781573
15791574 /*
@@ -1585,11 +1580,8 @@ static inline unsigned long jbd2_log_space_left(journal_t *journal) · 5 unmodified lines
15851580 long free = journal->j_free - 32;
15861581
15871582 if (journal->j_committing_transaction) {
1588− unsigned long committing = atomic_read(&journal->
1589− j_committing_transaction->t_outstanding_credits);
1590−
1591− /* Transaction + control blocks */
1592− free -= committing + (committing >> JBD2_CONTROL_BLOCKS_SHIFT);
1583+ free -= atomic_read(&journal->
1584+ j_committing_transaction->t_outstanding_credits);
15931585 }
15941586 return max_t(long, free, 0);
15951587 }

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t