- for (i = NIADDR - 2; i >= 0; i--) {
- bn = ip->i_ib[i];
- if (bn != (daddr_t)0) {
- ip->i_ib[i] = (daddr_t)0;
- tloop(ip, bn, 0);
+ osize = oip->i_size;
+ offset = blkoff(fs, length);
+ if (offset == 0) {
+ oip->i_size = length;
+ } else {
+ lbn = lblkno(fs, length);
+ bn = fsbtodb(fs, bmap(oip, lbn, B_WRITE, offset));
+ if (u.u_error || (long)bn < 0)
+ return;
+ oip->i_size = length;
+ size = blksize(fs, oip, lbn);
+ count = howmany(size, CLBYTES);
+ dev = oip->i_dev;
+ for (i = 0; i < count; i++)
+#ifdef SECSIZE
+ munhash(dev, bn + i * CLBYTES / fs->fs_dbsize);
+#else SECSIZE
+ munhash(dev, bn + i * CLBYTES / DEV_BSIZE);
+#endif SECSIZE
+ bp = bread(dev, bn, size);
+ if (bp->b_flags & B_ERROR) {
+ u.u_error = EIO;
+ oip->i_size = osize;
+ brelse(bp);
+ return;