It's should essentially almost never trigger, so it doesn't matter if we just restart the scan and potentially do a bit more IO in this case. And then we can drop bdi_lock before going into inode sync. Signed-off-by: Jens Axboe <jens.axboe@xxxxxxxxxx> --- fs/fs-writeback.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-) diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index 65ca410..d646e02 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -517,6 +517,7 @@ void bdi_writeback_all(struct super_block *sb, struct writeback_control *wbc) struct bdi_work *work; LIST_HEAD(list); +restart: mutex_lock(&bdi_lock); list_for_each_entry_safe(bdi, tmp, &bdi_list, bdi_list) { @@ -533,9 +534,13 @@ void bdi_writeback_all(struct super_block *sb, struct writeback_control *wbc) */ work = bdi_alloc_work(sb, wbc->nr_to_write, wbc->sync_mode); if (!work) { + if (!must_wait) + continue; + + mutex_unlock(&bdi_lock); wbc->bdi = bdi; generic_sync_bdi_inodes(sb, wbc); - continue; + goto restart; } if (must_wait) list_add_tail(&work->wait_list, &list); -- 1.6.3.rc0.1.gf800 -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html