Lines Matching +full:depth +full:-
1 // SPDX-License-Identifier: GPL-2.0
14 p->key = *(p->p = v); in add_chain()
15 p->bh = bh; in add_chain()
20 while (from <= to && from->key == *from->p) in verify_chain()
27 return (block_t *)((char*)bh->b_data + bh->b_size); in block_end()
31 int depth, in get_branch() argument
33 Indirect chain[DEPTH], in get_branch() argument
36 struct super_block *sb = inode->i_sb; in get_branch()
43 if (!p->key) in get_branch()
45 while (--depth) { in get_branch()
46 bh = sb_bread(sb, block_to_cpu(p->key)); in get_branch()
52 add_chain(++p, bh, (block_t *)bh->b_data + *++offsets); in get_branch()
54 if (!p->key) in get_branch()
62 *err = -EAGAIN; in get_branch()
65 *err = -EIO; in get_branch()
78 int err = -ENOSPC; in alloc_branch()
88 bh = sb_getblk(inode->i_sb, parent); in alloc_branch()
91 err = -ENOMEM; in alloc_branch()
95 memset(bh->b_data, 0, bh->b_size); in alloc_branch()
97 branch[n].p = (block_t*) bh->b_data + offsets[n]; in alloc_branch()
116 Indirect chain[DEPTH], in splice_branch() argument
125 if (!verify_chain(chain, where-1) || *where->p) in splice_branch()
128 *where->p = where->key; in splice_branch()
134 inode->i_ctime = current_time(inode); in splice_branch()
137 if (where->bh) in splice_branch()
138 mark_buffer_dirty_inode(where->bh, inode); in splice_branch()
149 return -EAGAIN; in splice_branch()
155 int err = -EIO; in get_block()
156 int offsets[DEPTH]; in get_block()
157 Indirect chain[DEPTH]; in get_block()
160 int depth = block_to_path(inode, block, offsets); in get_block() local
162 if (depth == 0) in get_block()
166 partial = get_branch(inode, depth, offsets, chain, &err); in get_block()
168 /* Simplest case - block found, no allocation needed */ in get_block()
171 map_bh(bh, inode->i_sb, block_to_cpu(chain[depth-1].key)); in get_block()
173 partial = chain+depth-1; /* the whole chain */ in get_block()
177 /* Next simple case - plain lookup or failed read of indirect block */ in get_block()
178 if (!create || err == -EIO) { in get_block()
181 brelse(partial->bh); in get_block()
182 partial--; in get_block()
193 if (err == -EAGAIN) in get_block()
196 left = (chain + depth) - partial; in get_block()
197 err = alloc_branch(inode, left, offsets+(partial-chain), partial); in get_block()
209 brelse(partial->bh); in get_block()
210 partial--; in get_block()
224 int depth, in find_shared() argument
225 int offsets[DEPTH], in find_shared() argument
226 Indirect chain[DEPTH], in find_shared() argument
233 for (k = depth; k > 1 && !offsets[k-1]; k--) in find_shared()
239 partial = chain + k-1; in find_shared()
240 if (!partial->key && *partial->p) { in find_shared()
244 for (p=partial;p>chain && all_zeroes((block_t*)p->bh->b_data,p->p);p--) in find_shared()
246 if (p == chain + k - 1 && p > chain) { in find_shared()
247 p->p--; in find_shared()
249 *top = *p->p; in find_shared()
250 *p->p = 0; in find_shared()
256 brelse(partial->bh); in find_shared()
257 partial--; in find_shared()
276 static void free_branches(struct inode *inode, block_t *p, block_t *q, int depth) in free_branches() argument
281 if (depth--) { in free_branches()
287 bh = sb_bread(inode->i_sb, nr); in free_branches()
290 free_branches(inode, (block_t*)bh->b_data, in free_branches()
291 block_end(bh), depth); in free_branches()
302 struct super_block *sb = inode->i_sb; in truncate()
304 int offsets[DEPTH]; in truncate()
305 Indirect chain[DEPTH]; in truncate()
312 iblock = (inode->i_size + sb->s_blocksize -1) >> sb->s_blocksize_bits; in truncate()
313 block_truncate_page(inode->i_mapping, inode->i_size, get_block); in truncate()
325 first_whole = offsets[0] + 1 - DIRECT; in truncate()
331 mark_buffer_dirty_inode(partial->bh, inode); in truncate()
332 free_branches(inode, &nr, &nr+1, (chain+n-1) - partial); in truncate()
336 free_branches(inode, partial->p + 1, block_end(partial->bh), in truncate()
337 (chain+n-1) - partial); in truncate()
338 mark_buffer_dirty_inode(partial->bh, inode); in truncate()
339 brelse (partial->bh); in truncate()
340 partial--; in truncate()
344 while (first_whole < DEPTH-1) { in truncate()
353 inode->i_mtime = inode->i_ctime = current_time(inode); in truncate()
359 int k = sb->s_blocksize_bits - 10; in nblocks()
360 unsigned blocks, res, direct = DIRECT, i = DEPTH; in nblocks()
361 blocks = (size + sb->s_blocksize - 1) >> (BLOCK_SIZE_BITS + k); in nblocks()
363 while (--i && blocks > direct) { in nblocks()
364 blocks -= direct; in nblocks()
365 blocks += sb->s_blocksize/sizeof(block_t) - 1; in nblocks()
366 blocks /= sb->s_blocksize/sizeof(block_t); in nblocks()