162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * linux/fs/ext4/balloc.c 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 1992, 1993, 1994, 1995 662306a36Sopenharmony_ci * Remy Card (card@masi.ibp.fr) 762306a36Sopenharmony_ci * Laboratoire MASI - Institut Blaise Pascal 862306a36Sopenharmony_ci * Universite Pierre et Marie Curie (Paris VI) 962306a36Sopenharmony_ci * 1062306a36Sopenharmony_ci * Enhanced block allocation by Stephen Tweedie (sct@redhat.com), 1993 1162306a36Sopenharmony_ci * Big-endian to little-endian byte-swapping/bitmaps by 1262306a36Sopenharmony_ci * David S. Miller (davem@caip.rutgers.edu), 1995 1362306a36Sopenharmony_ci */ 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#include <linux/time.h> 1662306a36Sopenharmony_ci#include <linux/capability.h> 1762306a36Sopenharmony_ci#include <linux/fs.h> 1862306a36Sopenharmony_ci#include <linux/quotaops.h> 1962306a36Sopenharmony_ci#include <linux/buffer_head.h> 2062306a36Sopenharmony_ci#include "ext4.h" 2162306a36Sopenharmony_ci#include "ext4_jbd2.h" 2262306a36Sopenharmony_ci#include "mballoc.h" 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#include <trace/events/ext4.h> 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_cistatic unsigned ext4_num_base_meta_clusters(struct super_block *sb, 2762306a36Sopenharmony_ci ext4_group_t block_group); 2862306a36Sopenharmony_ci/* 2962306a36Sopenharmony_ci * balloc.c contains the blocks allocation and deallocation routines 3062306a36Sopenharmony_ci */ 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci/* 3362306a36Sopenharmony_ci * Calculate block group number for a given block number 3462306a36Sopenharmony_ci */ 3562306a36Sopenharmony_ciext4_group_t ext4_get_group_number(struct super_block *sb, 3662306a36Sopenharmony_ci ext4_fsblk_t block) 3762306a36Sopenharmony_ci{ 3862306a36Sopenharmony_ci ext4_group_t group; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci if (test_opt2(sb, STD_GROUP_SIZE)) 4162306a36Sopenharmony_ci group = (block - 4262306a36Sopenharmony_ci le32_to_cpu(EXT4_SB(sb)->s_es->s_first_data_block)) >> 4362306a36Sopenharmony_ci (EXT4_BLOCK_SIZE_BITS(sb) + EXT4_CLUSTER_BITS(sb) + 3); 4462306a36Sopenharmony_ci else 4562306a36Sopenharmony_ci ext4_get_group_no_and_offset(sb, block, &group, NULL); 4662306a36Sopenharmony_ci return group; 4762306a36Sopenharmony_ci} 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci/* 5062306a36Sopenharmony_ci * Calculate the block group number and offset into the block/cluster 5162306a36Sopenharmony_ci * allocation bitmap, given a block number 5262306a36Sopenharmony_ci */ 5362306a36Sopenharmony_civoid ext4_get_group_no_and_offset(struct super_block *sb, ext4_fsblk_t blocknr, 5462306a36Sopenharmony_ci ext4_group_t *blockgrpp, ext4_grpblk_t *offsetp) 5562306a36Sopenharmony_ci{ 5662306a36Sopenharmony_ci struct ext4_super_block *es = EXT4_SB(sb)->s_es; 5762306a36Sopenharmony_ci ext4_grpblk_t offset; 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci blocknr = blocknr - le32_to_cpu(es->s_first_data_block); 6062306a36Sopenharmony_ci offset = do_div(blocknr, EXT4_BLOCKS_PER_GROUP(sb)) >> 6162306a36Sopenharmony_ci EXT4_SB(sb)->s_cluster_bits; 6262306a36Sopenharmony_ci if (offsetp) 6362306a36Sopenharmony_ci *offsetp = offset; 6462306a36Sopenharmony_ci if (blockgrpp) 6562306a36Sopenharmony_ci *blockgrpp = blocknr; 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci} 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci/* 7062306a36Sopenharmony_ci * Check whether the 'block' lives within the 'block_group'. Returns 1 if so 7162306a36Sopenharmony_ci * and 0 otherwise. 7262306a36Sopenharmony_ci */ 7362306a36Sopenharmony_cistatic inline int ext4_block_in_group(struct super_block *sb, 7462306a36Sopenharmony_ci ext4_fsblk_t block, 7562306a36Sopenharmony_ci ext4_group_t block_group) 7662306a36Sopenharmony_ci{ 7762306a36Sopenharmony_ci ext4_group_t actual_group; 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci actual_group = ext4_get_group_number(sb, block); 8062306a36Sopenharmony_ci return (actual_group == block_group) ? 1 : 0; 8162306a36Sopenharmony_ci} 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci/* 8462306a36Sopenharmony_ci * Return the number of clusters used for file system metadata; this 8562306a36Sopenharmony_ci * represents the overhead needed by the file system. 8662306a36Sopenharmony_ci */ 8762306a36Sopenharmony_cistatic unsigned ext4_num_overhead_clusters(struct super_block *sb, 8862306a36Sopenharmony_ci ext4_group_t block_group, 8962306a36Sopenharmony_ci struct ext4_group_desc *gdp) 9062306a36Sopenharmony_ci{ 9162306a36Sopenharmony_ci unsigned base_clusters, num_clusters; 9262306a36Sopenharmony_ci int block_cluster = -1, inode_cluster; 9362306a36Sopenharmony_ci int itbl_cluster_start = -1, itbl_cluster_end = -1; 9462306a36Sopenharmony_ci ext4_fsblk_t start = ext4_group_first_block_no(sb, block_group); 9562306a36Sopenharmony_ci ext4_fsblk_t end = start + EXT4_BLOCKS_PER_GROUP(sb) - 1; 9662306a36Sopenharmony_ci ext4_fsblk_t itbl_blk_start, itbl_blk_end; 9762306a36Sopenharmony_ci struct ext4_sb_info *sbi = EXT4_SB(sb); 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci /* This is the number of clusters used by the superblock, 10062306a36Sopenharmony_ci * block group descriptors, and reserved block group 10162306a36Sopenharmony_ci * descriptor blocks */ 10262306a36Sopenharmony_ci base_clusters = ext4_num_base_meta_clusters(sb, block_group); 10362306a36Sopenharmony_ci num_clusters = base_clusters; 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci /* 10662306a36Sopenharmony_ci * Account and record inode table clusters if any cluster 10762306a36Sopenharmony_ci * is in the block group, or inode table cluster range is 10862306a36Sopenharmony_ci * [-1, -1] and won't overlap with block/inode bitmap cluster 10962306a36Sopenharmony_ci * accounted below. 11062306a36Sopenharmony_ci */ 11162306a36Sopenharmony_ci itbl_blk_start = ext4_inode_table(sb, gdp); 11262306a36Sopenharmony_ci itbl_blk_end = itbl_blk_start + sbi->s_itb_per_group - 1; 11362306a36Sopenharmony_ci if (itbl_blk_start <= end && itbl_blk_end >= start) { 11462306a36Sopenharmony_ci itbl_blk_start = itbl_blk_start >= start ? 11562306a36Sopenharmony_ci itbl_blk_start : start; 11662306a36Sopenharmony_ci itbl_blk_end = itbl_blk_end <= end ? 11762306a36Sopenharmony_ci itbl_blk_end : end; 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci itbl_cluster_start = EXT4_B2C(sbi, itbl_blk_start - start); 12062306a36Sopenharmony_ci itbl_cluster_end = EXT4_B2C(sbi, itbl_blk_end - start); 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci num_clusters += itbl_cluster_end - itbl_cluster_start + 1; 12362306a36Sopenharmony_ci /* check if border cluster is overlapped */ 12462306a36Sopenharmony_ci if (itbl_cluster_start == base_clusters - 1) 12562306a36Sopenharmony_ci num_clusters--; 12662306a36Sopenharmony_ci } 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci /* 12962306a36Sopenharmony_ci * For the allocation bitmaps, we first need to check to see 13062306a36Sopenharmony_ci * if the block is in the block group. If it is, then check 13162306a36Sopenharmony_ci * to see if the cluster is already accounted for in the clusters 13262306a36Sopenharmony_ci * used for the base metadata cluster and inode tables cluster. 13362306a36Sopenharmony_ci * Normally all of these blocks are contiguous, so the special 13462306a36Sopenharmony_ci * case handling shouldn't be necessary except for *very* 13562306a36Sopenharmony_ci * unusual file system layouts. 13662306a36Sopenharmony_ci */ 13762306a36Sopenharmony_ci if (ext4_block_in_group(sb, ext4_block_bitmap(sb, gdp), block_group)) { 13862306a36Sopenharmony_ci block_cluster = EXT4_B2C(sbi, 13962306a36Sopenharmony_ci ext4_block_bitmap(sb, gdp) - start); 14062306a36Sopenharmony_ci if (block_cluster >= base_clusters && 14162306a36Sopenharmony_ci (block_cluster < itbl_cluster_start || 14262306a36Sopenharmony_ci block_cluster > itbl_cluster_end)) 14362306a36Sopenharmony_ci num_clusters++; 14462306a36Sopenharmony_ci } 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci if (ext4_block_in_group(sb, ext4_inode_bitmap(sb, gdp), block_group)) { 14762306a36Sopenharmony_ci inode_cluster = EXT4_B2C(sbi, 14862306a36Sopenharmony_ci ext4_inode_bitmap(sb, gdp) - start); 14962306a36Sopenharmony_ci /* 15062306a36Sopenharmony_ci * Additional check if inode bitmap is in just accounted 15162306a36Sopenharmony_ci * block_cluster 15262306a36Sopenharmony_ci */ 15362306a36Sopenharmony_ci if (inode_cluster != block_cluster && 15462306a36Sopenharmony_ci inode_cluster >= base_clusters && 15562306a36Sopenharmony_ci (inode_cluster < itbl_cluster_start || 15662306a36Sopenharmony_ci inode_cluster > itbl_cluster_end)) 15762306a36Sopenharmony_ci num_clusters++; 15862306a36Sopenharmony_ci } 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci return num_clusters; 16162306a36Sopenharmony_ci} 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_cistatic unsigned int num_clusters_in_group(struct super_block *sb, 16462306a36Sopenharmony_ci ext4_group_t block_group) 16562306a36Sopenharmony_ci{ 16662306a36Sopenharmony_ci unsigned int blocks; 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ci if (block_group == ext4_get_groups_count(sb) - 1) { 16962306a36Sopenharmony_ci /* 17062306a36Sopenharmony_ci * Even though mke2fs always initializes the first and 17162306a36Sopenharmony_ci * last group, just in case some other tool was used, 17262306a36Sopenharmony_ci * we need to make sure we calculate the right free 17362306a36Sopenharmony_ci * blocks. 17462306a36Sopenharmony_ci */ 17562306a36Sopenharmony_ci blocks = ext4_blocks_count(EXT4_SB(sb)->s_es) - 17662306a36Sopenharmony_ci ext4_group_first_block_no(sb, block_group); 17762306a36Sopenharmony_ci } else 17862306a36Sopenharmony_ci blocks = EXT4_BLOCKS_PER_GROUP(sb); 17962306a36Sopenharmony_ci return EXT4_NUM_B2C(EXT4_SB(sb), blocks); 18062306a36Sopenharmony_ci} 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci/* Initializes an uninitialized block bitmap */ 18362306a36Sopenharmony_cistatic int ext4_init_block_bitmap(struct super_block *sb, 18462306a36Sopenharmony_ci struct buffer_head *bh, 18562306a36Sopenharmony_ci ext4_group_t block_group, 18662306a36Sopenharmony_ci struct ext4_group_desc *gdp) 18762306a36Sopenharmony_ci{ 18862306a36Sopenharmony_ci unsigned int bit, bit_max; 18962306a36Sopenharmony_ci struct ext4_sb_info *sbi = EXT4_SB(sb); 19062306a36Sopenharmony_ci ext4_fsblk_t start, tmp; 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_ci ASSERT(buffer_locked(bh)); 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ci if (!ext4_group_desc_csum_verify(sb, block_group, gdp)) { 19562306a36Sopenharmony_ci ext4_mark_group_bitmap_corrupted(sb, block_group, 19662306a36Sopenharmony_ci EXT4_GROUP_INFO_BBITMAP_CORRUPT | 19762306a36Sopenharmony_ci EXT4_GROUP_INFO_IBITMAP_CORRUPT); 19862306a36Sopenharmony_ci return -EFSBADCRC; 19962306a36Sopenharmony_ci } 20062306a36Sopenharmony_ci memset(bh->b_data, 0, sb->s_blocksize); 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci bit_max = ext4_num_base_meta_clusters(sb, block_group); 20362306a36Sopenharmony_ci if ((bit_max >> 3) >= bh->b_size) 20462306a36Sopenharmony_ci return -EFSCORRUPTED; 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_ci for (bit = 0; bit < bit_max; bit++) 20762306a36Sopenharmony_ci ext4_set_bit(bit, bh->b_data); 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci start = ext4_group_first_block_no(sb, block_group); 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci /* Set bits for block and inode bitmaps, and inode table */ 21262306a36Sopenharmony_ci tmp = ext4_block_bitmap(sb, gdp); 21362306a36Sopenharmony_ci if (ext4_block_in_group(sb, tmp, block_group)) 21462306a36Sopenharmony_ci ext4_set_bit(EXT4_B2C(sbi, tmp - start), bh->b_data); 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ci tmp = ext4_inode_bitmap(sb, gdp); 21762306a36Sopenharmony_ci if (ext4_block_in_group(sb, tmp, block_group)) 21862306a36Sopenharmony_ci ext4_set_bit(EXT4_B2C(sbi, tmp - start), bh->b_data); 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ci tmp = ext4_inode_table(sb, gdp); 22162306a36Sopenharmony_ci for (; tmp < ext4_inode_table(sb, gdp) + 22262306a36Sopenharmony_ci sbi->s_itb_per_group; tmp++) { 22362306a36Sopenharmony_ci if (ext4_block_in_group(sb, tmp, block_group)) 22462306a36Sopenharmony_ci ext4_set_bit(EXT4_B2C(sbi, tmp - start), bh->b_data); 22562306a36Sopenharmony_ci } 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci /* 22862306a36Sopenharmony_ci * Also if the number of blocks within the group is less than 22962306a36Sopenharmony_ci * the blocksize * 8 ( which is the size of bitmap ), set rest 23062306a36Sopenharmony_ci * of the block bitmap to 1 23162306a36Sopenharmony_ci */ 23262306a36Sopenharmony_ci ext4_mark_bitmap_end(num_clusters_in_group(sb, block_group), 23362306a36Sopenharmony_ci sb->s_blocksize * 8, bh->b_data); 23462306a36Sopenharmony_ci return 0; 23562306a36Sopenharmony_ci} 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ci/* Return the number of free blocks in a block group. It is used when 23862306a36Sopenharmony_ci * the block bitmap is uninitialized, so we can't just count the bits 23962306a36Sopenharmony_ci * in the bitmap. */ 24062306a36Sopenharmony_ciunsigned ext4_free_clusters_after_init(struct super_block *sb, 24162306a36Sopenharmony_ci ext4_group_t block_group, 24262306a36Sopenharmony_ci struct ext4_group_desc *gdp) 24362306a36Sopenharmony_ci{ 24462306a36Sopenharmony_ci return num_clusters_in_group(sb, block_group) - 24562306a36Sopenharmony_ci ext4_num_overhead_clusters(sb, block_group, gdp); 24662306a36Sopenharmony_ci} 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci/* 24962306a36Sopenharmony_ci * The free blocks are managed by bitmaps. A file system contains several 25062306a36Sopenharmony_ci * blocks groups. Each group contains 1 bitmap block for blocks, 1 bitmap 25162306a36Sopenharmony_ci * block for inodes, N blocks for the inode table and data blocks. 25262306a36Sopenharmony_ci * 25362306a36Sopenharmony_ci * The file system contains group descriptors which are located after the 25462306a36Sopenharmony_ci * super block. Each descriptor contains the number of the bitmap block and 25562306a36Sopenharmony_ci * the free blocks count in the block. The descriptors are loaded in memory 25662306a36Sopenharmony_ci * when a file system is mounted (see ext4_fill_super). 25762306a36Sopenharmony_ci */ 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_ci/** 26062306a36Sopenharmony_ci * ext4_get_group_desc() -- load group descriptor from disk 26162306a36Sopenharmony_ci * @sb: super block 26262306a36Sopenharmony_ci * @block_group: given block group 26362306a36Sopenharmony_ci * @bh: pointer to the buffer head to store the block 26462306a36Sopenharmony_ci * group descriptor 26562306a36Sopenharmony_ci */ 26662306a36Sopenharmony_cistruct ext4_group_desc * ext4_get_group_desc(struct super_block *sb, 26762306a36Sopenharmony_ci ext4_group_t block_group, 26862306a36Sopenharmony_ci struct buffer_head **bh) 26962306a36Sopenharmony_ci{ 27062306a36Sopenharmony_ci unsigned int group_desc; 27162306a36Sopenharmony_ci unsigned int offset; 27262306a36Sopenharmony_ci ext4_group_t ngroups = ext4_get_groups_count(sb); 27362306a36Sopenharmony_ci struct ext4_group_desc *desc; 27462306a36Sopenharmony_ci struct ext4_sb_info *sbi = EXT4_SB(sb); 27562306a36Sopenharmony_ci struct buffer_head *bh_p; 27662306a36Sopenharmony_ci 27762306a36Sopenharmony_ci if (block_group >= ngroups) { 27862306a36Sopenharmony_ci ext4_error(sb, "block_group >= groups_count - block_group = %u," 27962306a36Sopenharmony_ci " groups_count = %u", block_group, ngroups); 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_ci return NULL; 28262306a36Sopenharmony_ci } 28362306a36Sopenharmony_ci 28462306a36Sopenharmony_ci group_desc = block_group >> EXT4_DESC_PER_BLOCK_BITS(sb); 28562306a36Sopenharmony_ci offset = block_group & (EXT4_DESC_PER_BLOCK(sb) - 1); 28662306a36Sopenharmony_ci bh_p = sbi_array_rcu_deref(sbi, s_group_desc, group_desc); 28762306a36Sopenharmony_ci /* 28862306a36Sopenharmony_ci * sbi_array_rcu_deref returns with rcu unlocked, this is ok since 28962306a36Sopenharmony_ci * the pointer being dereferenced won't be dereferenced again. By 29062306a36Sopenharmony_ci * looking at the usage in add_new_gdb() the value isn't modified, 29162306a36Sopenharmony_ci * just the pointer, and so it remains valid. 29262306a36Sopenharmony_ci */ 29362306a36Sopenharmony_ci if (!bh_p) { 29462306a36Sopenharmony_ci ext4_error(sb, "Group descriptor not loaded - " 29562306a36Sopenharmony_ci "block_group = %u, group_desc = %u, desc = %u", 29662306a36Sopenharmony_ci block_group, group_desc, offset); 29762306a36Sopenharmony_ci return NULL; 29862306a36Sopenharmony_ci } 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_ci desc = (struct ext4_group_desc *)( 30162306a36Sopenharmony_ci (__u8 *)bh_p->b_data + 30262306a36Sopenharmony_ci offset * EXT4_DESC_SIZE(sb)); 30362306a36Sopenharmony_ci if (bh) 30462306a36Sopenharmony_ci *bh = bh_p; 30562306a36Sopenharmony_ci return desc; 30662306a36Sopenharmony_ci} 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_cistatic ext4_fsblk_t ext4_valid_block_bitmap_padding(struct super_block *sb, 30962306a36Sopenharmony_ci ext4_group_t block_group, 31062306a36Sopenharmony_ci struct buffer_head *bh) 31162306a36Sopenharmony_ci{ 31262306a36Sopenharmony_ci ext4_grpblk_t next_zero_bit; 31362306a36Sopenharmony_ci unsigned long bitmap_size = sb->s_blocksize * 8; 31462306a36Sopenharmony_ci unsigned int offset = num_clusters_in_group(sb, block_group); 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_ci if (bitmap_size <= offset) 31762306a36Sopenharmony_ci return 0; 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_ci next_zero_bit = ext4_find_next_zero_bit(bh->b_data, bitmap_size, offset); 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_ci return (next_zero_bit < bitmap_size ? next_zero_bit : 0); 32262306a36Sopenharmony_ci} 32362306a36Sopenharmony_ci 32462306a36Sopenharmony_cistruct ext4_group_info *ext4_get_group_info(struct super_block *sb, 32562306a36Sopenharmony_ci ext4_group_t group) 32662306a36Sopenharmony_ci{ 32762306a36Sopenharmony_ci struct ext4_group_info **grp_info; 32862306a36Sopenharmony_ci long indexv, indexh; 32962306a36Sopenharmony_ci 33062306a36Sopenharmony_ci if (unlikely(group >= EXT4_SB(sb)->s_groups_count)) 33162306a36Sopenharmony_ci return NULL; 33262306a36Sopenharmony_ci indexv = group >> (EXT4_DESC_PER_BLOCK_BITS(sb)); 33362306a36Sopenharmony_ci indexh = group & ((EXT4_DESC_PER_BLOCK(sb)) - 1); 33462306a36Sopenharmony_ci grp_info = sbi_array_rcu_deref(EXT4_SB(sb), s_group_info, indexv); 33562306a36Sopenharmony_ci return grp_info[indexh]; 33662306a36Sopenharmony_ci} 33762306a36Sopenharmony_ci 33862306a36Sopenharmony_ci/* 33962306a36Sopenharmony_ci * Return the block number which was discovered to be invalid, or 0 if 34062306a36Sopenharmony_ci * the block bitmap is valid. 34162306a36Sopenharmony_ci */ 34262306a36Sopenharmony_cistatic ext4_fsblk_t ext4_valid_block_bitmap(struct super_block *sb, 34362306a36Sopenharmony_ci struct ext4_group_desc *desc, 34462306a36Sopenharmony_ci ext4_group_t block_group, 34562306a36Sopenharmony_ci struct buffer_head *bh) 34662306a36Sopenharmony_ci{ 34762306a36Sopenharmony_ci struct ext4_sb_info *sbi = EXT4_SB(sb); 34862306a36Sopenharmony_ci ext4_grpblk_t offset; 34962306a36Sopenharmony_ci ext4_grpblk_t next_zero_bit; 35062306a36Sopenharmony_ci ext4_grpblk_t max_bit = EXT4_CLUSTERS_PER_GROUP(sb); 35162306a36Sopenharmony_ci ext4_fsblk_t blk; 35262306a36Sopenharmony_ci ext4_fsblk_t group_first_block; 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_ci if (ext4_has_feature_flex_bg(sb)) { 35562306a36Sopenharmony_ci /* with FLEX_BG, the inode/block bitmaps and itable 35662306a36Sopenharmony_ci * blocks may not be in the group at all 35762306a36Sopenharmony_ci * so the bitmap validation will be skipped for those groups 35862306a36Sopenharmony_ci * or it has to also read the block group where the bitmaps 35962306a36Sopenharmony_ci * are located to verify they are set. 36062306a36Sopenharmony_ci */ 36162306a36Sopenharmony_ci return 0; 36262306a36Sopenharmony_ci } 36362306a36Sopenharmony_ci group_first_block = ext4_group_first_block_no(sb, block_group); 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_ci /* check whether block bitmap block number is set */ 36662306a36Sopenharmony_ci blk = ext4_block_bitmap(sb, desc); 36762306a36Sopenharmony_ci offset = blk - group_first_block; 36862306a36Sopenharmony_ci if (offset < 0 || EXT4_B2C(sbi, offset) >= max_bit || 36962306a36Sopenharmony_ci !ext4_test_bit(EXT4_B2C(sbi, offset), bh->b_data)) 37062306a36Sopenharmony_ci /* bad block bitmap */ 37162306a36Sopenharmony_ci return blk; 37262306a36Sopenharmony_ci 37362306a36Sopenharmony_ci /* check whether the inode bitmap block number is set */ 37462306a36Sopenharmony_ci blk = ext4_inode_bitmap(sb, desc); 37562306a36Sopenharmony_ci offset = blk - group_first_block; 37662306a36Sopenharmony_ci if (offset < 0 || EXT4_B2C(sbi, offset) >= max_bit || 37762306a36Sopenharmony_ci !ext4_test_bit(EXT4_B2C(sbi, offset), bh->b_data)) 37862306a36Sopenharmony_ci /* bad block bitmap */ 37962306a36Sopenharmony_ci return blk; 38062306a36Sopenharmony_ci 38162306a36Sopenharmony_ci /* check whether the inode table block number is set */ 38262306a36Sopenharmony_ci blk = ext4_inode_table(sb, desc); 38362306a36Sopenharmony_ci offset = blk - group_first_block; 38462306a36Sopenharmony_ci if (offset < 0 || EXT4_B2C(sbi, offset) >= max_bit || 38562306a36Sopenharmony_ci EXT4_B2C(sbi, offset + sbi->s_itb_per_group - 1) >= max_bit) 38662306a36Sopenharmony_ci return blk; 38762306a36Sopenharmony_ci next_zero_bit = ext4_find_next_zero_bit(bh->b_data, 38862306a36Sopenharmony_ci EXT4_B2C(sbi, offset + sbi->s_itb_per_group - 1) + 1, 38962306a36Sopenharmony_ci EXT4_B2C(sbi, offset)); 39062306a36Sopenharmony_ci if (next_zero_bit < 39162306a36Sopenharmony_ci EXT4_B2C(sbi, offset + sbi->s_itb_per_group - 1) + 1) 39262306a36Sopenharmony_ci /* bad bitmap for inode tables */ 39362306a36Sopenharmony_ci return blk; 39462306a36Sopenharmony_ci return 0; 39562306a36Sopenharmony_ci} 39662306a36Sopenharmony_ci 39762306a36Sopenharmony_cistatic int ext4_validate_block_bitmap(struct super_block *sb, 39862306a36Sopenharmony_ci struct ext4_group_desc *desc, 39962306a36Sopenharmony_ci ext4_group_t block_group, 40062306a36Sopenharmony_ci struct buffer_head *bh) 40162306a36Sopenharmony_ci{ 40262306a36Sopenharmony_ci ext4_fsblk_t blk; 40362306a36Sopenharmony_ci struct ext4_group_info *grp; 40462306a36Sopenharmony_ci 40562306a36Sopenharmony_ci if (EXT4_SB(sb)->s_mount_state & EXT4_FC_REPLAY) 40662306a36Sopenharmony_ci return 0; 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_ci grp = ext4_get_group_info(sb, block_group); 40962306a36Sopenharmony_ci 41062306a36Sopenharmony_ci if (buffer_verified(bh)) 41162306a36Sopenharmony_ci return 0; 41262306a36Sopenharmony_ci if (!grp || EXT4_MB_GRP_BBITMAP_CORRUPT(grp)) 41362306a36Sopenharmony_ci return -EFSCORRUPTED; 41462306a36Sopenharmony_ci 41562306a36Sopenharmony_ci ext4_lock_group(sb, block_group); 41662306a36Sopenharmony_ci if (buffer_verified(bh)) 41762306a36Sopenharmony_ci goto verified; 41862306a36Sopenharmony_ci if (unlikely(!ext4_block_bitmap_csum_verify(sb, desc, bh) || 41962306a36Sopenharmony_ci ext4_simulate_fail(sb, EXT4_SIM_BBITMAP_CRC))) { 42062306a36Sopenharmony_ci ext4_unlock_group(sb, block_group); 42162306a36Sopenharmony_ci ext4_error(sb, "bg %u: bad block bitmap checksum", block_group); 42262306a36Sopenharmony_ci ext4_mark_group_bitmap_corrupted(sb, block_group, 42362306a36Sopenharmony_ci EXT4_GROUP_INFO_BBITMAP_CORRUPT); 42462306a36Sopenharmony_ci return -EFSBADCRC; 42562306a36Sopenharmony_ci } 42662306a36Sopenharmony_ci blk = ext4_valid_block_bitmap(sb, desc, block_group, bh); 42762306a36Sopenharmony_ci if (unlikely(blk != 0)) { 42862306a36Sopenharmony_ci ext4_unlock_group(sb, block_group); 42962306a36Sopenharmony_ci ext4_error(sb, "bg %u: block %llu: invalid block bitmap", 43062306a36Sopenharmony_ci block_group, blk); 43162306a36Sopenharmony_ci ext4_mark_group_bitmap_corrupted(sb, block_group, 43262306a36Sopenharmony_ci EXT4_GROUP_INFO_BBITMAP_CORRUPT); 43362306a36Sopenharmony_ci return -EFSCORRUPTED; 43462306a36Sopenharmony_ci } 43562306a36Sopenharmony_ci blk = ext4_valid_block_bitmap_padding(sb, block_group, bh); 43662306a36Sopenharmony_ci if (unlikely(blk != 0)) { 43762306a36Sopenharmony_ci ext4_unlock_group(sb, block_group); 43862306a36Sopenharmony_ci ext4_error(sb, "bg %u: block %llu: padding at end of block bitmap is not set", 43962306a36Sopenharmony_ci block_group, blk); 44062306a36Sopenharmony_ci ext4_mark_group_bitmap_corrupted(sb, block_group, 44162306a36Sopenharmony_ci EXT4_GROUP_INFO_BBITMAP_CORRUPT); 44262306a36Sopenharmony_ci return -EFSCORRUPTED; 44362306a36Sopenharmony_ci } 44462306a36Sopenharmony_ci set_buffer_verified(bh); 44562306a36Sopenharmony_civerified: 44662306a36Sopenharmony_ci ext4_unlock_group(sb, block_group); 44762306a36Sopenharmony_ci return 0; 44862306a36Sopenharmony_ci} 44962306a36Sopenharmony_ci 45062306a36Sopenharmony_ci/** 45162306a36Sopenharmony_ci * ext4_read_block_bitmap_nowait() 45262306a36Sopenharmony_ci * @sb: super block 45362306a36Sopenharmony_ci * @block_group: given block group 45462306a36Sopenharmony_ci * @ignore_locked: ignore locked buffers 45562306a36Sopenharmony_ci * 45662306a36Sopenharmony_ci * Read the bitmap for a given block_group,and validate the 45762306a36Sopenharmony_ci * bits for block/inode/inode tables are set in the bitmaps 45862306a36Sopenharmony_ci * 45962306a36Sopenharmony_ci * Return buffer_head on success or an ERR_PTR in case of failure. 46062306a36Sopenharmony_ci */ 46162306a36Sopenharmony_cistruct buffer_head * 46262306a36Sopenharmony_ciext4_read_block_bitmap_nowait(struct super_block *sb, ext4_group_t block_group, 46362306a36Sopenharmony_ci bool ignore_locked) 46462306a36Sopenharmony_ci{ 46562306a36Sopenharmony_ci struct ext4_group_desc *desc; 46662306a36Sopenharmony_ci struct ext4_sb_info *sbi = EXT4_SB(sb); 46762306a36Sopenharmony_ci struct buffer_head *bh; 46862306a36Sopenharmony_ci ext4_fsblk_t bitmap_blk; 46962306a36Sopenharmony_ci int err; 47062306a36Sopenharmony_ci 47162306a36Sopenharmony_ci desc = ext4_get_group_desc(sb, block_group, NULL); 47262306a36Sopenharmony_ci if (!desc) 47362306a36Sopenharmony_ci return ERR_PTR(-EFSCORRUPTED); 47462306a36Sopenharmony_ci bitmap_blk = ext4_block_bitmap(sb, desc); 47562306a36Sopenharmony_ci if ((bitmap_blk <= le32_to_cpu(sbi->s_es->s_first_data_block)) || 47662306a36Sopenharmony_ci (bitmap_blk >= ext4_blocks_count(sbi->s_es))) { 47762306a36Sopenharmony_ci ext4_error(sb, "Invalid block bitmap block %llu in " 47862306a36Sopenharmony_ci "block_group %u", bitmap_blk, block_group); 47962306a36Sopenharmony_ci ext4_mark_group_bitmap_corrupted(sb, block_group, 48062306a36Sopenharmony_ci EXT4_GROUP_INFO_BBITMAP_CORRUPT); 48162306a36Sopenharmony_ci return ERR_PTR(-EFSCORRUPTED); 48262306a36Sopenharmony_ci } 48362306a36Sopenharmony_ci bh = sb_getblk(sb, bitmap_blk); 48462306a36Sopenharmony_ci if (unlikely(!bh)) { 48562306a36Sopenharmony_ci ext4_warning(sb, "Cannot get buffer for block bitmap - " 48662306a36Sopenharmony_ci "block_group = %u, block_bitmap = %llu", 48762306a36Sopenharmony_ci block_group, bitmap_blk); 48862306a36Sopenharmony_ci return ERR_PTR(-ENOMEM); 48962306a36Sopenharmony_ci } 49062306a36Sopenharmony_ci 49162306a36Sopenharmony_ci if (ignore_locked && buffer_locked(bh)) { 49262306a36Sopenharmony_ci /* buffer under IO already, return if called for prefetching */ 49362306a36Sopenharmony_ci put_bh(bh); 49462306a36Sopenharmony_ci return NULL; 49562306a36Sopenharmony_ci } 49662306a36Sopenharmony_ci 49762306a36Sopenharmony_ci if (bitmap_uptodate(bh)) 49862306a36Sopenharmony_ci goto verify; 49962306a36Sopenharmony_ci 50062306a36Sopenharmony_ci lock_buffer(bh); 50162306a36Sopenharmony_ci if (bitmap_uptodate(bh)) { 50262306a36Sopenharmony_ci unlock_buffer(bh); 50362306a36Sopenharmony_ci goto verify; 50462306a36Sopenharmony_ci } 50562306a36Sopenharmony_ci ext4_lock_group(sb, block_group); 50662306a36Sopenharmony_ci if (ext4_has_group_desc_csum(sb) && 50762306a36Sopenharmony_ci (desc->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT))) { 50862306a36Sopenharmony_ci if (block_group == 0) { 50962306a36Sopenharmony_ci ext4_unlock_group(sb, block_group); 51062306a36Sopenharmony_ci unlock_buffer(bh); 51162306a36Sopenharmony_ci ext4_error(sb, "Block bitmap for bg 0 marked " 51262306a36Sopenharmony_ci "uninitialized"); 51362306a36Sopenharmony_ci err = -EFSCORRUPTED; 51462306a36Sopenharmony_ci goto out; 51562306a36Sopenharmony_ci } 51662306a36Sopenharmony_ci err = ext4_init_block_bitmap(sb, bh, block_group, desc); 51762306a36Sopenharmony_ci if (err) { 51862306a36Sopenharmony_ci ext4_unlock_group(sb, block_group); 51962306a36Sopenharmony_ci unlock_buffer(bh); 52062306a36Sopenharmony_ci ext4_error(sb, "Failed to init block bitmap for group " 52162306a36Sopenharmony_ci "%u: %d", block_group, err); 52262306a36Sopenharmony_ci goto out; 52362306a36Sopenharmony_ci } 52462306a36Sopenharmony_ci set_bitmap_uptodate(bh); 52562306a36Sopenharmony_ci set_buffer_uptodate(bh); 52662306a36Sopenharmony_ci set_buffer_verified(bh); 52762306a36Sopenharmony_ci ext4_unlock_group(sb, block_group); 52862306a36Sopenharmony_ci unlock_buffer(bh); 52962306a36Sopenharmony_ci return bh; 53062306a36Sopenharmony_ci } 53162306a36Sopenharmony_ci ext4_unlock_group(sb, block_group); 53262306a36Sopenharmony_ci if (buffer_uptodate(bh)) { 53362306a36Sopenharmony_ci /* 53462306a36Sopenharmony_ci * if not uninit if bh is uptodate, 53562306a36Sopenharmony_ci * bitmap is also uptodate 53662306a36Sopenharmony_ci */ 53762306a36Sopenharmony_ci set_bitmap_uptodate(bh); 53862306a36Sopenharmony_ci unlock_buffer(bh); 53962306a36Sopenharmony_ci goto verify; 54062306a36Sopenharmony_ci } 54162306a36Sopenharmony_ci /* 54262306a36Sopenharmony_ci * submit the buffer_head for reading 54362306a36Sopenharmony_ci */ 54462306a36Sopenharmony_ci set_buffer_new(bh); 54562306a36Sopenharmony_ci trace_ext4_read_block_bitmap_load(sb, block_group, ignore_locked); 54662306a36Sopenharmony_ci ext4_read_bh_nowait(bh, REQ_META | REQ_PRIO | 54762306a36Sopenharmony_ci (ignore_locked ? REQ_RAHEAD : 0), 54862306a36Sopenharmony_ci ext4_end_bitmap_read); 54962306a36Sopenharmony_ci return bh; 55062306a36Sopenharmony_civerify: 55162306a36Sopenharmony_ci err = ext4_validate_block_bitmap(sb, desc, block_group, bh); 55262306a36Sopenharmony_ci if (err) 55362306a36Sopenharmony_ci goto out; 55462306a36Sopenharmony_ci return bh; 55562306a36Sopenharmony_ciout: 55662306a36Sopenharmony_ci put_bh(bh); 55762306a36Sopenharmony_ci return ERR_PTR(err); 55862306a36Sopenharmony_ci} 55962306a36Sopenharmony_ci 56062306a36Sopenharmony_ci/* Returns 0 on success, -errno on error */ 56162306a36Sopenharmony_ciint ext4_wait_block_bitmap(struct super_block *sb, ext4_group_t block_group, 56262306a36Sopenharmony_ci struct buffer_head *bh) 56362306a36Sopenharmony_ci{ 56462306a36Sopenharmony_ci struct ext4_group_desc *desc; 56562306a36Sopenharmony_ci 56662306a36Sopenharmony_ci if (!buffer_new(bh)) 56762306a36Sopenharmony_ci return 0; 56862306a36Sopenharmony_ci desc = ext4_get_group_desc(sb, block_group, NULL); 56962306a36Sopenharmony_ci if (!desc) 57062306a36Sopenharmony_ci return -EFSCORRUPTED; 57162306a36Sopenharmony_ci wait_on_buffer(bh); 57262306a36Sopenharmony_ci ext4_simulate_fail_bh(sb, bh, EXT4_SIM_BBITMAP_EIO); 57362306a36Sopenharmony_ci if (!buffer_uptodate(bh)) { 57462306a36Sopenharmony_ci ext4_error_err(sb, EIO, "Cannot read block bitmap - " 57562306a36Sopenharmony_ci "block_group = %u, block_bitmap = %llu", 57662306a36Sopenharmony_ci block_group, (unsigned long long) bh->b_blocknr); 57762306a36Sopenharmony_ci ext4_mark_group_bitmap_corrupted(sb, block_group, 57862306a36Sopenharmony_ci EXT4_GROUP_INFO_BBITMAP_CORRUPT); 57962306a36Sopenharmony_ci return -EIO; 58062306a36Sopenharmony_ci } 58162306a36Sopenharmony_ci clear_buffer_new(bh); 58262306a36Sopenharmony_ci /* Panic or remount fs read-only if block bitmap is invalid */ 58362306a36Sopenharmony_ci return ext4_validate_block_bitmap(sb, desc, block_group, bh); 58462306a36Sopenharmony_ci} 58562306a36Sopenharmony_ci 58662306a36Sopenharmony_cistruct buffer_head * 58762306a36Sopenharmony_ciext4_read_block_bitmap(struct super_block *sb, ext4_group_t block_group) 58862306a36Sopenharmony_ci{ 58962306a36Sopenharmony_ci struct buffer_head *bh; 59062306a36Sopenharmony_ci int err; 59162306a36Sopenharmony_ci 59262306a36Sopenharmony_ci bh = ext4_read_block_bitmap_nowait(sb, block_group, false); 59362306a36Sopenharmony_ci if (IS_ERR(bh)) 59462306a36Sopenharmony_ci return bh; 59562306a36Sopenharmony_ci err = ext4_wait_block_bitmap(sb, block_group, bh); 59662306a36Sopenharmony_ci if (err) { 59762306a36Sopenharmony_ci put_bh(bh); 59862306a36Sopenharmony_ci return ERR_PTR(err); 59962306a36Sopenharmony_ci } 60062306a36Sopenharmony_ci return bh; 60162306a36Sopenharmony_ci} 60262306a36Sopenharmony_ci 60362306a36Sopenharmony_ci/** 60462306a36Sopenharmony_ci * ext4_has_free_clusters() 60562306a36Sopenharmony_ci * @sbi: in-core super block structure. 60662306a36Sopenharmony_ci * @nclusters: number of needed blocks 60762306a36Sopenharmony_ci * @flags: flags from ext4_mb_new_blocks() 60862306a36Sopenharmony_ci * 60962306a36Sopenharmony_ci * Check if filesystem has nclusters free & available for allocation. 61062306a36Sopenharmony_ci * On success return 1, return 0 on failure. 61162306a36Sopenharmony_ci */ 61262306a36Sopenharmony_cistatic int ext4_has_free_clusters(struct ext4_sb_info *sbi, 61362306a36Sopenharmony_ci s64 nclusters, unsigned int flags) 61462306a36Sopenharmony_ci{ 61562306a36Sopenharmony_ci s64 free_clusters, dirty_clusters, rsv, resv_clusters; 61662306a36Sopenharmony_ci struct percpu_counter *fcc = &sbi->s_freeclusters_counter; 61762306a36Sopenharmony_ci struct percpu_counter *dcc = &sbi->s_dirtyclusters_counter; 61862306a36Sopenharmony_ci 61962306a36Sopenharmony_ci free_clusters = percpu_counter_read_positive(fcc); 62062306a36Sopenharmony_ci dirty_clusters = percpu_counter_read_positive(dcc); 62162306a36Sopenharmony_ci resv_clusters = atomic64_read(&sbi->s_resv_clusters); 62262306a36Sopenharmony_ci 62362306a36Sopenharmony_ci /* 62462306a36Sopenharmony_ci * r_blocks_count should always be multiple of the cluster ratio so 62562306a36Sopenharmony_ci * we are safe to do a plane bit shift only. 62662306a36Sopenharmony_ci */ 62762306a36Sopenharmony_ci rsv = (ext4_r_blocks_count(sbi->s_es) >> sbi->s_cluster_bits) + 62862306a36Sopenharmony_ci resv_clusters; 62962306a36Sopenharmony_ci 63062306a36Sopenharmony_ci if (free_clusters - (nclusters + rsv + dirty_clusters) < 63162306a36Sopenharmony_ci EXT4_FREECLUSTERS_WATERMARK) { 63262306a36Sopenharmony_ci free_clusters = percpu_counter_sum_positive(fcc); 63362306a36Sopenharmony_ci dirty_clusters = percpu_counter_sum_positive(dcc); 63462306a36Sopenharmony_ci } 63562306a36Sopenharmony_ci /* Check whether we have space after accounting for current 63662306a36Sopenharmony_ci * dirty clusters & root reserved clusters. 63762306a36Sopenharmony_ci */ 63862306a36Sopenharmony_ci if (free_clusters >= (rsv + nclusters + dirty_clusters)) 63962306a36Sopenharmony_ci return 1; 64062306a36Sopenharmony_ci 64162306a36Sopenharmony_ci /* Hm, nope. Are (enough) root reserved clusters available? */ 64262306a36Sopenharmony_ci if (uid_eq(sbi->s_resuid, current_fsuid()) || 64362306a36Sopenharmony_ci (!gid_eq(sbi->s_resgid, GLOBAL_ROOT_GID) && in_group_p(sbi->s_resgid)) || 64462306a36Sopenharmony_ci capable(CAP_SYS_RESOURCE) || 64562306a36Sopenharmony_ci (flags & EXT4_MB_USE_ROOT_BLOCKS)) { 64662306a36Sopenharmony_ci 64762306a36Sopenharmony_ci if (free_clusters >= (nclusters + dirty_clusters + 64862306a36Sopenharmony_ci resv_clusters)) 64962306a36Sopenharmony_ci return 1; 65062306a36Sopenharmony_ci } 65162306a36Sopenharmony_ci /* No free blocks. Let's see if we can dip into reserved pool */ 65262306a36Sopenharmony_ci if (flags & EXT4_MB_USE_RESERVED) { 65362306a36Sopenharmony_ci if (free_clusters >= (nclusters + dirty_clusters)) 65462306a36Sopenharmony_ci return 1; 65562306a36Sopenharmony_ci } 65662306a36Sopenharmony_ci 65762306a36Sopenharmony_ci return 0; 65862306a36Sopenharmony_ci} 65962306a36Sopenharmony_ci 66062306a36Sopenharmony_ciint ext4_claim_free_clusters(struct ext4_sb_info *sbi, 66162306a36Sopenharmony_ci s64 nclusters, unsigned int flags) 66262306a36Sopenharmony_ci{ 66362306a36Sopenharmony_ci if (ext4_has_free_clusters(sbi, nclusters, flags)) { 66462306a36Sopenharmony_ci percpu_counter_add(&sbi->s_dirtyclusters_counter, nclusters); 66562306a36Sopenharmony_ci return 0; 66662306a36Sopenharmony_ci } else 66762306a36Sopenharmony_ci return -ENOSPC; 66862306a36Sopenharmony_ci} 66962306a36Sopenharmony_ci 67062306a36Sopenharmony_ci/** 67162306a36Sopenharmony_ci * ext4_should_retry_alloc() - check if a block allocation should be retried 67262306a36Sopenharmony_ci * @sb: superblock 67362306a36Sopenharmony_ci * @retries: number of retry attempts made so far 67462306a36Sopenharmony_ci * 67562306a36Sopenharmony_ci * ext4_should_retry_alloc() is called when ENOSPC is returned while 67662306a36Sopenharmony_ci * attempting to allocate blocks. If there's an indication that a pending 67762306a36Sopenharmony_ci * journal transaction might free some space and allow another attempt to 67862306a36Sopenharmony_ci * succeed, this function will wait for the current or committing transaction 67962306a36Sopenharmony_ci * to complete and then return TRUE. 68062306a36Sopenharmony_ci */ 68162306a36Sopenharmony_ciint ext4_should_retry_alloc(struct super_block *sb, int *retries) 68262306a36Sopenharmony_ci{ 68362306a36Sopenharmony_ci struct ext4_sb_info *sbi = EXT4_SB(sb); 68462306a36Sopenharmony_ci 68562306a36Sopenharmony_ci if (!sbi->s_journal) 68662306a36Sopenharmony_ci return 0; 68762306a36Sopenharmony_ci 68862306a36Sopenharmony_ci if (++(*retries) > 3) { 68962306a36Sopenharmony_ci percpu_counter_inc(&sbi->s_sra_exceeded_retry_limit); 69062306a36Sopenharmony_ci return 0; 69162306a36Sopenharmony_ci } 69262306a36Sopenharmony_ci 69362306a36Sopenharmony_ci /* 69462306a36Sopenharmony_ci * if there's no indication that blocks are about to be freed it's 69562306a36Sopenharmony_ci * possible we just missed a transaction commit that did so 69662306a36Sopenharmony_ci */ 69762306a36Sopenharmony_ci smp_mb(); 69862306a36Sopenharmony_ci if (sbi->s_mb_free_pending == 0) { 69962306a36Sopenharmony_ci if (test_opt(sb, DISCARD)) { 70062306a36Sopenharmony_ci atomic_inc(&sbi->s_retry_alloc_pending); 70162306a36Sopenharmony_ci flush_work(&sbi->s_discard_work); 70262306a36Sopenharmony_ci atomic_dec(&sbi->s_retry_alloc_pending); 70362306a36Sopenharmony_ci } 70462306a36Sopenharmony_ci return ext4_has_free_clusters(sbi, 1, 0); 70562306a36Sopenharmony_ci } 70662306a36Sopenharmony_ci 70762306a36Sopenharmony_ci /* 70862306a36Sopenharmony_ci * it's possible we've just missed a transaction commit here, 70962306a36Sopenharmony_ci * so ignore the returned status 71062306a36Sopenharmony_ci */ 71162306a36Sopenharmony_ci ext4_debug("%s: retrying operation after ENOSPC\n", sb->s_id); 71262306a36Sopenharmony_ci (void) jbd2_journal_force_commit_nested(sbi->s_journal); 71362306a36Sopenharmony_ci return 1; 71462306a36Sopenharmony_ci} 71562306a36Sopenharmony_ci 71662306a36Sopenharmony_ci/* 71762306a36Sopenharmony_ci * ext4_new_meta_blocks() -- allocate block for meta data (indexing) blocks 71862306a36Sopenharmony_ci * 71962306a36Sopenharmony_ci * @handle: handle to this transaction 72062306a36Sopenharmony_ci * @inode: file inode 72162306a36Sopenharmony_ci * @goal: given target block(filesystem wide) 72262306a36Sopenharmony_ci * @count: pointer to total number of clusters needed 72362306a36Sopenharmony_ci * @errp: error code 72462306a36Sopenharmony_ci * 72562306a36Sopenharmony_ci * Return 1st allocated block number on success, *count stores total account 72662306a36Sopenharmony_ci * error stores in errp pointer 72762306a36Sopenharmony_ci */ 72862306a36Sopenharmony_ciext4_fsblk_t ext4_new_meta_blocks(handle_t *handle, struct inode *inode, 72962306a36Sopenharmony_ci ext4_fsblk_t goal, unsigned int flags, 73062306a36Sopenharmony_ci unsigned long *count, int *errp) 73162306a36Sopenharmony_ci{ 73262306a36Sopenharmony_ci struct ext4_allocation_request ar; 73362306a36Sopenharmony_ci ext4_fsblk_t ret; 73462306a36Sopenharmony_ci 73562306a36Sopenharmony_ci memset(&ar, 0, sizeof(ar)); 73662306a36Sopenharmony_ci /* Fill with neighbour allocated blocks */ 73762306a36Sopenharmony_ci ar.inode = inode; 73862306a36Sopenharmony_ci ar.goal = goal; 73962306a36Sopenharmony_ci ar.len = count ? *count : 1; 74062306a36Sopenharmony_ci ar.flags = flags; 74162306a36Sopenharmony_ci 74262306a36Sopenharmony_ci ret = ext4_mb_new_blocks(handle, &ar, errp); 74362306a36Sopenharmony_ci if (count) 74462306a36Sopenharmony_ci *count = ar.len; 74562306a36Sopenharmony_ci /* 74662306a36Sopenharmony_ci * Account for the allocated meta blocks. We will never 74762306a36Sopenharmony_ci * fail EDQUOT for metdata, but we do account for it. 74862306a36Sopenharmony_ci */ 74962306a36Sopenharmony_ci if (!(*errp) && (flags & EXT4_MB_DELALLOC_RESERVED)) { 75062306a36Sopenharmony_ci dquot_alloc_block_nofail(inode, 75162306a36Sopenharmony_ci EXT4_C2B(EXT4_SB(inode->i_sb), ar.len)); 75262306a36Sopenharmony_ci } 75362306a36Sopenharmony_ci return ret; 75462306a36Sopenharmony_ci} 75562306a36Sopenharmony_ci 75662306a36Sopenharmony_ci/** 75762306a36Sopenharmony_ci * ext4_count_free_clusters() -- count filesystem free clusters 75862306a36Sopenharmony_ci * @sb: superblock 75962306a36Sopenharmony_ci * 76062306a36Sopenharmony_ci * Adds up the number of free clusters from each block group. 76162306a36Sopenharmony_ci */ 76262306a36Sopenharmony_ciext4_fsblk_t ext4_count_free_clusters(struct super_block *sb) 76362306a36Sopenharmony_ci{ 76462306a36Sopenharmony_ci ext4_fsblk_t desc_count; 76562306a36Sopenharmony_ci struct ext4_group_desc *gdp; 76662306a36Sopenharmony_ci ext4_group_t i; 76762306a36Sopenharmony_ci ext4_group_t ngroups = ext4_get_groups_count(sb); 76862306a36Sopenharmony_ci struct ext4_group_info *grp; 76962306a36Sopenharmony_ci#ifdef EXT4FS_DEBUG 77062306a36Sopenharmony_ci struct ext4_super_block *es; 77162306a36Sopenharmony_ci ext4_fsblk_t bitmap_count; 77262306a36Sopenharmony_ci unsigned int x; 77362306a36Sopenharmony_ci struct buffer_head *bitmap_bh = NULL; 77462306a36Sopenharmony_ci 77562306a36Sopenharmony_ci es = EXT4_SB(sb)->s_es; 77662306a36Sopenharmony_ci desc_count = 0; 77762306a36Sopenharmony_ci bitmap_count = 0; 77862306a36Sopenharmony_ci gdp = NULL; 77962306a36Sopenharmony_ci 78062306a36Sopenharmony_ci for (i = 0; i < ngroups; i++) { 78162306a36Sopenharmony_ci gdp = ext4_get_group_desc(sb, i, NULL); 78262306a36Sopenharmony_ci if (!gdp) 78362306a36Sopenharmony_ci continue; 78462306a36Sopenharmony_ci grp = NULL; 78562306a36Sopenharmony_ci if (EXT4_SB(sb)->s_group_info) 78662306a36Sopenharmony_ci grp = ext4_get_group_info(sb, i); 78762306a36Sopenharmony_ci if (!grp || !EXT4_MB_GRP_BBITMAP_CORRUPT(grp)) 78862306a36Sopenharmony_ci desc_count += ext4_free_group_clusters(sb, gdp); 78962306a36Sopenharmony_ci brelse(bitmap_bh); 79062306a36Sopenharmony_ci bitmap_bh = ext4_read_block_bitmap(sb, i); 79162306a36Sopenharmony_ci if (IS_ERR(bitmap_bh)) { 79262306a36Sopenharmony_ci bitmap_bh = NULL; 79362306a36Sopenharmony_ci continue; 79462306a36Sopenharmony_ci } 79562306a36Sopenharmony_ci 79662306a36Sopenharmony_ci x = ext4_count_free(bitmap_bh->b_data, 79762306a36Sopenharmony_ci EXT4_CLUSTERS_PER_GROUP(sb) / 8); 79862306a36Sopenharmony_ci printk(KERN_DEBUG "group %u: stored = %d, counted = %u\n", 79962306a36Sopenharmony_ci i, ext4_free_group_clusters(sb, gdp), x); 80062306a36Sopenharmony_ci bitmap_count += x; 80162306a36Sopenharmony_ci } 80262306a36Sopenharmony_ci brelse(bitmap_bh); 80362306a36Sopenharmony_ci printk(KERN_DEBUG "ext4_count_free_clusters: stored = %llu" 80462306a36Sopenharmony_ci ", computed = %llu, %llu\n", 80562306a36Sopenharmony_ci EXT4_NUM_B2C(EXT4_SB(sb), ext4_free_blocks_count(es)), 80662306a36Sopenharmony_ci desc_count, bitmap_count); 80762306a36Sopenharmony_ci return bitmap_count; 80862306a36Sopenharmony_ci#else 80962306a36Sopenharmony_ci desc_count = 0; 81062306a36Sopenharmony_ci for (i = 0; i < ngroups; i++) { 81162306a36Sopenharmony_ci gdp = ext4_get_group_desc(sb, i, NULL); 81262306a36Sopenharmony_ci if (!gdp) 81362306a36Sopenharmony_ci continue; 81462306a36Sopenharmony_ci grp = NULL; 81562306a36Sopenharmony_ci if (EXT4_SB(sb)->s_group_info) 81662306a36Sopenharmony_ci grp = ext4_get_group_info(sb, i); 81762306a36Sopenharmony_ci if (!grp || !EXT4_MB_GRP_BBITMAP_CORRUPT(grp)) 81862306a36Sopenharmony_ci desc_count += ext4_free_group_clusters(sb, gdp); 81962306a36Sopenharmony_ci } 82062306a36Sopenharmony_ci 82162306a36Sopenharmony_ci return desc_count; 82262306a36Sopenharmony_ci#endif 82362306a36Sopenharmony_ci} 82462306a36Sopenharmony_ci 82562306a36Sopenharmony_cistatic inline int test_root(ext4_group_t a, int b) 82662306a36Sopenharmony_ci{ 82762306a36Sopenharmony_ci while (1) { 82862306a36Sopenharmony_ci if (a < b) 82962306a36Sopenharmony_ci return 0; 83062306a36Sopenharmony_ci if (a == b) 83162306a36Sopenharmony_ci return 1; 83262306a36Sopenharmony_ci if ((a % b) != 0) 83362306a36Sopenharmony_ci return 0; 83462306a36Sopenharmony_ci a = a / b; 83562306a36Sopenharmony_ci } 83662306a36Sopenharmony_ci} 83762306a36Sopenharmony_ci 83862306a36Sopenharmony_ci/** 83962306a36Sopenharmony_ci * ext4_bg_has_super - number of blocks used by the superblock in group 84062306a36Sopenharmony_ci * @sb: superblock for filesystem 84162306a36Sopenharmony_ci * @group: group number to check 84262306a36Sopenharmony_ci * 84362306a36Sopenharmony_ci * Return the number of blocks used by the superblock (primary or backup) 84462306a36Sopenharmony_ci * in this group. Currently this will be only 0 or 1. 84562306a36Sopenharmony_ci */ 84662306a36Sopenharmony_ciint ext4_bg_has_super(struct super_block *sb, ext4_group_t group) 84762306a36Sopenharmony_ci{ 84862306a36Sopenharmony_ci struct ext4_super_block *es = EXT4_SB(sb)->s_es; 84962306a36Sopenharmony_ci 85062306a36Sopenharmony_ci if (group == 0) 85162306a36Sopenharmony_ci return 1; 85262306a36Sopenharmony_ci if (ext4_has_feature_sparse_super2(sb)) { 85362306a36Sopenharmony_ci if (group == le32_to_cpu(es->s_backup_bgs[0]) || 85462306a36Sopenharmony_ci group == le32_to_cpu(es->s_backup_bgs[1])) 85562306a36Sopenharmony_ci return 1; 85662306a36Sopenharmony_ci return 0; 85762306a36Sopenharmony_ci } 85862306a36Sopenharmony_ci if ((group <= 1) || !ext4_has_feature_sparse_super(sb)) 85962306a36Sopenharmony_ci return 1; 86062306a36Sopenharmony_ci if (!(group & 1)) 86162306a36Sopenharmony_ci return 0; 86262306a36Sopenharmony_ci if (test_root(group, 3) || (test_root(group, 5)) || 86362306a36Sopenharmony_ci test_root(group, 7)) 86462306a36Sopenharmony_ci return 1; 86562306a36Sopenharmony_ci 86662306a36Sopenharmony_ci return 0; 86762306a36Sopenharmony_ci} 86862306a36Sopenharmony_ci 86962306a36Sopenharmony_cistatic unsigned long ext4_bg_num_gdb_meta(struct super_block *sb, 87062306a36Sopenharmony_ci ext4_group_t group) 87162306a36Sopenharmony_ci{ 87262306a36Sopenharmony_ci unsigned long metagroup = group / EXT4_DESC_PER_BLOCK(sb); 87362306a36Sopenharmony_ci ext4_group_t first = metagroup * EXT4_DESC_PER_BLOCK(sb); 87462306a36Sopenharmony_ci ext4_group_t last = first + EXT4_DESC_PER_BLOCK(sb) - 1; 87562306a36Sopenharmony_ci 87662306a36Sopenharmony_ci if (group == first || group == first + 1 || group == last) 87762306a36Sopenharmony_ci return 1; 87862306a36Sopenharmony_ci return 0; 87962306a36Sopenharmony_ci} 88062306a36Sopenharmony_ci 88162306a36Sopenharmony_cistatic unsigned long ext4_bg_num_gdb_nometa(struct super_block *sb, 88262306a36Sopenharmony_ci ext4_group_t group) 88362306a36Sopenharmony_ci{ 88462306a36Sopenharmony_ci if (!ext4_bg_has_super(sb, group)) 88562306a36Sopenharmony_ci return 0; 88662306a36Sopenharmony_ci 88762306a36Sopenharmony_ci if (ext4_has_feature_meta_bg(sb)) 88862306a36Sopenharmony_ci return le32_to_cpu(EXT4_SB(sb)->s_es->s_first_meta_bg); 88962306a36Sopenharmony_ci else 89062306a36Sopenharmony_ci return EXT4_SB(sb)->s_gdb_count; 89162306a36Sopenharmony_ci} 89262306a36Sopenharmony_ci 89362306a36Sopenharmony_ci/** 89462306a36Sopenharmony_ci * ext4_bg_num_gdb - number of blocks used by the group table in group 89562306a36Sopenharmony_ci * @sb: superblock for filesystem 89662306a36Sopenharmony_ci * @group: group number to check 89762306a36Sopenharmony_ci * 89862306a36Sopenharmony_ci * Return the number of blocks used by the group descriptor table 89962306a36Sopenharmony_ci * (primary or backup) in this group. In the future there may be a 90062306a36Sopenharmony_ci * different number of descriptor blocks in each group. 90162306a36Sopenharmony_ci */ 90262306a36Sopenharmony_ciunsigned long ext4_bg_num_gdb(struct super_block *sb, ext4_group_t group) 90362306a36Sopenharmony_ci{ 90462306a36Sopenharmony_ci unsigned long first_meta_bg = 90562306a36Sopenharmony_ci le32_to_cpu(EXT4_SB(sb)->s_es->s_first_meta_bg); 90662306a36Sopenharmony_ci unsigned long metagroup = group / EXT4_DESC_PER_BLOCK(sb); 90762306a36Sopenharmony_ci 90862306a36Sopenharmony_ci if (!ext4_has_feature_meta_bg(sb) || metagroup < first_meta_bg) 90962306a36Sopenharmony_ci return ext4_bg_num_gdb_nometa(sb, group); 91062306a36Sopenharmony_ci 91162306a36Sopenharmony_ci return ext4_bg_num_gdb_meta(sb,group); 91262306a36Sopenharmony_ci 91362306a36Sopenharmony_ci} 91462306a36Sopenharmony_ci 91562306a36Sopenharmony_ci/* 91662306a36Sopenharmony_ci * This function returns the number of file system metadata blocks at 91762306a36Sopenharmony_ci * the beginning of a block group, including the reserved gdt blocks. 91862306a36Sopenharmony_ci */ 91962306a36Sopenharmony_ciunsigned int ext4_num_base_meta_blocks(struct super_block *sb, 92062306a36Sopenharmony_ci ext4_group_t block_group) 92162306a36Sopenharmony_ci{ 92262306a36Sopenharmony_ci struct ext4_sb_info *sbi = EXT4_SB(sb); 92362306a36Sopenharmony_ci unsigned num; 92462306a36Sopenharmony_ci 92562306a36Sopenharmony_ci /* Check for superblock and gdt backups in this group */ 92662306a36Sopenharmony_ci num = ext4_bg_has_super(sb, block_group); 92762306a36Sopenharmony_ci 92862306a36Sopenharmony_ci if (!ext4_has_feature_meta_bg(sb) || 92962306a36Sopenharmony_ci block_group < le32_to_cpu(sbi->s_es->s_first_meta_bg) * 93062306a36Sopenharmony_ci sbi->s_desc_per_block) { 93162306a36Sopenharmony_ci if (num) { 93262306a36Sopenharmony_ci num += ext4_bg_num_gdb_nometa(sb, block_group); 93362306a36Sopenharmony_ci num += le16_to_cpu(sbi->s_es->s_reserved_gdt_blocks); 93462306a36Sopenharmony_ci } 93562306a36Sopenharmony_ci } else { /* For META_BG_BLOCK_GROUPS */ 93662306a36Sopenharmony_ci num += ext4_bg_num_gdb_meta(sb, block_group); 93762306a36Sopenharmony_ci } 93862306a36Sopenharmony_ci return num; 93962306a36Sopenharmony_ci} 94062306a36Sopenharmony_ci 94162306a36Sopenharmony_cistatic unsigned int ext4_num_base_meta_clusters(struct super_block *sb, 94262306a36Sopenharmony_ci ext4_group_t block_group) 94362306a36Sopenharmony_ci{ 94462306a36Sopenharmony_ci return EXT4_NUM_B2C(EXT4_SB(sb), ext4_num_base_meta_blocks(sb, block_group)); 94562306a36Sopenharmony_ci} 94662306a36Sopenharmony_ci 94762306a36Sopenharmony_ci/** 94862306a36Sopenharmony_ci * ext4_inode_to_goal_block - return a hint for block allocation 94962306a36Sopenharmony_ci * @inode: inode for block allocation 95062306a36Sopenharmony_ci * 95162306a36Sopenharmony_ci * Return the ideal location to start allocating blocks for a 95262306a36Sopenharmony_ci * newly created inode. 95362306a36Sopenharmony_ci */ 95462306a36Sopenharmony_ciext4_fsblk_t ext4_inode_to_goal_block(struct inode *inode) 95562306a36Sopenharmony_ci{ 95662306a36Sopenharmony_ci struct ext4_inode_info *ei = EXT4_I(inode); 95762306a36Sopenharmony_ci ext4_group_t block_group; 95862306a36Sopenharmony_ci ext4_grpblk_t colour; 95962306a36Sopenharmony_ci int flex_size = ext4_flex_bg_size(EXT4_SB(inode->i_sb)); 96062306a36Sopenharmony_ci ext4_fsblk_t bg_start; 96162306a36Sopenharmony_ci ext4_fsblk_t last_block; 96262306a36Sopenharmony_ci 96362306a36Sopenharmony_ci block_group = ei->i_block_group; 96462306a36Sopenharmony_ci if (flex_size >= EXT4_FLEX_SIZE_DIR_ALLOC_SCHEME) { 96562306a36Sopenharmony_ci /* 96662306a36Sopenharmony_ci * If there are at least EXT4_FLEX_SIZE_DIR_ALLOC_SCHEME 96762306a36Sopenharmony_ci * block groups per flexgroup, reserve the first block 96862306a36Sopenharmony_ci * group for directories and special files. Regular 96962306a36Sopenharmony_ci * files will start at the second block group. This 97062306a36Sopenharmony_ci * tends to speed up directory access and improves 97162306a36Sopenharmony_ci * fsck times. 97262306a36Sopenharmony_ci */ 97362306a36Sopenharmony_ci block_group &= ~(flex_size-1); 97462306a36Sopenharmony_ci if (S_ISREG(inode->i_mode)) 97562306a36Sopenharmony_ci block_group++; 97662306a36Sopenharmony_ci } 97762306a36Sopenharmony_ci bg_start = ext4_group_first_block_no(inode->i_sb, block_group); 97862306a36Sopenharmony_ci last_block = ext4_blocks_count(EXT4_SB(inode->i_sb)->s_es) - 1; 97962306a36Sopenharmony_ci 98062306a36Sopenharmony_ci /* 98162306a36Sopenharmony_ci * If we are doing delayed allocation, we don't need take 98262306a36Sopenharmony_ci * colour into account. 98362306a36Sopenharmony_ci */ 98462306a36Sopenharmony_ci if (test_opt(inode->i_sb, DELALLOC)) 98562306a36Sopenharmony_ci return bg_start; 98662306a36Sopenharmony_ci 98762306a36Sopenharmony_ci if (bg_start + EXT4_BLOCKS_PER_GROUP(inode->i_sb) <= last_block) 98862306a36Sopenharmony_ci colour = (task_pid_nr(current) % 16) * 98962306a36Sopenharmony_ci (EXT4_BLOCKS_PER_GROUP(inode->i_sb) / 16); 99062306a36Sopenharmony_ci else 99162306a36Sopenharmony_ci colour = (task_pid_nr(current) % 16) * 99262306a36Sopenharmony_ci ((last_block - bg_start) / 16); 99362306a36Sopenharmony_ci return bg_start + colour; 99462306a36Sopenharmony_ci} 99562306a36Sopenharmony_ci 996