]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
buffer: Change calling convention for end_buffer_read_sync()
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Thu, 28 May 2026 17:31:46 +0000 (18:31 +0100)
committerChristian Brauner <brauner@kernel.org>
Thu, 4 Jun 2026 08:28:10 +0000 (10:28 +0200)
Unify end_buffer_read_sync() and __end_buffer_read_notouch()
by requiring the caller put the refcount on the buffer.  The only caller
is in the gfs2_meta_read() path, and there we can put the refcount
after locking the buffer.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Link: https://patch.msgid.link/20260528173150.1093780-34-willy@infradead.org
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
fs/buffer.c
fs/gfs2/meta_io.c

index ccda92920175d3e245d6f8402771f9518b59108f..db604c0e54d44bd0f18eae9500d21a7b3a5ae7fe 100644 (file)
@@ -157,15 +157,15 @@ bool bio_endio_bh(struct bio *bio, struct buffer_head **bhp)
 }
 EXPORT_SYMBOL(bio_endio_bh);
 
-/*
- * End-of-IO handler helper function which does not touch the bh after
- * unlocking it.
- * Note: unlock_buffer() sort-of does touch the bh after unlocking it, but
- * a race there is benign: unlock_buffer() only use the bh's address for
- * hashing after unlocking the buffer, so it doesn't actually touch the bh
- * itself.
+/**
+ * end_buffer_read_sync - Handle buffer reads finishing
+ * @bh: The buffer.
+ * @uptodate: True if the read was successful.
+ *
+ * If a buffer is read through a mechanism that isn't bh_submit(), you
+ * can call this function to finish the read.
  */
-static void __end_buffer_read_notouch(struct buffer_head *bh, int uptodate)
+void end_buffer_read_sync(struct buffer_head *bh, int uptodate)
 {
        if (uptodate) {
                set_buffer_uptodate(bh);
@@ -175,16 +175,6 @@ static void __end_buffer_read_notouch(struct buffer_head *bh, int uptodate)
        }
        unlock_buffer(bh);
 }
-
-/*
- * Default synchronous end-of-IO handler..  Just mark it up-to-date and
- * unlock the buffer.
- */
-void end_buffer_read_sync(struct buffer_head *bh, int uptodate)
-{
-       put_bh(bh);
-       __end_buffer_read_notouch(bh, uptodate);
-}
 EXPORT_SYMBOL(end_buffer_read_sync);
 
 /**
@@ -198,7 +188,7 @@ void bh_end_read(struct bio *bio)
 {
        struct buffer_head *bh;
        bool uptodate = bio_endio_bh(bio, &bh);
-       __end_buffer_read_notouch(bh, uptodate);
+       end_buffer_read_sync(bh, uptodate);
 }
 EXPORT_SYMBOL(bh_end_read);
 
index 4895bb010cfb2fed11d406f01a588b4974a15b94..a87cfbf0df38706e6b7c63cc55f5251765d6b398 100644 (file)
@@ -286,10 +286,10 @@ int gfs2_meta_read(struct gfs2_glock *gl, u64 blkno, int flags,
                lock_buffer(bh);
                if (buffer_uptodate(bh)) {
                        unlock_buffer(bh);
-                       brelse(bh);
                } else {
                        bhs[num++] = bh;
                }
+               brelse(bh);
        }
 
        gfs2_submit_bhs(REQ_OP_READ | REQ_META | REQ_PRIO, bhs, num);