+ if (blk != 0)
+ bread(fsbtodb(sblock, blk), (char *)idblk, sblock->fs_bsize);
+ else
+ bzero(idblk, sblock->fs_bsize);
+ if (lvl <= 0) {
+ if (*size < NINDIR(sblock) * sblock->fs_bsize)
+ cnt = howmany(*size, sblock->fs_fsize);
+ else
+ cnt = NINDIR(sblock) * sblock->fs_frag;
+ *size -= NINDIR(sblock) * sblock->fs_bsize;
+ blksout(&idblk[0], cnt);
+ return;
+ }
+ lvl--;
+ for (i = 0; i < NINDIR(sblock); i++) {
+ dmpindir(idblk[i], lvl, size);
+ if (*size <= 0)
+ return;
+ }
+}
+
+blksout(blkp, frags)
+ daddr_t *blkp;
+ int frags;
+{
+ int i, j, count, blks, tbperdb;
+
+ blks = howmany(frags * sblock->fs_fsize, TP_BSIZE);
+ tbperdb = sblock->fs_bsize / TP_BSIZE;
+ for (i = 0; i < blks; i += TP_NINDIR) {
+ if (i + TP_NINDIR > blks)
+ count = blks;
+ else
+ count = i + TP_NINDIR;
+ for (j = i; j < count; j++)
+ if (blkp[j / tbperdb] != 0)
+ spcl.c_addr[j - i] = 1;
+ else
+ spcl.c_addr[j - i] = 0;
+ spcl.c_count = count - i;
+ spclrec();
+ for (j = i; j < count; j += tbperdb)
+ if (blkp[j / tbperdb] != 0)
+ if (j + tbperdb <= count)
+ dmpblk(blkp[j / tbperdb],
+ sblock->fs_bsize);
+ else
+ dmpblk(blkp[j / tbperdb],
+ (count - j) * TP_BSIZE);
+ spcl.c_type = TS_ADDR;