write_cache_pages — walk the list of dirty pages of the given address space and write all of them.
|struct address_space * mapping,|
|struct writeback_control * wbc,|
|void * data|
struct address_space * mapping
address space structure to write
struct writeback_control * wbc
subtract the number of written pages from *
function called for each page
void * data
data passed to writepage function
If a page is already under I/O,
write_cache_pages skips it, even
if it's dirty. This is desirable behaviour for memory-cleaning writeback,
but it is INCORRECT for data-integrity system calls such as
msync need to guarantee that all the data which was dirty at the time
the call was made get new I/O started against them. If wbc->sync_mode is
WB_SYNC_ALL then we were called for data integrity and we must wait for
existing IO to complete.
To avoid livelocks (when other process dirties new pages), we first tag pages which should be written back with TOWRITE tag and only then start writing them. For data-integrity sync we have to be careful so that we do not miss some pages (e.g., because some other process has cleared TOWRITE tag we set). The rule we follow is that TOWRITE tag can be cleared only by the process clearing the DIRTY tag (and submitting the page for IO).