If you add a list to an inode, you need to protect it with a spinlock. So
you take one more spinlock for any write bio submitted --- a lot of
developers would hate it.
Another problem: how do you want to walk all dirty pages and submit bio
for them?
The act of allocating and submission of bio can block (if you run out of
some mempool) and in this case it wait until some other bio is finished.
During this time, more dirty pages can be created.
Also, if you find a page that is both dirty and under writeback, you need
to wait until a writeback finishes and then initiate another writeback
(because the old writeback may be writing stale data). You again, block,
and more dirty pages can appear.
And if you block and more dirty pages appear, you are prone to the
livelock.
[ In Nick Piggin's patch, it is needed to lock the whole address space,
mark dirty pages in one non-blocking pass and write marked pages again in
a blocking pass --- so that if more dirty pages appear while bios are
submitted, the new pages will be skipped ]
Mikulas
--