Lines Matching full:block

18  * Find a number of contiguous clear bits in a directory block bitmask.
21 * variable. The first bit doesn't count as it corresponds to the block header
24 static int afs_find_contig_bits(union afs_xdr_dir_block *block, unsigned int nr_slots) in afs_find_contig_bits() argument
30 bitmap = (u64)block->hdr.bitmap[0] << 0 * 8; in afs_find_contig_bits()
31 bitmap |= (u64)block->hdr.bitmap[1] << 1 * 8; in afs_find_contig_bits()
32 bitmap |= (u64)block->hdr.bitmap[2] << 2 * 8; in afs_find_contig_bits()
33 bitmap |= (u64)block->hdr.bitmap[3] << 3 * 8; in afs_find_contig_bits()
34 bitmap |= (u64)block->hdr.bitmap[4] << 4 * 8; in afs_find_contig_bits()
35 bitmap |= (u64)block->hdr.bitmap[5] << 5 * 8; in afs_find_contig_bits()
36 bitmap |= (u64)block->hdr.bitmap[6] << 6 * 8; in afs_find_contig_bits()
37 bitmap |= (u64)block->hdr.bitmap[7] << 7 * 8; in afs_find_contig_bits()
67 * Set a number of contiguous bits in the directory block bitmap.
69 static void afs_set_contig_bits(union afs_xdr_dir_block *block, in afs_set_contig_bits() argument
77 block->hdr.bitmap[0] |= (u8)(mask >> 0 * 8); in afs_set_contig_bits()
78 block->hdr.bitmap[1] |= (u8)(mask >> 1 * 8); in afs_set_contig_bits()
79 block->hdr.bitmap[2] |= (u8)(mask >> 2 * 8); in afs_set_contig_bits()
80 block->hdr.bitmap[3] |= (u8)(mask >> 3 * 8); in afs_set_contig_bits()
81 block->hdr.bitmap[4] |= (u8)(mask >> 4 * 8); in afs_set_contig_bits()
82 block->hdr.bitmap[5] |= (u8)(mask >> 5 * 8); in afs_set_contig_bits()
83 block->hdr.bitmap[6] |= (u8)(mask >> 6 * 8); in afs_set_contig_bits()
84 block->hdr.bitmap[7] |= (u8)(mask >> 7 * 8); in afs_set_contig_bits()
88 * Clear a number of contiguous bits in the directory block bitmap.
90 static void afs_clear_contig_bits(union afs_xdr_dir_block *block, in afs_clear_contig_bits() argument
98 block->hdr.bitmap[0] &= ~(u8)(mask >> 0 * 8); in afs_clear_contig_bits()
99 block->hdr.bitmap[1] &= ~(u8)(mask >> 1 * 8); in afs_clear_contig_bits()
100 block->hdr.bitmap[2] &= ~(u8)(mask >> 2 * 8); in afs_clear_contig_bits()
101 block->hdr.bitmap[3] &= ~(u8)(mask >> 3 * 8); in afs_clear_contig_bits()
102 block->hdr.bitmap[4] &= ~(u8)(mask >> 4 * 8); in afs_clear_contig_bits()
103 block->hdr.bitmap[5] &= ~(u8)(mask >> 5 * 8); in afs_clear_contig_bits()
104 block->hdr.bitmap[6] &= ~(u8)(mask >> 6 * 8); in afs_clear_contig_bits()
105 block->hdr.bitmap[7] &= ~(u8)(mask >> 7 * 8); in afs_clear_contig_bits()
109 * Get a specific block, extending the directory storage to cover it as needed.
111 static union afs_xdr_dir_block *afs_dir_get_block(struct afs_dir_iter *iter, size_t block) in afs_dir_get_block() argument
116 size_t blpos = block * AFS_DIR_BLOCK_SIZE; in afs_dir_get_block()
117 size_t blend = (block + 1) * AFS_DIR_BLOCK_SIZE, fpos = iter->fpos; in afs_dir_get_block()
135 /* Search the folio queue for the folio containing the block... */ in afs_dir_get_block()
141 /* ... and then return the mapped block. */ in afs_dir_get_block()
163 * Scan a directory block looking for a dirent of the right name.
165 static int afs_dir_scan_block(const union afs_xdr_dir_block *block, const struct qstr *name, in afs_dir_scan_block() argument
174 bitmap = (u64)block->hdr.bitmap[0] << 0 * 8; in afs_dir_scan_block()
175 bitmap |= (u64)block->hdr.bitmap[1] << 1 * 8; in afs_dir_scan_block()
176 bitmap |= (u64)block->hdr.bitmap[2] << 2 * 8; in afs_dir_scan_block()
177 bitmap |= (u64)block->hdr.bitmap[3] << 3 * 8; in afs_dir_scan_block()
178 bitmap |= (u64)block->hdr.bitmap[4] << 4 * 8; in afs_dir_scan_block()
179 bitmap |= (u64)block->hdr.bitmap[5] << 5 * 8; in afs_dir_scan_block()
180 bitmap |= (u64)block->hdr.bitmap[6] << 6 * 8; in afs_dir_scan_block()
181 bitmap |= (u64)block->hdr.bitmap[7] << 7 * 8; in afs_dir_scan_block()
188 de = &block->dirents[d]; in afs_dir_scan_block()
192 /* The block was NUL-terminated by afs_dir_check_page(). */ in afs_dir_scan_block()
207 * Initialise a new directory block. Note that block 0 is special and contains
211 union afs_xdr_dir_block *block, int block_num) in afs_edit_init_block() argument
213 memset(block, 0, sizeof(*block)); in afs_edit_init_block()
214 block->hdr.npages = htons(1); in afs_edit_init_block()
215 block->hdr.magic = AFS_DIR_MAGIC; in afs_edit_init_block()
216 block->hdr.bitmap[0] = 1; in afs_edit_init_block()
219 block->hdr.bitmap[0] = 0xff; in afs_edit_init_block()
220 block->hdr.bitmap[1] = 0x1f; in afs_edit_init_block()
221 memset(block->meta.alloc_ctrs, in afs_edit_init_block()
223 sizeof(block->meta.alloc_ctrs)); in afs_edit_init_block()
245 union afs_xdr_dir_block *meta, *block; in afs_edit_dir_add() local
272 /* Find a block that has sufficient slots available. Each folio in afs_edit_dir_add()
287 block = afs_dir_get_block(&iter, b); in afs_edit_dir_add()
288 if (!block) in afs_edit_dir_add()
295 _debug("block %u: %2u %3u %u", in afs_edit_dir_add()
298 ntohs(block->hdr.npages), in afs_edit_dir_add()
299 ntohs(block->hdr.magic)); in afs_edit_dir_add()
301 /* Initialise the block if necessary. */ in afs_edit_dir_add()
304 afs_edit_init_block(meta, block, b); in afs_edit_dir_add()
311 slot = afs_find_contig_bits(block, iter.nr_slots); in afs_edit_dir_add()
317 kunmap_local(block); in afs_edit_dir_add()
332 block = afs_dir_get_block(&iter, 0); in afs_edit_dir_add()
340 de = &block->dirents[slot]; in afs_edit_dir_add()
350 afs_set_contig_bits(block, slot, iter.nr_slots); in afs_edit_dir_add()
361 kunmap_local(block); in afs_edit_dir_add()
376 kunmap_local(block); in afs_edit_dir_add()
396 union afs_xdr_dir_block *meta, *block, *pblock; in afs_edit_dir_remove() local
436 block = afs_dir_find_block(&iter, b); in afs_edit_dir_remove()
437 if (!block) in afs_edit_dir_remove()
443 de = &block->dirents[slot]; in afs_edit_dir_remove()
452 afs_clear_contig_bits(block, slot, iter.nr_slots); in afs_edit_dir_remove()
461 kunmap_local(block); in afs_edit_dir_remove()
511 kunmap_local(block); in afs_edit_dir_remove()
517 kunmap_local(block); in afs_edit_dir_remove()
531 union afs_xdr_dir_block *block; in afs_edit_dir_update_dotdot() local
548 /* Find a block that has sufficient slots available. Each folio in afs_edit_dir_update_dotdot()
552 block = afs_dir_get_block(&iter, b); in afs_edit_dir_update_dotdot()
553 if (!block) in afs_edit_dir_update_dotdot()
560 slot = afs_dir_scan_block(block, &dotdot_name, b); in afs_edit_dir_update_dotdot()
564 kunmap_local(block); in afs_edit_dir_update_dotdot()
574 de = &block->dirents[slot]; in afs_edit_dir_update_dotdot()
581 kunmap_local(block); in afs_edit_dir_update_dotdot()
590 kunmap_local(block); in afs_edit_dir_update_dotdot()