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