1e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 2e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * blknum.c --- Functions to handle blk64_t and high/low 64-bit block 3e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * number. 4e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * 5e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Copyright IBM Corporation, 2007 6e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Author Jose R. Santos <jrs@us.ibm.com> 7e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * 8e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * %Begin-Header% 9e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * This file may be redistributed under the terms of the GNU Public 10e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * License. 11e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * %End-Header% 12e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 13e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 14e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#include "ext2fs.h" 15e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 16e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 17e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Return the group # of a block 18e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 19e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgralldgrp_t ext2fs_group_of_blk2(ext2_filsys fs, blk64_t blk) 20e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 21e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return (blk - fs->super->s_first_data_block) / 22e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs->super->s_blocks_per_group; 23e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 24e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 25e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 26e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Return the first block (inclusive) in a group 27e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 28e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallblk64_t ext2fs_group_first_block2(ext2_filsys fs, dgrp_t group) 29e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 30e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return fs->super->s_first_data_block + 31e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ((blk64_t)group * fs->super->s_blocks_per_group); 32e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 33e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 34e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 35e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Return the last block (inclusive) in a group 36e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 37e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallblk64_t ext2fs_group_last_block2(ext2_filsys fs, dgrp_t group) 38e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 39e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return (group == fs->group_desc_count - 1 ? 40e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_blocks_count(fs->super) - 1 : 41e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_group_first_block2(fs, group) + 42e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (fs->super->s_blocks_per_group - 1)); 43e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 44e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 45e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 46e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Return the number of blocks in a group 47e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 48e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallint ext2fs_group_blocks_count(ext2_filsys fs, dgrp_t group) 49e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 50e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall int num_blocks; 51e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 52e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (group == fs->group_desc_count - 1) { 53e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall num_blocks = (ext2fs_blocks_count(fs->super) - 54e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs->super->s_first_data_block) % 55e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs->super->s_blocks_per_group; 56e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (!num_blocks) 57e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall num_blocks = fs->super->s_blocks_per_group; 58e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } else 59e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall num_blocks = fs->super->s_blocks_per_group; 60e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 61e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return num_blocks; 62e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 63e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 64e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 65e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Return the inode data block count 66e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 67e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallblk64_t ext2fs_inode_data_blocks2(ext2_filsys fs, 68e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall struct ext2_inode *inode) 69e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 70e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return (inode->i_blocks | 71e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ((fs->super->s_feature_ro_compat & 72e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXT4_FEATURE_RO_COMPAT_HUGE_FILE) ? 73e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (__u64) inode->osd2.linux2.l_i_blocks_hi << 32 : 0)) - 74e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (inode->i_file_acl ? fs->blocksize >> 9 : 0); 75e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 76e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 77e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 78e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Return the inode i_blocks count 79e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 80e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallblk64_t ext2fs_inode_i_blocks(ext2_filsys fs, 81e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall struct ext2_inode *inode) 82e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 83e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return (inode->i_blocks | 84e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ((fs->super->s_feature_ro_compat & 85e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXT4_FEATURE_RO_COMPAT_HUGE_FILE) ? 86e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (__u64)inode->osd2.linux2.l_i_blocks_hi << 32 : 0)); 87e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 88e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 89e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 90e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Return the fs block count 91e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 92e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallblk64_t ext2fs_blocks_count(struct ext2_super_block *super) 93e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 94e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return super->s_blocks_count | 95e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (super->s_feature_incompat & EXT4_FEATURE_INCOMPAT_64BIT ? 96e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (__u64) super->s_blocks_count_hi << 32 : 0); 97e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 98e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 99e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 100e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Set the fs block count 101e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 102e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallvoid ext2fs_blocks_count_set(struct ext2_super_block *super, blk64_t blk) 103e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 104e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall super->s_blocks_count = blk; 105e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (super->s_feature_incompat & EXT4_FEATURE_INCOMPAT_64BIT) 106e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall super->s_blocks_count_hi = (__u64) blk >> 32; 107e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 108e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 109e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 110e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Add to the current fs block count 111e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 112e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallvoid ext2fs_blocks_count_add(struct ext2_super_block *super, blk64_t blk) 113e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 114e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blk64_t tmp; 115e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall tmp = ext2fs_blocks_count(super) + blk; 116e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_blocks_count_set(super, tmp); 117e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 118e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 119e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 120e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Return the fs reserved block count 121e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 122e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallblk64_t ext2fs_r_blocks_count(struct ext2_super_block *super) 123e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 124e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return super->s_r_blocks_count | 125e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (super->s_feature_incompat & EXT4_FEATURE_INCOMPAT_64BIT ? 126e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (__u64) super->s_r_blocks_count_hi << 32 : 0); 127e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 128e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 129e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 130e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Set the fs reserved block count 131e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 132e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallvoid ext2fs_r_blocks_count_set(struct ext2_super_block *super, blk64_t blk) 133e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 134e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall super->s_r_blocks_count = blk; 135e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (super->s_feature_incompat & EXT4_FEATURE_INCOMPAT_64BIT) 136e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall super->s_r_blocks_count_hi = (__u64) blk >> 32; 137e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 138e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 139e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 140e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Add to the current reserved fs block count 141e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 142e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallvoid ext2fs_r_blocks_count_add(struct ext2_super_block *super, blk64_t blk) 143e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 144e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blk64_t tmp; 145e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall tmp = ext2fs_r_blocks_count(super) + blk; 146e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_r_blocks_count_set(super, tmp); 147e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 148e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 149e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 150e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Return the fs free block count 151e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 152e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallblk64_t ext2fs_free_blocks_count(struct ext2_super_block *super) 153e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 154e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return super->s_free_blocks_count | 155e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (super->s_feature_incompat & EXT4_FEATURE_INCOMPAT_64BIT ? 156e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (__u64) super->s_free_blocks_hi << 32 : 0); 157e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 158e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 159e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 160e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Set the fs free block count 161e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 162e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallvoid ext2fs_free_blocks_count_set(struct ext2_super_block *super, blk64_t blk) 163e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 164e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall super->s_free_blocks_count = blk; 165e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (super->s_feature_incompat & EXT4_FEATURE_INCOMPAT_64BIT) 166e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall super->s_free_blocks_hi = (__u64) blk >> 32; 167e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 168e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 169e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 170e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Add to the current free fs block count 171e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 172e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallvoid ext2fs_free_blocks_count_add(struct ext2_super_block *super, blk64_t blk) 173e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 174e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blk64_t tmp; 175e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall tmp = ext2fs_free_blocks_count(super) + blk; 176e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_free_blocks_count_set(super, tmp); 177e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 178e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 179e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 180e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Get a pointer to a block group descriptor. We need the explicit 181e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * pointer to the group desc for code that swaps block group 182e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * descriptors before writing them out, as it wants to make a copy and 183e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * do the swap there. 184e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 185e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstruct ext2_group_desc *ext2fs_group_desc(ext2_filsys fs, 186e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall struct opaque_ext2_group_desc *gdp, 187e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall dgrp_t group) 188e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 189e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return (struct ext2_group_desc *)((char *)gdp + 190e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall group * EXT2_DESC_SIZE(fs->super)); 191e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 192e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 193e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* Do the same but as an ext4 group desc for internal use here */ 194e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic struct ext4_group_desc *ext4fs_group_desc(ext2_filsys fs, 195e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall struct opaque_ext2_group_desc *gdp, 196e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall dgrp_t group) 197e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 198e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return (struct ext4_group_desc *)ext2fs_group_desc(fs, gdp, group); 199e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 200e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 201e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 202e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Return the block bitmap block of a group 203e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 204e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallblk64_t ext2fs_block_bitmap_loc(ext2_filsys fs, dgrp_t group) 205e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 206e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall struct ext4_group_desc *gdp; 207e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 208e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp = ext4fs_group_desc(fs, fs->group_desc, group); 209e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return gdp->bg_block_bitmap | 210e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (fs->super->s_feature_incompat 211e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall & EXT4_FEATURE_INCOMPAT_64BIT ? 212e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (__u64)gdp->bg_block_bitmap_hi << 32 : 0); 213e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 214e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 215e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 216e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Set the block bitmap block of a group 217e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 218e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallvoid ext2fs_block_bitmap_loc_set(ext2_filsys fs, dgrp_t group, blk64_t blk) 219e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 220e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall struct ext4_group_desc *gdp; 221e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 222e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp = ext4fs_group_desc(fs, fs->group_desc, group); 223e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp->bg_block_bitmap = blk; 224e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (fs->super->s_feature_incompat & EXT4_FEATURE_INCOMPAT_64BIT) 225e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp->bg_block_bitmap_hi = (__u64) blk >> 32; 226e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 227e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 228e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 229e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Return the inode bitmap block of a group 230e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 231e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallblk64_t ext2fs_inode_bitmap_loc(ext2_filsys fs, dgrp_t group) 232e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 233e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall struct ext4_group_desc *gdp; 234e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 235e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp = ext4fs_group_desc(fs, fs->group_desc, group); 236e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return gdp->bg_inode_bitmap | 237e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (fs->super->s_feature_incompat 238e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall & EXT4_FEATURE_INCOMPAT_64BIT ? 239e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (__u64) gdp->bg_inode_bitmap_hi << 32 : 0); 240e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 241e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 242e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 243e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Set the inode bitmap block of a group 244e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 245e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallvoid ext2fs_inode_bitmap_loc_set(ext2_filsys fs, dgrp_t group, blk64_t blk) 246e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 247e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall struct ext4_group_desc *gdp; 248e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 249e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp = ext4fs_group_desc(fs, fs->group_desc, group); 250e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp->bg_inode_bitmap = blk; 251e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (fs->super->s_feature_incompat & EXT4_FEATURE_INCOMPAT_64BIT) 252e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp->bg_inode_bitmap_hi = (__u64) blk >> 32; 253e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 254e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 255e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 256e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Return the inode table block of a group 257e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 258e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallblk64_t ext2fs_inode_table_loc(ext2_filsys fs, dgrp_t group) 259e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 260e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall struct ext4_group_desc *gdp; 261e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 262e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp = ext4fs_group_desc(fs, fs->group_desc, group); 263e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return gdp->bg_inode_table | 264e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (fs->super->s_feature_incompat 265e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall & EXT4_FEATURE_INCOMPAT_64BIT ? 266e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (__u64) gdp->bg_inode_table_hi << 32 : 0); 267e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 268e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 269e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 270e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Set the inode table block of a group 271e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 272e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallvoid ext2fs_inode_table_loc_set(ext2_filsys fs, dgrp_t group, blk64_t blk) 273e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 274e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall struct ext4_group_desc *gdp; 275e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 276e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp = ext4fs_group_desc(fs, fs->group_desc, group); 277e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp->bg_inode_table = blk; 278e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (fs->super->s_feature_incompat & EXT4_FEATURE_INCOMPAT_64BIT) 279e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp->bg_inode_table_hi = (__u64) blk >> 32; 280e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 281e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 282e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 283e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Return the free blocks count of a group 284e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 285e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall__u32 ext2fs_bg_free_blocks_count(ext2_filsys fs, dgrp_t group) 286e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 287e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall struct ext4_group_desc *gdp; 288e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 289e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp = ext4fs_group_desc(fs, fs->group_desc, group); 290e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return gdp->bg_free_blocks_count | 291e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (fs->super->s_feature_incompat 292e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall & EXT4_FEATURE_INCOMPAT_64BIT ? 293e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (__u32) gdp->bg_free_blocks_count_hi << 16 : 0); 294e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 295e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 296e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 297e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Set the free blocks count of a group 298e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 299e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallvoid ext2fs_bg_free_blocks_count_set(ext2_filsys fs, dgrp_t group, __u32 n) 300e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 301e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall struct ext4_group_desc *gdp; 302e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 303e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp = ext4fs_group_desc(fs, fs->group_desc, group); 304e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp->bg_free_blocks_count = n; 305e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 306e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (fs->super->s_feature_incompat & EXT4_FEATURE_INCOMPAT_64BIT) 307e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp->bg_free_blocks_count_hi = (__u32) n >> 16; 308e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 309e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 310e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 311e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Return the free inodes count of a group 312e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 313e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall__u32 ext2fs_bg_free_inodes_count(ext2_filsys fs, dgrp_t group) 314e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 315e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall struct ext4_group_desc *gdp; 316e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 317e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp = ext4fs_group_desc(fs, fs->group_desc, group); 318e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return gdp->bg_free_inodes_count | 319e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (fs->super->s_feature_incompat 320e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall & EXT4_FEATURE_INCOMPAT_64BIT ? 321e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (__u32) gdp->bg_free_inodes_count_hi << 16 : 0); 322e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 323e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 324e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 325e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Set the free inodes count of a group 326e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 327e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallvoid ext2fs_bg_free_inodes_count_set(ext2_filsys fs, dgrp_t group, __u32 n) 328e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 329e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall struct ext4_group_desc *gdp; 330e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 331e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp = ext4fs_group_desc(fs, fs->group_desc, group); 332e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp->bg_free_inodes_count = n; 333e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (fs->super->s_feature_incompat & EXT4_FEATURE_INCOMPAT_64BIT) 334e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp->bg_free_inodes_count_hi = (__u32) n >> 16; 335e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 336e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 337e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 338e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Return the used dirs count of a group 339e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 340e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall__u32 ext2fs_bg_used_dirs_count(ext2_filsys fs, dgrp_t group) 341e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 342e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall struct ext4_group_desc *gdp; 343e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 344e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp = ext4fs_group_desc(fs, fs->group_desc, group); 345e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return gdp->bg_used_dirs_count | 346e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (fs->super->s_feature_incompat 347e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall & EXT4_FEATURE_INCOMPAT_64BIT ? 348e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (__u32) gdp->bg_used_dirs_count_hi << 16 : 0); 349e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 350e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 351e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 352e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Set the used dirs count of a group 353e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 354e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallvoid ext2fs_bg_used_dirs_count_set(ext2_filsys fs, dgrp_t group, __u32 n) 355e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 356e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall struct ext4_group_desc *gdp; 357e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 358e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp = ext4fs_group_desc(fs, fs->group_desc, group); 359e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp->bg_used_dirs_count = n; 360e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (fs->super->s_feature_incompat & EXT4_FEATURE_INCOMPAT_64BIT) 361e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp->bg_used_dirs_count_hi = (__u32) n >> 16; 362e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 363e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 364e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 365e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Return the unused inodes count of a group 366e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 367e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall__u32 ext2fs_bg_itable_unused(ext2_filsys fs, dgrp_t group) 368e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 369e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall struct ext4_group_desc *gdp; 370e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 371e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp = ext4fs_group_desc(fs, fs->group_desc, group); 372e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return gdp->bg_itable_unused | 373e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (fs->super->s_feature_incompat 374e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall & EXT4_FEATURE_INCOMPAT_64BIT ? 375e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (__u32) gdp->bg_itable_unused_hi << 16 : 0); 376e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 377e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 378e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 379e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Set the unused inodes count of a group 380e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 381e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallvoid ext2fs_bg_itable_unused_set(ext2_filsys fs, dgrp_t group, __u32 n) 382e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 383e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall struct ext4_group_desc *gdp; 384e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 385e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp = ext4fs_group_desc(fs, fs->group_desc, group); 386e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp->bg_itable_unused = n; 387e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (fs->super->s_feature_incompat & EXT4_FEATURE_INCOMPAT_64BIT) 388e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp->bg_itable_unused_hi = (__u32) n >> 16; 389e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 390e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 391e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 392e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Get the flags for this block group 393e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 394e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall__u16 ext2fs_bg_flags(ext2_filsys fs, dgrp_t group) 395e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 396e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall struct ext4_group_desc *gdp; 397e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 398e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp = ext4fs_group_desc(fs, fs->group_desc, group); 399e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return gdp->bg_flags; 400e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 401e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 402e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 403e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Zero out the flags for this block group 404e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 405e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallvoid ext2fs_bg_flags_zap(ext2_filsys fs, dgrp_t group) 406e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 407e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall struct ext4_group_desc *gdp; 408e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 409e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp = ext4fs_group_desc(fs, fs->group_desc, group); 410e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp->bg_flags = 0; 411e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return; 412e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 413e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 414e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 415e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Get the value of a particular flag for this block group 416e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 417e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallint ext2fs_bg_flags_test(ext2_filsys fs, dgrp_t group, __u16 bg_flag) 418e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 419e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall struct ext4_group_desc *gdp; 420e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 421e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp = ext4fs_group_desc(fs, fs->group_desc, group); 422e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return gdp->bg_flags & bg_flag; 423e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 424e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 425e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 426e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Set a flag or set of flags for this block group 427e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 428e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallvoid ext2fs_bg_flags_set(ext2_filsys fs, dgrp_t group, __u16 bg_flags) 429e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 430e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall struct ext4_group_desc *gdp; 431e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 432e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp = ext4fs_group_desc(fs, fs->group_desc, group); 433e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp->bg_flags |= bg_flags; 434e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return; 435e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 436e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 437e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 438e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Clear a flag or set of flags for this block group 439e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 440e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallvoid ext2fs_bg_flags_clear(ext2_filsys fs, dgrp_t group, __u16 bg_flags) 441e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 442e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall struct ext4_group_desc *gdp; 443e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 444e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp = ext4fs_group_desc(fs, fs->group_desc, group); 445e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp->bg_flags &= ~bg_flags; 446e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return; 447e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 448e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 449e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 450e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Get the checksum for this block group 451e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 452e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall__u16 ext2fs_bg_checksum(ext2_filsys fs, dgrp_t group) 453e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 454e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall struct ext4_group_desc *gdp; 455e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 456e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp = ext4fs_group_desc(fs, fs->group_desc, group); 457e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return gdp->bg_checksum; 458e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 459e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 460e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 461e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Set the checksum for this block group to a previously calculated value 462e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 463e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallvoid ext2fs_bg_checksum_set(ext2_filsys fs, dgrp_t group, __u16 checksum) 464e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 465e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall struct ext4_group_desc *gdp; 466e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 467e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp = ext4fs_group_desc(fs, fs->group_desc, group); 468e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gdp->bg_checksum = checksum; 469e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return; 470e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 471e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 472e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 473e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Get the acl block of a file 474e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 475e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallblk64_t ext2fs_file_acl_block(ext2_filsys fs, const struct ext2_inode *inode) 476e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 477e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blk64_t blk = inode->i_file_acl; 478e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 479e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (fs && fs->super->s_feature_incompat & EXT4_FEATURE_INCOMPAT_64BIT) 480e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blk |= ((__u64) inode->osd2.linux2.l_i_file_acl_high) << 32; 481e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return blk; 482e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 483e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 484e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 485e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Set the acl block of a file 486e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 487e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallvoid ext2fs_file_acl_block_set(ext2_filsys fs, struct ext2_inode *inode, 488e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blk64_t blk) 489e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 490e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall inode->i_file_acl = blk; 491e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (fs && fs->super->s_feature_incompat & EXT4_FEATURE_INCOMPAT_64BIT) 492e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall inode->osd2.linux2.l_i_file_acl_high = (__u64) blk >> 32; 493e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 494e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 495