Lines Matching +full:block +full:- +full:offset
1 // SPDX-License-Identifier: GPL-2.0
5 * (c) 1996 Hans-Joachim Widmaier
7 * bitmap.c contains the code that handles all bitmap related stuff -
8 * block allocation, deallocation, calculation of free space.
26 mutex_lock(&AFFS_SB(sb)->s_bmlock); in affs_count_free_blocks()
28 bm = AFFS_SB(sb)->s_bitmap; in affs_count_free_blocks()
30 for (i = AFFS_SB(sb)->s_bmap_count; i > 0; bm++, i--) in affs_count_free_blocks()
31 free += bm->bm_free; in affs_count_free_blocks()
33 mutex_unlock(&AFFS_SB(sb)->s_bmlock); in affs_count_free_blocks()
39 affs_free_block(struct super_block *sb, u32 block) in affs_free_block() argument
47 pr_debug("%s(%u)\n", __func__, block); in affs_free_block()
49 if (block > sbi->s_partition_size) in affs_free_block()
52 blk = block - sbi->s_reserved; in affs_free_block()
53 bmap = blk / sbi->s_bmap_bits; in affs_free_block()
54 bit = blk % sbi->s_bmap_bits; in affs_free_block()
55 bm = &sbi->s_bitmap[bmap]; in affs_free_block()
57 mutex_lock(&sbi->s_bmlock); in affs_free_block()
59 bh = sbi->s_bmap_bh; in affs_free_block()
60 if (sbi->s_last_bmap != bmap) { in affs_free_block()
62 bh = affs_bread(sb, bm->bm_key); in affs_free_block()
65 sbi->s_bmap_bh = bh; in affs_free_block()
66 sbi->s_last_bmap = bmap; in affs_free_block()
70 data = (__be32 *)bh->b_data + bit / 32 + 1; in affs_free_block()
72 /* mark block free */ in affs_free_block()
79 tmp = be32_to_cpu(*(__be32 *)bh->b_data); in affs_free_block()
80 *(__be32 *)bh->b_data = cpu_to_be32(tmp - mask); in affs_free_block()
84 bm->bm_free++; in affs_free_block()
86 mutex_unlock(&sbi->s_bmlock); in affs_free_block()
90 affs_warning(sb,"affs_free_block","Trying to free block %u which is already free", block); in affs_free_block()
91 mutex_unlock(&sbi->s_bmlock); in affs_free_block()
95 affs_error(sb,"affs_free_block","Cannot read bitmap block %u", bm->bm_key); in affs_free_block()
96 sbi->s_bmap_bh = NULL; in affs_free_block()
97 sbi->s_last_bmap = ~0; in affs_free_block()
98 mutex_unlock(&sbi->s_bmlock); in affs_free_block()
102 affs_error(sb, "affs_free_block","Block %u outside partition", block); in affs_free_block()
106 * Allocate a block in the given allocation zone.
107 * Since we have to byte-swap the bitmap on little-endian
125 sb = inode->i_sb; in affs_alloc_block()
128 pr_debug("balloc(inode=%lu,goal=%u): ", inode->i_ino, goal); in affs_alloc_block()
130 if (AFFS_I(inode)->i_pa_cnt) { in affs_alloc_block()
131 pr_debug("%d\n", AFFS_I(inode)->i_lastalloc+1); in affs_alloc_block()
132 AFFS_I(inode)->i_pa_cnt--; in affs_alloc_block()
133 return ++AFFS_I(inode)->i_lastalloc; in affs_alloc_block()
136 if (!goal || goal > sbi->s_partition_size) { in affs_alloc_block()
139 //if (!AFFS_I(inode)->i_last_block) in affs_alloc_block()
140 // affs_warning(sb, "affs_balloc", "no last alloc block"); in affs_alloc_block()
141 goal = sbi->s_reserved; in affs_alloc_block()
144 blk = goal - sbi->s_reserved; in affs_alloc_block()
145 bmap = blk / sbi->s_bmap_bits; in affs_alloc_block()
146 bm = &sbi->s_bitmap[bmap]; in affs_alloc_block()
148 mutex_lock(&sbi->s_bmlock); in affs_alloc_block()
150 if (bm->bm_free) in affs_alloc_block()
155 i = sbi->s_bmap_count; in affs_alloc_block()
157 if (--i < 0) in affs_alloc_block()
161 if (bmap < sbi->s_bmap_count) in affs_alloc_block()
165 bm = sbi->s_bitmap; in affs_alloc_block()
166 } while (!bm->bm_free); in affs_alloc_block()
167 blk = bmap * sbi->s_bmap_bits; in affs_alloc_block()
171 bh = sbi->s_bmap_bh; in affs_alloc_block()
172 if (sbi->s_last_bmap != bmap) { in affs_alloc_block()
174 bh = affs_bread(sb, bm->bm_key); in affs_alloc_block()
177 sbi->s_bmap_bh = bh; in affs_alloc_block()
178 sbi->s_last_bmap = bmap; in affs_alloc_block()
181 /* find an unused block in this bitmap block */ in affs_alloc_block()
182 bit = blk % sbi->s_bmap_bits; in affs_alloc_block()
183 data = (__be32 *)bh->b_data + bit / 32 + 1; in affs_alloc_block()
184 enddata = (__be32 *)((u8 *)bh->b_data + sb->s_blocksize); in affs_alloc_block()
206 bit = ffs(tmp & mask) - 1; in affs_alloc_block()
207 blk += bit + sbi->s_reserved; in affs_alloc_block()
209 AFFS_I(inode)->i_lastalloc = blk; in affs_alloc_block()
215 AFFS_I(inode)->i_pa_cnt++; in affs_alloc_block()
218 bm->bm_free -= AFFS_I(inode)->i_pa_cnt + 1; in affs_alloc_block()
223 tmp = be32_to_cpu(*(__be32 *)bh->b_data); in affs_alloc_block()
224 *(__be32 *)bh->b_data = cpu_to_be32(tmp + mask); in affs_alloc_block()
229 mutex_unlock(&sbi->s_bmlock); in affs_alloc_block()
235 affs_error(sb,"affs_read_block","Cannot read bitmap block %u", bm->bm_key); in affs_alloc_block()
236 sbi->s_bmap_bh = NULL; in affs_alloc_block()
237 sbi->s_last_bmap = ~0; in affs_alloc_block()
239 mutex_unlock(&sbi->s_bmlock); in affs_alloc_block()
249 u32 size, blk, end, offset, mask; in affs_init_bitmap() local
256 if (!AFFS_ROOT_TAIL(sb, sbi->s_root_bh)->bm_flag) { in affs_init_bitmap()
257 pr_notice("Bitmap invalid - mounting %s read only\n", sb->s_id); in affs_init_bitmap()
262 sbi->s_last_bmap = ~0; in affs_init_bitmap()
263 sbi->s_bmap_bh = NULL; in affs_init_bitmap()
264 sbi->s_bmap_bits = sb->s_blocksize * 8 - 32; in affs_init_bitmap()
265 sbi->s_bmap_count = (sbi->s_partition_size - sbi->s_reserved + in affs_init_bitmap()
266 sbi->s_bmap_bits - 1) / sbi->s_bmap_bits; in affs_init_bitmap()
267 size = sbi->s_bmap_count * sizeof(*bm); in affs_init_bitmap()
268 bm = sbi->s_bitmap = kzalloc(size, GFP_KERNEL); in affs_init_bitmap()
269 if (!sbi->s_bitmap) { in affs_init_bitmap()
271 return -ENOMEM; in affs_init_bitmap()
274 bmap_blk = (__be32 *)sbi->s_root_bh->b_data; in affs_init_bitmap()
275 blk = sb->s_blocksize / 4 - 49; in affs_init_bitmap()
278 for (i = sbi->s_bmap_count; i > 0; bm++, i--) { in affs_init_bitmap()
281 bm->bm_key = be32_to_cpu(bmap_blk[blk]); in affs_init_bitmap()
282 bh = affs_bread(sb, bm->bm_key); in affs_init_bitmap()
285 res = -EIO; in affs_init_bitmap()
289 pr_warn("Bitmap %u invalid - mounting %s read only.\n", in affs_init_bitmap()
290 bm->bm_key, sb->s_id); in affs_init_bitmap()
294 pr_debug("read bitmap block %d: %d\n", blk, bm->bm_key); in affs_init_bitmap()
295 bm->bm_free = memweight(bh->b_data + 4, sb->s_blocksize - 4); in affs_init_bitmap()
297 /* Don't try read the extension if this is the last block, in affs_init_bitmap()
307 res = -EIO; in affs_init_bitmap()
310 bmap_blk = (__be32 *)bmap_bh->b_data; in affs_init_bitmap()
312 end = sb->s_blocksize / 4 - 1; in affs_init_bitmap()
315 offset = (sbi->s_partition_size - sbi->s_reserved) % sbi->s_bmap_bits; in affs_init_bitmap()
316 mask = ~(0xFFFFFFFFU << (offset & 31)); in affs_init_bitmap()
317 pr_debug("last word: %d %d %d\n", offset, offset / 32 + 1, mask); in affs_init_bitmap()
318 offset = offset / 32 + 1; in affs_init_bitmap()
324 old = be32_to_cpu(((__be32 *)bh->b_data)[offset]); in affs_init_bitmap()
327 ((__be32 *)bh->b_data)[offset] = cpu_to_be32(new); in affs_init_bitmap()
329 //new -= old; in affs_init_bitmap()
330 //old = be32_to_cpu(*(__be32 *)bh->b_data); in affs_init_bitmap()
331 //*(__be32 *)bh->b_data = cpu_to_be32(old - new); in affs_init_bitmap()
334 /* correct offset for the bitmap count below */ in affs_init_bitmap()
335 //offset++; in affs_init_bitmap()
337 while (++offset < sb->s_blocksize / 4) in affs_init_bitmap()
338 ((__be32 *)bh->b_data)[offset] = 0; in affs_init_bitmap()
339 ((__be32 *)bh->b_data)[0] = 0; in affs_init_bitmap()
340 ((__be32 *)bh->b_data)[0] = cpu_to_be32(-affs_checksum_block(sb, bh)); in affs_init_bitmap()
343 /* recalculate bitmap count for last block */ in affs_init_bitmap()
344 bm--; in affs_init_bitmap()
345 bm->bm_free = memweight(bh->b_data + 4, sb->s_blocksize - 4); in affs_init_bitmap()
357 if (!sbi->s_bitmap) in affs_free_bitmap()
360 affs_brelse(sbi->s_bmap_bh); in affs_free_bitmap()
361 sbi->s_bmap_bh = NULL; in affs_free_bitmap()
362 sbi->s_last_bmap = ~0; in affs_free_bitmap()
363 kfree(sbi->s_bitmap); in affs_free_bitmap()
364 sbi->s_bitmap = NULL; in affs_free_bitmap()