• David Howells's avatar
    netfs: Fix missing wakeup after issuing writes · 1ca4169c
    David Howells authored
    After dividing up a proposed write into subrequests, netfslib sets
    NETFS_RREQ_ALL_QUEUED to indicate to the collector that it can move on to
    the final cleanup once it has emptied the subrequest queues.
    
    Now, whilst the collector will normally end up running at least once after
    this bit is set just because it takes a while to process all the write
    subrequests before the collector runs out of subrequests, there exists the
    possibility that the issuing thread will be forced to sleep and the
    collector thread will clean up all the subrequests before ALL_QUEUED gets
    set.
    
    In such a case, the collector thread will not get triggered again and will
    never clear NETFS_RREQ_IN_PROGRESS thus leaving a request uncompleted and
    causing a potential futute hang.
    
    Fix this by scheduling the write collector if all the subrequest queues are
    empty (and thus no writes pending issuance).
    
    Note that we'd do this ideally before queuing the subrequest, but in the
    case of buffered writeback, at least, we can't find out that we've run out
    of folios until after we've called writeback_iter() and it has returned
    NULL - at which point we might not actually have any subrequests still
    under construction.
    
    Fixes: 288ace2f ("netfs: New writeback implementation")
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    Link: https://lore.kernel.org/r/3317784.1727880350@warthog.procyon.org.uk
    cc: Jeff Layton <jlayton@kernel.org>
    cc: netfs@lists.linux.dev
    cc: linux-fsdevel@vger.kernel.org
    Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
    1ca4169c
write_issue.c 20.3 KB