From: Filipe Manana Date: Tue, 3 Feb 2026 19:45:14 +0000 (+0000) Subject: btrfs: remove max_mirrors argument from write_all_supers() X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8f3fc2d8973af8dc5559ecbbfb5ed3b19b2e8fa5;p=thirdparty%2Flinux.git btrfs: remove max_mirrors argument from write_all_supers() There's no need to pass max_mirrors to write_all_supers() since from the given transaction handle we can infer if we are in a transaction commit or fsync context, so we can determine how many mirrors we need to use. So remove the max_mirror argument from write_all_supers() and stop adjusting it in the callees write_dev_supers() and wait_dev_supers(), simplifying them besides the parameter list for write_all_supers(). Reviewed-by: Qu Wenruo Signed-off-by: Filipe Manana Reviewed-by: David Sterba Signed-off-by: David Sterba --- diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 89f5423f0366..e4a2673ffeaa 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -3756,8 +3756,7 @@ static void btrfs_end_super_write(struct bio *bio) * Write superblock @sb to the @device. Do not wait for completion, all the * folios we use for writing are locked. * - * Write @max_mirrors copies of the superblock, where 0 means default that fit - * the expected device size at commit time. Note that max_mirrors must be + * Write @max_mirrors copies of the superblock. Note that max_mirrors must be * same for write and wait phases. * * Return number of errors when folio is not found or submission fails. @@ -3773,9 +3772,6 @@ static int write_dev_supers(struct btrfs_device *device, atomic_set(&device->sb_write_errors, 0); - if (max_mirrors == 0) - max_mirrors = BTRFS_SUPER_MIRROR_MAX; - for (i = 0; i < max_mirrors; i++) { struct folio *folio; struct bio *bio; @@ -3860,9 +3856,6 @@ static int wait_dev_supers(struct btrfs_device *device, int max_mirrors) int ret; u64 bytenr; - if (max_mirrors == 0) - max_mirrors = BTRFS_SUPER_MIRROR_MAX; - for (i = 0; i < max_mirrors; i++) { struct folio *folio; @@ -4032,13 +4025,14 @@ int btrfs_get_num_tolerated_disk_barrier_failures(u64 flags) return min_tolerated; } -int write_all_supers(struct btrfs_trans_handle *trans, int max_mirrors) +int write_all_supers(struct btrfs_trans_handle *trans) { struct btrfs_fs_info *fs_info = trans->fs_info; struct list_head *head; struct btrfs_device *dev; struct btrfs_super_block *sb; struct btrfs_dev_item *dev_item; + int max_mirrors; int ret; int do_barriers; int max_errors; @@ -4047,12 +4041,12 @@ int write_all_supers(struct btrfs_trans_handle *trans, int max_mirrors) do_barriers = !btrfs_test_opt(fs_info, NOBARRIER); - /* - * max_mirrors == 0 indicates we're from commit_transaction, - * not from fsync where the tree roots in fs_info have not - * been consistent on disk. - */ - if (max_mirrors == 0) { + if (trans->transaction->state < TRANS_STATE_UNBLOCKED) { + /* We are called from fsync. */ + max_mirrors = 1; + } else { + /* We are called from transaction commit. */ + max_mirrors = BTRFS_SUPER_MIRROR_MAX; ret = backup_super_roots(fs_info); if (ret < 0) return ret; diff --git a/fs/btrfs/disk-io.h b/fs/btrfs/disk-io.h index 081a6860861c..163f5114973a 100644 --- a/fs/btrfs/disk-io.h +++ b/fs/btrfs/disk-io.h @@ -58,7 +58,7 @@ void __cold close_ctree(struct btrfs_fs_info *fs_info); int btrfs_validate_super(const struct btrfs_fs_info *fs_info, const struct btrfs_super_block *sb, int mirror_num); int btrfs_check_features(struct btrfs_fs_info *fs_info, bool is_rw_mount); -int write_all_supers(struct btrfs_trans_handle *trans, int max_mirrors); +int write_all_supers(struct btrfs_trans_handle *trans); int btrfs_commit_super(struct btrfs_fs_info *fs_info); struct btrfs_root *btrfs_read_tree_root(struct btrfs_root *tree_root, const struct btrfs_key *key); diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 8f24a025625e..4c1fcf9a71a2 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c @@ -2573,7 +2573,7 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans) goto scrub_continue; } - ret = write_all_supers(trans, 0); + ret = write_all_supers(trans); /* * the super is written, we can safely allow the tree-loggers * to go about their business diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index 4f360ccf8380..304a4325e2e0 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c @@ -3576,7 +3576,7 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans, btrfs_set_super_log_root(fs_info->super_for_commit, log_root_start); btrfs_set_super_log_root_level(fs_info->super_for_commit, log_root_level); - ret = write_all_supers(trans, 1); + ret = write_all_supers(trans); mutex_unlock(&fs_info->tree_log_mutex); if (unlikely(ret)) { btrfs_set_log_full_commit(trans);