writeback: make writeback initiation functions handle multiple bdi_writeback's
authorTejun Heo <tj@kernel.org>
Fri, 22 May 2015 21:14:01 +0000 (17:14 -0400)
committerJens Axboe <axboe@fb.com>
Tue, 2 Jun 2015 14:33:37 +0000 (08:33 -0600)
commitdb125360409fc320790e0d38218bd7a3e9cd2552
treea98cba26a1b4ef36b29c90e27cae8d6d42ae61d3
parentf30a7d0cc8d9096d6728fadd0ab024e648010ec0
writeback: make writeback initiation functions handle multiple bdi_writeback's

[try_]writeback_inodes_sb[_nr]() and sync_inodes_sb() currently only
handle dirty inodes on the root wb (bdi_writeback) of the target bdi.
This patch implements bdi_split_work_to_wbs() and use it to make these
functions handle multiple wb's.

bdi_split_work_to_wbs() takes a base wb_writeback_work and create
clones of it and issue them to the wb's of the target bdi.  The base
work's nr_pages is distributed using wb_split_bdi_pages() -
ie. according to each wb's write bandwidth's proportion in the bdi.

Cloning a bdi involves memory allocation which may fail.  In such
cases, bdi_split_work_to_wbs() issues the base work directly and waits
for its completion before proceeding to the next wb to guarantee
forward progress and correctness under memory pressure.

Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Jan Kara <jack@suse.cz>
Signed-off-by: Jens Axboe <axboe@fb.com>
fs/fs-writeback.c