• Home
  • Raw
  • Download

Lines Matching +full:depth +full:-

1 // SPDX-License-Identifier: GPL-2.0
6 * AV, Sep--Dec 2000
14 enum {DIRECT = 10, DEPTH = 4}; /* Have triple indirect */ enumerator
23 static int block_to_path(struct inode *inode, long block, int offsets[DEPTH]) in block_to_path() argument
25 struct super_block *sb = inode->i_sb; in block_to_path()
27 int ptrs_bits = sbi->s_ind_per_block_bits; in block_to_path()
28 unsigned long indirect_blocks = sbi->s_ind_per_block, in block_to_path()
29 double_blocks = sbi->s_ind_per_block_2; in block_to_path()
36 } else if ( (block -= DIRECT) < indirect_blocks) { in block_to_path()
39 } else if ((block -= indirect_blocks) < double_blocks) { in block_to_path()
42 offsets[n++] = block & (indirect_blocks - 1); in block_to_path()
43 } else if (((block -= double_blocks) >> (ptrs_bits * 2)) < indirect_blocks) { in block_to_path()
46 offsets[n++] = (block >> ptrs_bits) & (indirect_blocks - 1); in block_to_path()
47 offsets[n++] = block & (indirect_blocks - 1); in block_to_path()
56 return sbi->s_block_base + fs32_to_cpu(sbi, nr); in block_to_cpu()
69 p->key = *(p->p = v); in add_chain()
70 p->bh = bh; in add_chain()
75 while (from <= to && from->key == *from->p) in verify_chain()
82 return (sysv_zone_t*)((char*)bh->b_data + bh->b_size); in block_end()
89 int depth, in get_branch() argument
94 struct super_block *sb = inode->i_sb; in get_branch()
99 add_chain(chain, NULL, SYSV_I(inode)->i_data + *offsets); in get_branch()
100 if (!p->key) in get_branch()
102 while (--depth) { in get_branch()
103 int block = block_to_cpu(SYSV_SB(sb), p->key); in get_branch()
109 add_chain(++p, bh, (sysv_zone_t*)bh->b_data + *++offsets); in get_branch()
110 if (!p->key) in get_branch()
117 *err = -EAGAIN; in get_branch()
120 *err = -EIO; in get_branch()
130 int blocksize = inode->i_sb->s_blocksize; in alloc_branch()
134 branch[0].key = sysv_new_block(inode->i_sb); in alloc_branch()
139 branch[n].key = sysv_new_block(inode->i_sb); in alloc_branch()
146 parent = block_to_cpu(SYSV_SB(inode->i_sb), branch[n-1].key); in alloc_branch()
147 bh = sb_getblk(inode->i_sb, parent); in alloc_branch()
149 memset(bh->b_data, 0, blocksize); in alloc_branch()
151 branch[n].p = (sysv_zone_t*) bh->b_data + offsets[n]; in alloc_branch()
164 sysv_free_block(inode->i_sb, branch[i].key); in alloc_branch()
165 return -ENOSPC; in alloc_branch()
177 if (!verify_chain(chain, where-1) || *where->p) in splice_branch()
179 *where->p = where->key; in splice_branch()
182 inode->i_ctime = current_time(inode); in splice_branch()
185 if (where->bh) in splice_branch()
186 dirty_indirect(where->bh, inode); in splice_branch()
199 sysv_free_block(inode->i_sb, where[i].key); in splice_branch()
200 return -EAGAIN; in splice_branch()
205 int err = -EIO; in get_block()
206 int offsets[DEPTH]; in get_block()
207 Indirect chain[DEPTH]; in get_block()
208 struct super_block *sb = inode->i_sb; in get_block()
211 int depth = block_to_path(inode, iblock, offsets); in get_block() local
213 if (depth == 0) in get_block()
218 partial = get_branch(inode, depth, offsets, chain, &err); in get_block()
221 /* Simplest case - block found, no allocation needed */ in get_block()
225 chain[depth-1].key)); in get_block()
227 partial = chain+depth-1; /* the whole chain */ in get_block()
231 /* Next simple case - plain lookup or failed read of indirect block */ in get_block()
232 if (!create || err == -EIO) { in get_block()
235 brelse(partial->bh); in get_block()
236 partial--; in get_block()
247 if (err == -EAGAIN) in get_block()
250 left = (chain + depth) - partial; in get_block()
251 err = alloc_branch(inode, left, offsets+(partial-chain), partial); in get_block()
263 brelse(partial->bh); in get_block()
264 partial--; in get_block()
278 int depth, in find_shared() argument
287 for (k = depth; k > 1 && !offsets[k-1]; k--) in find_shared()
293 partial = chain + k-1; in find_shared()
295 * If the branch acquired continuation since we've looked at it - in find_shared()
298 if (!partial->key && *partial->p) { in find_shared()
302 for (p=partial; p>chain && all_zeroes((sysv_zone_t*)p->bh->b_data,p->p); p--) in find_shared()
308 * it's easier to cheat and just decrement partial->p. in find_shared()
310 if (p == chain + k - 1 && p > chain) { in find_shared()
311 p->p--; in find_shared()
313 *top = *p->p; in find_shared()
314 *p->p = 0; in find_shared()
319 brelse(partial->bh); in find_shared()
320 partial--; in find_shared()
332 sysv_free_block(inode->i_sb, nr); in free_data()
338 static void free_branches(struct inode *inode, sysv_zone_t *p, sysv_zone_t *q, int depth) in free_branches() argument
341 struct super_block *sb = inode->i_sb; in free_branches()
343 if (depth--) { in free_branches()
354 free_branches(inode, (sysv_zone_t*)bh->b_data, in free_branches()
355 block_end(bh), depth); in free_branches()
366 sysv_zone_t *i_data = SYSV_I(inode)->i_data; in sysv_truncate()
367 int offsets[DEPTH]; in sysv_truncate()
368 Indirect chain[DEPTH]; in sysv_truncate()
375 if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || in sysv_truncate()
376 S_ISLNK(inode->i_mode))) in sysv_truncate()
379 blocksize = inode->i_sb->s_blocksize; in sysv_truncate()
380 iblock = (inode->i_size + blocksize-1) in sysv_truncate()
381 >> inode->i_sb->s_blocksize_bits; in sysv_truncate()
383 block_truncate_page(inode->i_mapping, inode->i_size, get_block); in sysv_truncate()
400 dirty_indirect(partial->bh, inode); in sysv_truncate()
401 free_branches(inode, &nr, &nr+1, (chain+n-1) - partial); in sysv_truncate()
405 free_branches(inode, partial->p + 1, block_end(partial->bh), in sysv_truncate()
406 (chain+n-1) - partial); in sysv_truncate()
407 dirty_indirect(partial->bh, inode); in sysv_truncate()
408 brelse (partial->bh); in sysv_truncate()
409 partial--; in sysv_truncate()
413 while (n < DEPTH) { in sysv_truncate()
414 nr = i_data[DIRECT + n - 1]; in sysv_truncate()
416 i_data[DIRECT + n - 1] = 0; in sysv_truncate()
422 inode->i_mtime = inode->i_ctime = current_time(inode); in sysv_truncate()
432 int ptrs_bits = sbi->s_ind_per_block_bits; in sysv_nblocks()
433 unsigned blocks, res, direct = DIRECT, i = DEPTH; in sysv_nblocks()
434 blocks = (size + s->s_blocksize - 1) >> s->s_blocksize_bits; in sysv_nblocks()
436 while (--i && blocks > direct) { in sysv_nblocks()
437 blocks = ((blocks - direct - 1) >> ptrs_bits) + 1; in sysv_nblocks()
447 struct super_block *s = path->dentry->d_sb; in sysv_getattr()
448 generic_fillattr(d_inode(path->dentry), stat); in sysv_getattr()
449 stat->blocks = (s->s_blocksize / 512) * sysv_nblocks(s, stat->size); in sysv_getattr()
450 stat->blksize = s->s_blocksize; in sysv_getattr()
471 struct inode *inode = mapping->host; in sysv_write_failed()
473 if (to > inode->i_size) { in sysv_write_failed()
474 truncate_pagecache(inode, inode->i_size); in sysv_write_failed()