diff options
Diffstat (limited to 'fs/jbd')
-rw-r--r-- | fs/jbd/revoke.c | 24 |
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 | */ |
409 | int journal_cancel_revoke(handle_t *handle, struct journal_head *jh) | 426 | int 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 | |||
489 | void journal_write_revoke_records(journal_t *journal, | 503 | void journal_write_revoke_records(journal_t *journal, |
490 | transaction_t *transaction, int write_op) | 504 | transaction_t *transaction, int write_op) |
491 | { | 505 | { |