Patch "Revert "gfs2: stop using generic_writepages in gfs2_ail1_start_one"" has been added to the 6.1-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    Revert "gfs2: stop using generic_writepages in gfs2_ail1_start_one"

to the 6.1-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     revert-gfs2-stop-using-generic_writepages-in-gfs2_ai.patch
and it can be found in the queue-6.1 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 93d079890c729fc5eafc4f0d78cdf74e981ceded
Author: Andreas Gruenbacher <agruenba@xxxxxxxxxx>
Date:   Thu Jan 19 20:14:42 2023 +0100

    Revert "gfs2: stop using generic_writepages in gfs2_ail1_start_one"
    
    [ Upstream commit 95ecbd0f162fc06ef4c4045a66f653f47b62a2d3 ]
    
    Commit b2b0a5e97855 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
    b2b0a5e97855 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 b2b0a5e978552e348f85ad9c7568b630a5ede659.
    
    Signed-off-by: Andreas Gruenbacher <agruenba@xxxxxxxxxx>
    Acked-by: Christoph Hellwig <hch@xxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/fs/gfs2/log.c b/fs/gfs2/log.c
index 723639376ae2..61323deb80bc 100644
--- a/fs/gfs2/log.c
+++ b/fs/gfs2/log.c
@@ -80,6 +80,15 @@ void gfs2_remove_from_ail(struct gfs2_bufdata *bd)
 	brelse(bd->bd_bh);
 }
 
+static int __gfs2_writepage(struct page *page, struct writeback_control *wbc,
+		       void *data)
+{
+	struct address_space *mapping = data;
+	int ret = mapping->a_ops->writepage(page, wbc);
+	mapping_set_error(mapping, ret);
+	return ret;
+}
+
 /**
  * gfs2_ail1_start_one - Start I/O on a transaction
  * @sdp: The superblock
@@ -131,7 +140,7 @@ __acquires(&sdp->sd_ail_lock)
 		if (!mapping)
 			continue;
 		spin_unlock(&sdp->sd_ail_lock);
-		ret = filemap_fdatawrite_wbc(mapping, wbc);
+		ret = write_cache_pages(mapping, wbc, __gfs2_writepage, mapping);
 		if (need_resched()) {
 			blk_finish_plug(plug);
 			cond_resched();



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux