Thread (11 messages) 11 messages, 3 authors, 2021-04-02

Re: [PATCH 1/2] Updated locking documentation for transaction_t

From: Jan Kara <jack@suse.cz>
Date: 2021-02-11 13:37:36
Also in: lkml

On Thu 11-02-21 10:53:51, Alexander Lochmann wrote:

On 11.02.21 10:30, Jan Kara wrote:
quoted
quoted
  	 */
  	unsigned long		t_log_start;
-	/* Number of buffers on the t_buffers list [j_list_lock] */
+	/* Number of buffers on the t_buffers list [j_list_lock, no lock for quick racy checks] */
  	int			t_nr_buffers;
So this case is actually somewhat different now that I audited the uses.
There are two types of users - commit code (fs/jbd2/commit.c) and others.
Other users properly use j_list_lock to access t_nr_buffers. Commit code
does not use any locks because committing transaction is fully in
ownership of the jbd2 thread and all other users need to check & wait for
commit to be finished before doing anything with the transaction's buffers.
Mhm I see.
What about '[..., no locks needed for jbd2 thread]'?
Sounds good to me.
How do the others wait for the commit to be finished?
Well, usually they just don't touch buffers belonging to the committing
transation, they just store in b_next_transaction that after commit is
done, buffer should be added to the currently running transaction. There
are some exceptions though - e.g. jbd2_journal_invalidatepage() (called
from truncate code) which returns EBUSY in some rare cases and we use
jbd2_log_wait_commit() in ext4_wait_for_tail_page_commit() to wait for
commit to be done before we know it is safe to destroy the buffer.

								Honza
-- 
Jan Kara [off-list ref]
SUSE Labs, CR
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help