Пример #1
0
void
flush(int fd, struct bufarea *bp)
{
    int i, j;

    if (!bp->b_dirty)
        return;
    bp->b_dirty = 0;
    if (fswritefd < 0) {
        pfatal("WRITING IN READ_ONLY MODE.\n");
        return;
    }
    if (bp->b_errs != 0)
        pfatal("WRITING %sZERO'ED BLOCK %lld TO DISK\n",
               (bp->b_errs == bp->b_size / dev_bsize) ? "" : "PARTIALLY ",
               (long long)bp->b_bno);
    bp->b_errs = 0;
    blwrite(fd, bp->b_un.b_buf, bp->b_bno, (long)bp->b_size);
    if (bp != &sblk)
        return;
    for (i = 0, j = 0; i < sblock.fs_cssize; i += sblock.fs_bsize, j++) {
        blwrite(fswritefd, (char *)sblock.fs_csp + i,
                fsbtodb(&sblock, sblock.fs_csaddr + j * sblock.fs_frag),
                sblock.fs_cssize - i < sblock.fs_bsize ?
                sblock.fs_cssize - i : sblock.fs_bsize);
    }
}
Пример #2
0
/*
 * Read the last sector of the boot block, replace the last
 * 20 bytes with the recovery information, then write it back.
 * The recovery information only works for UFS2 filesystems.
 */
static void
saverecovery(int readfd, int writefd)
{
	struct fsrecovery *fsr;
	char *fsrbuf;
	u_int secsize;

	if (sblock.fs_magic != FS_UFS2_MAGIC ||
	    ioctl(readfd, DIOCGSECTORSIZE, &secsize) == -1 ||
	    (fsrbuf = Malloc(secsize)) == NULL ||
	    blread(readfd, fsrbuf, (SBLOCK_UFS2 - secsize) / dev_bsize,
	      secsize) != 0) {
		printf("RECOVERY DATA COULD NOT BE CREATED\n");
		return;
	}
	fsr = (struct fsrecovery *)&fsrbuf[secsize - sizeof *fsr];
	fsr->fsr_magic = sblock.fs_magic;
	fsr->fsr_fpg = sblock.fs_fpg;
	fsr->fsr_fsbtodb = sblock.fs_fsbtodb;
	fsr->fsr_sblkno = sblock.fs_sblkno;
	fsr->fsr_ncg = sblock.fs_ncg;
	blwrite(writefd, fsrbuf, (SBLOCK_UFS2 - secsize) / secsize, secsize);
	free(fsrbuf);
}