• Andreas Gruenbacher's avatar
    Revert "gfs2: stop using generic_writepages in gfs2_ail1_start_one" · 95ecbd0f
    Andreas Gruenbacher authored
    Commit b2b0a5e9 switched from generic_writepages() to
    filemap_fdatawrite_wbc() in gfs2_ail1_start_one() on the path to
    replacing ->writepage() with ->writepages() and eventually eliminating
    the former.  Function gfs2_ail1_start_one() is called from
    gfs2_log_flush(), our main function for flushing the filesystem log.
    
    Unfortunately, at least as implemented today, ->writepage() and
    ->writepages() are entirely different operations for journaled data
    inodes: while the former creates and submits transactions covering the
    data to be written, the latter flushes dirty buffers out to disk.
    
    With gfs2_ail1_start_one() now calling ->writepages(), we end up
    creating filesystem transactions while we are in the course of a log
    flush, which immediately deadlocks on the sdp->sd_log_flush_lock
    semaphore.
    
    Work around that by going back to how things used to work before commit
    b2b0a5e9 for now; figuring out a superior solution will take time we
    don't have available right now.  However ...
    
    Since the removal of generic_writepages() is imminent, open-code it
    here.  We're already inside a blk_start_plug() ...  blk_finish_plug()
    section here, so skip that part of the original generic_writepages().
    
    This reverts commit b2b0a5e9.
    Signed-off-by: default avatarAndreas Gruenbacher <agruenba@redhat.com>
    Acked-by: default avatarChristoph Hellwig <hch@lst.de>
    95ecbd0f
log.c 37.2 KB