btrfs: change how repair action is passed to btrfs_repair_one_sector
authorDavid Sterba <dsterba@suse.com>
Thu, 27 Oct 2022 00:02:32 +0000 (02:02 +0200)
committerDavid Sterba <dsterba@suse.com>
Mon, 5 Dec 2022 17:00:51 +0000 (18:00 +0100)
There's a function pointer passed to btrfs_repair_one_sector that will
submit the right bio for repair. However there are only two callbacks,
for buffered and for direct IO. This can be simplified to a bool-based
switch and call either function, indirect calls in this case is an
unnecessary abstraction. This allows to remove the submit_bio_hook_t
typedef.

Reviewed-by: Anand Jain <anand.jain@oracle.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/btrfs_inode.h
fs/btrfs/compression.c
fs/btrfs/extent_io.c
fs/btrfs/extent_io.h
fs/btrfs/inode.c

index d21c30b..fa0c72c 100644 (file)
@@ -414,6 +414,9 @@ static inline void btrfs_inode_split_flags(u64 inode_item_flags,
 void btrfs_submit_data_write_bio(struct inode *inode, struct bio *bio, int mirror_num);
 void btrfs_submit_data_read_bio(struct inode *inode, struct bio *bio,
                        int mirror_num, enum btrfs_compression_type compress_type);
+void btrfs_submit_dio_repair_bio(struct inode *inode, struct bio *bio,
+                                int mirror_num,
+                                enum btrfs_compression_type compress_type);
 int btrfs_check_sector_csum(struct btrfs_fs_info *fs_info, struct page *page,
                            u32 pgoff, u8 *csum, const u8 * const csum_expected);
 int btrfs_check_data_csum(struct inode *inode, struct btrfs_bio *bbio,
index e66fa18..cf3dc7e 100644 (file)
@@ -196,7 +196,7 @@ static void end_compressed_bio_read(struct btrfs_bio *bbio)
                        refcount_inc(&cb->pending_ios);
                        ret = btrfs_repair_one_sector(inode, bbio, offset,
                                                      bv.bv_page, bv.bv_offset,
-                                                     btrfs_submit_data_read_bio);
+                                                     true);
                        if (ret) {
                                refcount_dec(&cb->pending_ios);
                                status = errno_to_blk_status(ret);
index 2ec989b..44ff413 100644 (file)
@@ -797,7 +797,7 @@ static struct io_failure_record *btrfs_get_io_failure_record(struct inode *inode
 
 int btrfs_repair_one_sector(struct inode *inode, struct btrfs_bio *failed_bbio,
                            u32 bio_offset, struct page *page, unsigned int pgoff,
-                           submit_bio_hook_t *submit_bio_hook)
+                           bool submit_buffered)
 {
        u64 start = failed_bbio->file_offset + bio_offset;
        struct io_failure_record *failrec;
@@ -856,11 +856,15 @@ int btrfs_repair_one_sector(struct inode *inode, struct btrfs_bio *failed_bbio,
                    failrec->this_mirror);
 
        /*
-        * At this point we have a bio, so any errors from submit_bio_hook()
-        * will be handled by the endio on the repair_bio, so we can't return an
+        * At this point we have a bio, so any errors from bio submission will
+        * be handled by the endio on the repair_bio, so we can't return an
         * error here.
         */
-       submit_bio_hook(inode, repair_bio, failrec->this_mirror, 0);
+       if (submit_buffered)
+               btrfs_submit_data_read_bio(inode, repair_bio, failrec->this_mirror, 0);
+       else
+               btrfs_submit_dio_repair_bio(inode, repair_bio, failrec->this_mirror, 0);
+
        return BLK_STS_OK;
 }
 
@@ -951,7 +955,7 @@ static void submit_data_read_repair(struct inode *inode,
 
                ret = btrfs_repair_one_sector(inode, failed_bbio,
                                bio_offset + offset, page, pgoff + offset,
-                               btrfs_submit_data_read_bio);
+                               true);
                if (!ret) {
                        /*
                         * We have submitted the read repair, the page release
index a5ec147..321680f 100644 (file)
@@ -70,10 +70,6 @@ struct extent_io_tree;
 int __init extent_buffer_init_cachep(void);
 void __cold extent_buffer_free_cachep(void);
 
-typedef void (submit_bio_hook_t)(struct inode *inode, struct bio *bio,
-                                        int mirror_num,
-                                        enum btrfs_compression_type compress_type);
-
 typedef blk_status_t (extent_submit_bio_start_t)(struct inode *inode,
                struct bio *bio, u64 dio_file_offset);
 
@@ -277,7 +273,7 @@ struct io_failure_record {
 
 int btrfs_repair_one_sector(struct inode *inode, struct btrfs_bio *failed_bbio,
                            u32 bio_offset, struct page *page, unsigned int pgoff,
-                           submit_bio_hook_t *submit_bio_hook);
+                           bool submit_buffered);
 void btrfs_free_io_failure_record(struct btrfs_inode *inode, u64 start, u64 end);
 int btrfs_clean_io_failure(struct btrfs_inode *inode, u64 start,
                           struct page *page, unsigned int pg_offset);
index 1422f07..8cc1283 100644 (file)
@@ -7923,9 +7923,9 @@ static void btrfs_dio_private_put(struct btrfs_dio_private *dip)
        bio_endio(&dip->bio);
 }
 
-static void submit_dio_repair_bio(struct inode *inode, struct bio *bio,
-                                 int mirror_num,
-                                 enum btrfs_compression_type compress_type)
+void btrfs_submit_dio_repair_bio(struct inode *inode, struct bio *bio,
+                                int mirror_num,
+                                enum btrfs_compression_type compress_type)
 {
        struct btrfs_dio_private *dip = btrfs_bio(bio)->private;
        struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
@@ -7960,8 +7960,7 @@ static blk_status_t btrfs_check_read_dio_bio(struct btrfs_dio_private *dip,
                        int ret;
 
                        ret = btrfs_repair_one_sector(inode, bbio, offset,
-                                       bv.bv_page, bv.bv_offset,
-                                       submit_dio_repair_bio);
+                                       bv.bv_page, bv.bv_offset, false);
                        if (ret)
                                err = errno_to_blk_status(ret);
                }