• A
    writeback: do not remove bdi from bdi_list · 78c40cb6
    Artem Bityutskiy 提交于
    The forker thread removes bdis from 'bdi_list' before forking the bdi thread.
    But this is wrong for at least 2 reasons.
    
    Reason #1: if we temporary remove a bdi from the list, we may miss works which
               would otherwise be given to us.
    
    Reason #2: this is racy; indeed, 'bdi_wb_shutdown()' expects that bdis are
               always in the 'bdi_list' (see 'bdi_remove_from_list()'), and when
               it races with the forker thread, it can shut down the bdi thread
               at the same time as the forker creates it.
    
    This patch makes sure the forker thread never removes bdis from 'bdi_list'
    (which was suggested by Christoph Hellwig).
    
    In order to make sure that we do not race with 'bdi_wb_shutdown()', we have to
    hold the 'bdi_lock' while walking the 'bdi_list' and setting the 'BDI_pending'
    flag.
    
    NOTE! The error path is interesting. Currently, when we fail to create a bdi
    thread, we move the bdi to the tail of 'bdi_list'. But if we never remove the
    bdi from the list, we cannot move it to the tail either, because then we can
    mess up the RCU readers which walk the list. And also, we'll have the race
    described above in "Reason #2".
    
    But I not think that adding to the tail is any important so I just do not do
    that.
    Signed-off-by: NArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
    Reviewed-by: NChristoph Hellwig <hch@lst.de>
    Signed-off-by: NJens Axboe <jaxboe@fusionio.com>
    78c40cb6
backing-dev.c 15.5 KB