- /*
- * Clean inode on disk before freeing blocks
- * to insure no duplicates if system crashes.
- */
- itmp = *ip;
- itmp.i_size = 0;
- for (i = 0; i < NDADDR; i++)
- itmp.i_db[i] = 0;
- for (i = 0; i < NIADDR; i++)
- itmp.i_ib[i] = 0;
- itmp.i_flag |= ICHG|IUPD;
- iupdat(&itmp, &time, &time, 1);
- ip->i_flag &= ~(IUPD|IACC|ICHG);
-
- /*
- * Now return blocks to free list... if machine
- * crashes, they will be harmless MISSING blocks.
- */
- dev = ip->i_dev;
- fs = ip->i_fs;
- /*
- * release double indirect block first
- */
- bn = ip->i_ib[NIADDR-1];
- if (bn != (daddr_t)0) {
- ip->i_ib[NIADDR - 1] = (daddr_t)0;
- tloop(ip, bn, 1);