2006-11-11 11:15:54

by Ratna Manoj

[permalink] [raw]
Subject: Understanding ext3

---------- Forwarded message ----------
From: Ratna Manoj <[email protected]>
Date: Nov 11, 2006 4:35 PM
Subject: [email protected]
To: [email protected]


Hi,


int journal_dirty_data(handle_t *handle, struct buffer_head *bh)
{
..................
..................

/*
* This buffer may be undergoing writeout in commit. We
* can't return from here and let the caller dirty it
* again because that can cause the write-out loop in
* commit to never terminate.
*/
if (buffer_dirty(bh)) {
get_bh(bh);
spin_unlock(&journal->j_list_lock);
jbd_unlock_bh_state(bh);
need_brelse = 1;
sync_dirty_buffer(bh);
jbd_lock_bh_state(bh);
spin_lock(&journal->j_list_lock);
/* The buffer may become locked again at any
time if it is redirtied */
}
..............................
..............................
}


Can any body please explain how returning from the above function
cause write-out loop in commit to never terminate ?

If the current buffer is in the data_sync list of previous commiting
transaction, after returning from the journal_dirty_data,
generic_commit_write will redirty the buffer even though previous
commiting transaction commits the buffer to disk. Correct ?


-Ratna.