Commit 32433879480d13bc019d5a067ce884064a93dd63
Committed by
Linus Torvalds
1 parent
9de100d001
jbd: update locking coments
Update information about locking in JBD revoke code. Reported-by: Lin Tan <tammy000@gmail.com>. Signed-off-by: Jan Kara <jack@suse.cz> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 1 changed file with 19 additions and 5 deletions Side-by-side Diff
fs/jbd/revoke.c
... | ... | @@ -55,6 +55,25 @@ |
55 | 55 | * need do nothing. |
56 | 56 | * RevokeValid set, Revoked set: |
57 | 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 | 79 | #ifndef __KERNEL__ |
... | ... | @@ -402,8 +421,6 @@ |
402 | 421 | * the second time we would still have a pending revoke to cancel. So, |
403 | 422 | * do not trust the Revoked bit on buffers unless RevokeValid is also |
404 | 423 | * set. |
405 | - * | |
406 | - * The caller must have the journal locked. | |
407 | 424 | */ |
408 | 425 | int journal_cancel_revoke(handle_t *handle, struct journal_head *jh) |
409 | 426 | { |
410 | 427 | |
... | ... | @@ -481,10 +498,7 @@ |
481 | 498 | /* |
482 | 499 | * Write revoke records to the journal for all entries in the current |
483 | 500 | * revoke hash, deleting the entries as we go. |
484 | - * | |
485 | - * Called with the journal lock held. | |
486 | 501 | */ |
487 | - | |
488 | 502 | void journal_write_revoke_records(journal_t *journal, |
489 | 503 | transaction_t *transaction) |
490 | 504 | { |