aboutsummaryrefslogtreecommitdiffstats
path: root/fs/jbd
diff options
context:
space:
mode:
Diffstat (limited to 'fs/jbd')
-rw-r--r--fs/jbd/revoke.c24
1 files changed, 19 insertions, 5 deletions
diff --git a/fs/jbd/revoke.c b/fs/jbd/revoke.c
index 1b1a06e1c836..da6cd9bdaabc 100644
--- a/fs/jbd/revoke.c
+++ b/fs/jbd/revoke.c
@@ -55,6 +55,25 @@
55 * need do nothing. 55 * need do nothing.
56 * RevokeValid set, Revoked set: 56 * RevokeValid set, Revoked set:
57 * buffer has been revoked. 57 * buffer has been revoked.
58 *
59 * Locking rules:
60 * We keep two hash tables of revoke records. One hashtable belongs to the
61 * running transaction (is pointed to by journal->j_revoke), the other one
62 * belongs to the committing transaction. Accesses to the second hash table
63 * happen only from the kjournald and no other thread touches this table. Also
64 * journal_switch_revoke_table() which switches which hashtable belongs to the
65 * running and which to the committing transaction is called only from
66 * kjournald. Therefore we need no locks when accessing the hashtable belonging
67 * to the committing transaction.
68 *
69 * All users operating on the hash table belonging to the running transaction
70 * have a handle to the transaction. Therefore they are safe from kjournald
71 * switching hash tables under them. For operations on the lists of entries in
72 * the hash table j_revoke_lock is used.
73 *
74 * Finally, also replay code uses the hash tables but at this moment noone else
75 * can touch them (filesystem isn't mounted yet) and hence no locking is
76 * needed.
58 */ 77 */
59 78
60#ifndef __KERNEL__ 79#ifndef __KERNEL__
@@ -403,8 +422,6 @@ int journal_revoke(handle_t *handle, unsigned long blocknr,
403 * the second time we would still have a pending revoke to cancel. So, 422 * the second time we would still have a pending revoke to cancel. So,
404 * do not trust the Revoked bit on buffers unless RevokeValid is also 423 * do not trust the Revoked bit on buffers unless RevokeValid is also
405 * set. 424 * set.
406 *
407 * The caller must have the journal locked.
408 */ 425 */
409int journal_cancel_revoke(handle_t *handle, struct journal_head *jh) 426int journal_cancel_revoke(handle_t *handle, struct journal_head *jh)
410{ 427{
@@ -482,10 +499,7 @@ void journal_switch_revoke_table(journal_t *journal)
482/* 499/*
483 * Write revoke records to the journal for all entries in the current 500 * Write revoke records to the journal for all entries in the current
484 * revoke hash, deleting the entries as we go. 501 * revoke hash, deleting the entries as we go.
485 *
486 * Called with the journal lock held.
487 */ 502 */
488
489void journal_write_revoke_records(journal_t *journal, 503void journal_write_revoke_records(journal_t *journal,
490 transaction_t *transaction, int write_op) 504 transaction_t *transaction, int write_op)
491{ 505{