Lines Matching +full:last +full:- +full:level
1 /*-
7 /*-
8 * SPDX-License-Identifier: BSD-3-Clause
80 if ((ip->i_flag & IN_MODIFIED) == 0 && waitfor == 0) in ext2_update()
82 ip->i_flag &= ~(IN_LAZYACCESS | IN_LAZYMOD | IN_MODIFIED); in ext2_update()
83 fs = ip->i_e2fs; in ext2_update()
84 if (fs->e2fs_ronly) in ext2_update()
86 if ((error = bread(ip->i_devvp, in ext2_update()
87 fsbtodb(fs, ino_to_fsba(fs, ip->i_number)), in ext2_update()
88 (int)fs->e2fs_bsize, NOCRED, &bp)) != 0) { in ext2_update()
92 error = ext2_i2ei(ip, (struct ext2fs_dinode *)((char *)bp->b_data + in ext2_update()
93 EXT2_INODE_SIZE(fs) * ino_to_fsbo(fs, ip->i_number))); in ext2_update()
113 * lastbn. If level is greater than SINGLE, the block is an indirect block
121 daddr_t lastbn, int level, e4fs_daddr_t *countp) in ext2_indirtrunc() argument
124 struct m_ext2fs *fs = ip->i_e2fs; in ext2_indirtrunc()
128 e2fs_lbn_t nb, nlbn, last; in ext2_indirtrunc() local
132 * Calculate index in current block of last in ext2_indirtrunc()
133 * block to be kept. -1 indicates the entire in ext2_indirtrunc()
137 for (i = SINGLE; i < level; i++) in ext2_indirtrunc()
139 last = lastbn; in ext2_indirtrunc()
141 last /= factor; in ext2_indirtrunc()
142 nblocks = btodb(fs->e2fs_bsize); in ext2_indirtrunc()
152 bp = getblk(vp, lbn, (int)fs->e2fs_bsize, 0, 0, 0); in ext2_indirtrunc()
153 if ((bp->b_flags & (B_DONE | B_DELWRI)) == 0) { in ext2_indirtrunc()
154 bp->b_iocmd = BIO_READ; in ext2_indirtrunc()
155 if (bp->b_bcount > bp->b_bufsize) in ext2_indirtrunc()
157 bp->b_blkno = dbn; in ext2_indirtrunc()
159 bp->b_iooffset = dbtob(bp->b_blkno); in ext2_indirtrunc()
168 bap = (e2fs_daddr_t *)bp->b_data; in ext2_indirtrunc()
169 copy = malloc(fs->e2fs_bsize, M_TEMP, M_WAITOK); in ext2_indirtrunc()
170 bcopy((caddr_t)bap, (caddr_t)copy, (u_int)fs->e2fs_bsize); in ext2_indirtrunc()
171 bzero((caddr_t)&bap[last + 1], in ext2_indirtrunc()
172 (NINDIR(fs) - (last + 1)) * sizeof(e2fs_daddr_t)); in ext2_indirtrunc()
173 if (last == -1) in ext2_indirtrunc()
174 bp->b_flags |= B_INVAL; in ext2_indirtrunc()
187 for (i = NINDIR(fs) - 1, nlbn = lbn + 1 - i * factor; i > last; in ext2_indirtrunc()
188 i--, nlbn += factor) { in ext2_indirtrunc()
192 if (level > SINGLE) { in ext2_indirtrunc()
194 fsbtodb(fs, nb), (int32_t)-1, level - 1, &blkcount)) != 0) in ext2_indirtrunc()
198 ext2_blkfree(ip, nb, fs->e2fs_bsize); in ext2_indirtrunc()
203 * Recursively free last partial block. in ext2_indirtrunc()
205 if (level > SINGLE && lastbn >= 0) { in ext2_indirtrunc()
206 last = lastbn % factor; in ext2_indirtrunc()
210 last, level - 1, &blkcount)) != 0) in ext2_indirtrunc()
238 int offset, size, level; in ext2_ind_truncate() local
248 bo = &ovp->v_bufobj; in ext2_ind_truncate()
251 fs = oip->i_e2fs; in ext2_ind_truncate()
252 osize = oip->i_size; in ext2_ind_truncate()
255 * last byte of the file is allocated. Since the smallest in ext2_ind_truncate()
259 if (length > oip->i_e2fs->e2fs_maxfilesize) in ext2_ind_truncate()
262 offset = blkoff(fs, length - 1); in ext2_ind_truncate()
263 lbn = lblkno(fs, length - 1); in ext2_ind_truncate()
270 oip->i_size = length; in ext2_ind_truncate()
271 if (bp->b_bufsize == fs->e2fs_bsize) in ext2_ind_truncate()
272 bp->b_flags |= B_CLUSTEROK; in ext2_ind_truncate()
279 oip->i_flag |= IN_CHANGE | IN_UPDATE; in ext2_ind_truncate()
292 oip->i_size = length; in ext2_ind_truncate()
299 oip->i_size = length; in ext2_ind_truncate()
301 bzero((char *)bp->b_data + offset, (u_int)(size - offset)); in ext2_ind_truncate()
303 if (bp->b_bufsize == fs->e2fs_bsize) in ext2_ind_truncate()
304 bp->b_flags |= B_CLUSTEROK; in ext2_ind_truncate()
314 * last direct and indirect blocks (if any) in ext2_ind_truncate()
315 * which we want to keep. Lastblock is -1 when in ext2_ind_truncate()
318 lastblock = lblkno(fs, length + fs->e2fs_bsize - 1) - 1; in ext2_ind_truncate()
319 lastiblock[SINGLE] = lastblock - EXT2_NDADDR; in ext2_ind_truncate()
320 lastiblock[DOUBLE] = lastiblock[SINGLE] - NINDIR(fs); in ext2_ind_truncate()
321 lastiblock[TRIPLE] = lastiblock[DOUBLE] - NINDIR(fs) * NINDIR(fs); in ext2_ind_truncate()
322 nblocks = btodb(fs->e2fs_bsize); in ext2_ind_truncate()
327 * normalized to -1 for calls to ext2_indirtrunc below. in ext2_ind_truncate()
329 for (level = TRIPLE; level >= SINGLE; level--) { in ext2_ind_truncate()
330 oldblks[EXT2_NDADDR + level] = oip->i_ib[level]; in ext2_ind_truncate()
331 if (lastiblock[level] < 0) { in ext2_ind_truncate()
332 oip->i_ib[level] = 0; in ext2_ind_truncate()
333 lastiblock[level] = -1; in ext2_ind_truncate()
337 oldblks[i] = oip->i_db[i]; in ext2_ind_truncate()
339 oip->i_db[i] = 0; in ext2_ind_truncate()
341 oip->i_flag |= IN_CHANGE | IN_UPDATE; in ext2_ind_truncate()
352 newblks[i] = oip->i_db[i]; in ext2_ind_truncate()
354 oip->i_db[i] = oldblks[i]; in ext2_ind_truncate()
358 newblks[EXT2_NDADDR + i] = oip->i_ib[i]; in ext2_ind_truncate()
360 oip->i_ib[i] = oldblks[EXT2_NDADDR + i]; in ext2_ind_truncate()
362 oip->i_size = osize; in ext2_ind_truncate()
363 error = vtruncbuf(ovp, length, (int)fs->e2fs_bsize); in ext2_ind_truncate()
371 indir_lbn[SINGLE] = -EXT2_NDADDR; in ext2_ind_truncate()
372 indir_lbn[DOUBLE] = indir_lbn[SINGLE] - NINDIR(fs) - 1; in ext2_ind_truncate()
373 indir_lbn[TRIPLE] = indir_lbn[DOUBLE] - NINDIR(fs) * NINDIR(fs) - 1; in ext2_ind_truncate()
374 for (level = TRIPLE; level >= SINGLE; level--) { in ext2_ind_truncate()
375 bn = oip->i_ib[level]; in ext2_ind_truncate()
377 error = ext2_indirtrunc(oip, indir_lbn[level], in ext2_ind_truncate()
378 fsbtodb(fs, bn), lastiblock[level], level, &count); in ext2_ind_truncate()
382 if (lastiblock[level] < 0) { in ext2_ind_truncate()
383 oip->i_ib[level] = 0; in ext2_ind_truncate()
384 ext2_blkfree(oip, bn, fs->e2fs_fsize); in ext2_ind_truncate()
388 if (lastiblock[level] >= 0) in ext2_ind_truncate()
395 for (i = EXT2_NDADDR - 1; i > lastblock; i--) { in ext2_ind_truncate()
398 bn = oip->i_db[i]; in ext2_ind_truncate()
401 oip->i_db[i] = 0; in ext2_ind_truncate()
411 * last direct block; release any frags. in ext2_ind_truncate()
413 bn = oip->i_db[lastblock]; in ext2_ind_truncate()
422 oip->i_size = length; in ext2_ind_truncate()
426 if (oldspace - newspace > 0) { in ext2_ind_truncate()
433 ext2_blkfree(oip, bn, oldspace - newspace); in ext2_ind_truncate()
434 blocksreleased += btodb(oldspace - newspace); in ext2_ind_truncate()
439 for (level = SINGLE; level <= TRIPLE; level++) in ext2_ind_truncate()
440 if (newblks[EXT2_NDADDR + level] != oip->i_ib[level]) in ext2_ind_truncate()
443 if (newblks[i] != oip->i_db[i]) in ext2_ind_truncate()
446 if (length == 0 && (bo->bo_dirty.bv_cnt != 0 || in ext2_ind_truncate()
447 bo->bo_clean.bv_cnt != 0)) in ext2_ind_truncate()
454 oip->i_size = length; in ext2_ind_truncate()
455 if (oip->i_blocks >= blocksreleased) in ext2_ind_truncate()
456 oip->i_blocks -= blocksreleased; in ext2_ind_truncate()
458 oip->i_blocks = 0; in ext2_ind_truncate()
459 oip->i_flag |= IN_CHANGE; in ext2_ind_truncate()
478 fs = oip->i_e2fs; in ext2_ext_truncate()
479 osize = oip->i_size; in ext2_ext_truncate()
482 if (length > oip->i_e2fs->e2fs_maxfilesize) { in ext2_ext_truncate()
486 offset = blkoff(fs, length - 1); in ext2_ext_truncate()
487 lbn = lblkno(fs, length - 1); in ext2_ext_truncate()
494 oip->i_size = length; in ext2_ext_truncate()
495 if (bp->b_bufsize == fs->e2fs_bsize) in ext2_ext_truncate()
496 bp->b_flags |= B_CLUSTEROK; in ext2_ext_truncate()
503 oip->i_flag |= IN_CHANGE | IN_UPDATE; in ext2_ext_truncate()
507 lastblock = (length + fs->e2fs_bsize - 1) / fs->e2fs_bsize; in ext2_ext_truncate()
514 oip->i_size = length; in ext2_ext_truncate()
522 oip->i_size = length; in ext2_ext_truncate()
524 bzero((char *)bp->b_data + offset, (u_int)(size - offset)); in ext2_ext_truncate()
526 if (bp->b_bufsize == fs->e2fs_bsize) in ext2_ext_truncate()
527 bp->b_flags |= B_CLUSTEROK; in ext2_ext_truncate()
536 oip->i_size = osize; in ext2_ext_truncate()
537 error = vtruncbuf(ovp, length, (int)fs->e2fs_bsize); in ext2_ext_truncate()
543 oip->i_size = length; in ext2_ext_truncate()
544 oip->i_flag |= IN_CHANGE | IN_UPDATE; in ext2_ext_truncate()
567 if (vp->v_type == VLNK && in ext2_truncate()
568 ip->i_size < VFSTOEXT2(vp->v_mount)->um_e2fs->e2fs_maxsymlinklen) { in ext2_truncate()
573 bzero((char *)&ip->i_shortlink, (u_int)ip->i_size); in ext2_truncate()
574 ip->i_size = 0; in ext2_truncate()
575 ip->i_flag |= IN_CHANGE | IN_UPDATE; in ext2_truncate()
578 if (ip->i_size == length) { in ext2_truncate()
579 ip->i_flag |= IN_CHANGE | IN_UPDATE; in ext2_truncate()
583 if (ip->i_flag & IN_E4EXTENTS) in ext2_truncate()
587 cluster_init_vn(&ip->i_clusterw); in ext2_truncate()
598 struct vnode *vp = ap->a_vp; in ext2_inactive()
606 if (ip->i_mode == 0) in ext2_inactive()
608 if (ip->i_nlink <= 0) { in ext2_inactive()
611 ip->i_rdev = 0; in ext2_inactive()
612 mode = ip->i_mode; in ext2_inactive()
613 ip->i_mode = 0; in ext2_inactive()
614 ip->i_flag |= IN_CHANGE | IN_UPDATE; in ext2_inactive()
615 ext2_vfree(vp, ip->i_number, mode); in ext2_inactive()
617 if (ip->i_flag & (IN_ACCESS | IN_CHANGE | IN_MODIFIED | IN_UPDATE)) in ext2_inactive()
624 if (ip->i_mode == 0) in ext2_inactive()
636 struct vnode *vp = ap->a_vp; in ext2_reclaim()
639 if (ip->i_flag & IN_LAZYMOD) { in ext2_reclaim()
640 ip->i_flag |= IN_MODIFIED; in ext2_reclaim()
644 free(vp->v_data, M_EXT2NODE); in ext2_reclaim()
645 vp->v_data = 0; in ext2_reclaim()