diff options
Diffstat (limited to 'fs/btrfs/disk-io.c')
| -rw-r--r-- | fs/btrfs/disk-io.c | 29 | 
1 files changed, 13 insertions, 16 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 0d6ad7512f21..70fc4e7cc5a0 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -884,7 +884,7 @@ struct btrfs_root *btrfs_create_tree(struct btrfs_trans_handle *trans,  	btrfs_set_root_used(&root->root_item, leaf->len);  	btrfs_set_root_last_snapshot(&root->root_item, 0);  	btrfs_set_root_dirid(&root->root_item, 0); -	if (is_fstree(objectid)) +	if (btrfs_is_fstree(objectid))  		generate_random_guid(root->root_item.uuid);  	else  		export_guid(root->root_item.uuid, &guid_null); @@ -1104,7 +1104,7 @@ static int btrfs_init_fs_root(struct btrfs_root *root, dev_t anon_dev)  	if (btrfs_root_id(root) != BTRFS_TREE_LOG_OBJECTID &&  	    !btrfs_is_data_reloc_root(root) && -	    is_fstree(btrfs_root_id(root))) { +	    btrfs_is_fstree(btrfs_root_id(root))) {  		set_bit(BTRFS_ROOT_SHAREABLE, &root->state);  		btrfs_check_and_init_root_item(&root->root_item);  	} @@ -1113,7 +1113,7 @@ static int btrfs_init_fs_root(struct btrfs_root *root, dev_t anon_dev)  	 * Don't assign anonymous block device to roots that are not exposed to  	 * userspace, the id pool is limited to 1M  	 */ -	if (is_fstree(btrfs_root_id(root)) && +	if (btrfs_is_fstree(btrfs_root_id(root)) &&  	    btrfs_root_refs(&root->root_item) > 0) {  		if (!anon_dev) {  			ret = get_anon_bdev(&root->anon_dev); @@ -1246,6 +1246,8 @@ void btrfs_free_fs_info(struct btrfs_fs_info *fs_info)  {  	struct percpu_counter *em_counter = &fs_info->evictable_extent_maps; +	if (fs_info->fs_devices) +		btrfs_close_devices(fs_info->fs_devices);  	percpu_counter_destroy(&fs_info->stats_read_blocks);  	percpu_counter_destroy(&fs_info->dirty_metadata_bytes);  	percpu_counter_destroy(&fs_info->delalloc_bytes); @@ -1315,7 +1317,7 @@ static struct btrfs_root *btrfs_get_root_ref(struct btrfs_fs_info *fs_info,  	 * This is namely for free-space-tree and quota tree, which can change  	 * at runtime and should only be grabbed from fs_info.  	 */ -	if (!is_fstree(objectid) && objectid != BTRFS_DATA_RELOC_TREE_OBJECTID) +	if (!btrfs_is_fstree(objectid) && objectid != BTRFS_DATA_RELOC_TREE_OBJECTID)  		return ERR_PTR(-ENOENT);  again:  	root = btrfs_lookup_fs_root(fs_info, objectid); @@ -1947,7 +1949,6 @@ static void btrfs_init_qgroup(struct btrfs_fs_info *fs_info)  	fs_info->qgroup_tree = RB_ROOT;  	INIT_LIST_HEAD(&fs_info->dirty_qgroups);  	fs_info->qgroup_seq = 1; -	fs_info->qgroup_ulist = NULL;  	fs_info->qgroup_rescan_running = false;  	fs_info->qgroup_drop_subtree_thres = BTRFS_QGROUP_DROP_SUBTREE_THRES_DEFAULT;  	mutex_init(&fs_info->qgroup_rescan_lock); @@ -2028,14 +2029,10 @@ static int btrfs_init_csum_hash(struct btrfs_fs_info *fs_info, u16 csum_type)  	fs_info->csum_shash = csum_shash; -	/* -	 * Check if the checksum implementation is a fast accelerated one. -	 * As-is this is a bit of a hack and should be replaced once the csum -	 * implementations provide that information themselves. -	 */ +	/* Check if the checksum implementation is a fast accelerated one. */  	switch (csum_type) {  	case BTRFS_CSUM_TYPE_CRC32: -		if (!strstr(crypto_shash_driver_name(csum_shash), "generic")) +		if (crc32_optimizations() & CRC32C_OPTIMIZATION)  			set_bit(BTRFS_FS_CSUM_IMPL_FAST, &fs_info->flags);  		break;  	case BTRFS_CSUM_TYPE_XXHASH: @@ -3396,6 +3393,7 @@ int __cold open_ctree(struct super_block *sb, struct btrfs_fs_devices *fs_device  	fs_info->delalloc_batch = sectorsize * 512 * (1 + ilog2(nr_cpu_ids));  	fs_info->nodesize = nodesize; +	fs_info->nodesize_bits = ilog2(nodesize);  	fs_info->sectorsize = sectorsize;  	fs_info->sectorsize_bits = ilog2(sectorsize);  	fs_info->csums_per_leaf = BTRFS_MAX_ITEM_SIZE(fs_info) / fs_info->csum_size; @@ -3561,6 +3559,7 @@ int __cold open_ctree(struct super_block *sb, struct btrfs_fs_devices *fs_device  		goto fail_sysfs;  	} +	btrfs_zoned_reserve_data_reloc_bg(fs_info);  	btrfs_free_zone_cache(fs_info);  	btrfs_check_active_zone_reservation(fs_info); @@ -3681,7 +3680,6 @@ fail_alloc:  	iput(fs_info->btree_inode);  fail: -	btrfs_close_devices(fs_info->fs_devices);  	ASSERT(ret < 0);  	return ret;  } @@ -3694,7 +3692,7 @@ static void btrfs_end_super_write(struct bio *bio)  	bio_for_each_folio_all(fi, bio) {  		if (bio->bi_status) { -			btrfs_warn_rl_in_rcu(device->fs_info, +			btrfs_warn_rl(device->fs_info,  				"lost super block write due to IO error on %s (%d)",  				btrfs_dev_name(device),  				blk_status_to_errno(bio->bi_status)); @@ -3992,7 +3990,7 @@ int btrfs_get_num_tolerated_disk_barrier_failures(u64 flags)  	}  	if (min_tolerated == INT_MAX) { -		pr_warn("BTRFS: unknown raid flag: %llu", flags); +		btrfs_warn(NULL, "unknown raid flag: %llu", flags);  		min_tolerated = 0;  	} @@ -4428,7 +4426,6 @@ void __cold close_ctree(struct btrfs_fs_info *fs_info)  	iput(fs_info->btree_inode);  	btrfs_mapping_tree_free(fs_info); -	btrfs_close_devices(fs_info->fs_devices);  }  void btrfs_mark_buffer_dirty(struct btrfs_trans_handle *trans, @@ -4640,7 +4637,7 @@ static void btrfs_destroy_marked_extents(struct btrfs_fs_info *fs_info,  	while (btrfs_find_first_extent_bit(dirty_pages, start, &start, &end,  					   mark, NULL)) { -		btrfs_clear_extent_bits(dirty_pages, start, end, mark); +		btrfs_clear_extent_bit(dirty_pages, start, end, mark, NULL);  		while (start <= end) {  			eb = find_extent_buffer(fs_info, start);  			start += fs_info->nodesize;  | 
