Convert newfs to libufs (really). Solves one real issue with previous

version of such.  Differences in filesystems generated were found to be
from 1) sbwrite with the "all" parameter 2) removal of writecache.  The
sbwrite call was made to perform as the original version, and otherwise
this was checked against a version of newfs with the write cache removed.
This commit is contained in:
Juli Mallett 2003-02-11 03:06:45 +00:00
parent ae4ce2c16e
commit fc903aa525
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=110671
5 changed files with 43 additions and 116 deletions

View File

@ -2,6 +2,8 @@
# $FreeBSD$
PROG= newfs
DPADD= ${LIBUFS}
LDADD= -lufs
SRCS= newfs.c mkfs.c
WARNS?= 2
MAN= newfs.8

View File

@ -80,18 +80,9 @@ static const char rcsid[] =
#define UMASK 0755
#define POWEROF2(num) (((num) & ((num) - 1)) == 0)
static union {
struct fs fs;
char pad[SBLOCKSIZE];
} fsun;
#define sblock fsun.fs
static struct csum *fscs;
static union {
struct cg cg;
char pad[MAXBSIZE];
} cgun;
#define acg cgun.cg
#define sblock disk.d_fs
#define acg disk.d_cg
union dinode {
struct ufs1_dinode dp1;
@ -113,10 +104,8 @@ static void initcg(int, time_t);
static int isblock(struct fs *, unsigned char *, int);
static void iput(union dinode *, ino_t);
static int makedir(struct direct *, int);
static void rdfs(ufs2_daddr_t, int, char *);
static void setblock(struct fs *, unsigned char *, int);
static void wtfs(ufs2_daddr_t, int, char *);
static void wtfsflush(void);
void
mkfs(struct partition *pp, char *fsys)
@ -128,6 +117,12 @@ mkfs(struct partition *pp, char *fsys)
int width;
char tmpbuf[100]; /* XXX this will break in about 2,500 years */
/*
* Our blocks == sector size, and the version of UFS we are using is
* specified by Oflag.
*/
disk.d_bsize = sectorsize;
disk.d_ufs = Oflag;
if (Rflag)
utime = 1000000000;
else
@ -489,13 +484,13 @@ mkfs(struct partition *pp, char *fsys)
sblock.fs_old_cstotal.cs_nifree = sblock.fs_cstotal.cs_nifree;
sblock.fs_old_cstotal.cs_nffree = sblock.fs_cstotal.cs_nffree;
}
wtfs(sblock.fs_sblockloc / sectorsize, SBLOCKSIZE, (char *)&sblock);
if (!Nflag)
sbwrite(&disk, 0);
for (i = 0; i < sblock.fs_cssize; i += sblock.fs_bsize)
wtfs(fsbtodb(&sblock, sblock.fs_csaddr + numfrags(&sblock, i)),
sblock.fs_cssize - i < sblock.fs_bsize ?
sblock.fs_cssize - i : sblock.fs_bsize,
((char *)fscs) + i);
wtfsflush();
/*
* Update information about this partion in pack
* label, to that it may be updated on disk.
@ -771,8 +766,8 @@ alloc(int size, int mode)
{
int i, d, blkno, frag;
rdfs(fsbtodb(&sblock, cgtod(&sblock, 0)), sblock.fs_cgsize,
(char *)&acg);
bread(&disk, fsbtodb(&sblock, cgtod(&sblock, 0)), (char *)&acg,
sblock.fs_cgsize);
if (acg.cg_magic != CG_MAGIC) {
printf("cg 0: bad magic number\n");
return (0);
@ -808,6 +803,7 @@ alloc(int size, int mode)
for (i = frag; i < sblock.fs_frag; i++)
setbit(cg_blksfree(&acg), d + i);
}
/* XXX cgwrite(&disk, 0)??? */
wtfs(fsbtodb(&sblock, cgtod(&sblock, 0)), sblock.fs_cgsize,
(char *)&acg);
return ((ufs2_daddr_t)d);
@ -823,8 +819,8 @@ iput(union dinode *ip, ino_t ino)
int c;
c = ino_to_cg(&sblock, ino);
rdfs(fsbtodb(&sblock, cgtod(&sblock, 0)), sblock.fs_cgsize,
(char *)&acg);
bread(&disk, fsbtodb(&sblock, cgtod(&sblock, 0)), (char *)&acg,
sblock.fs_cgsize);
if (acg.cg_magic != CG_MAGIC) {
printf("cg 0: bad magic number\n");
exit(31);
@ -840,7 +836,7 @@ iput(union dinode *ip, ino_t ino)
exit(32);
}
d = fsbtodb(&sblock, ino_to_fsba(&sblock, ino));
rdfs(d, sblock.fs_bsize, (char *)iobuf);
bread(&disk, d, (char *)iobuf, sblock.fs_bsize);
if (sblock.fs_magic == FS_UFS1_MAGIC)
((struct ufs1_dinode *)iobuf)[ino_to_fsbo(&sblock, ino)] =
ip->dp1;
@ -851,90 +847,14 @@ iput(union dinode *ip, ino_t ino)
}
/*
* read a block from the file system
*/
void
rdfs(ufs2_daddr_t bno, int size, char *bf)
{
int n;
wtfsflush();
if (lseek(fso, (off_t)bno * sectorsize, 0) < 0) {
printf("seek error: %ld\n", (long)bno);
err(33, "rdfs");
}
n = read(fso, bf, size);
if (n != size) {
printf("read error: %ld\n", (long)bno);
err(34, "rdfs");
}
}
#define WCSIZE (128 * 1024)
ufs2_daddr_t wc_sect; /* units of sectorsize */
int wc_end; /* bytes */
static char wc[WCSIZE]; /* bytes */
/*
* Flush dirty write behind buffer.
*/
static void
wtfsflush()
{
int n;
if (wc_end) {
if (lseek(fso, (off_t)wc_sect * sectorsize, SEEK_SET) < 0) {
printf("seek error: %ld\n", (long)wc_sect);
err(35, "wtfs - writecombine");
}
n = write(fso, wc, wc_end);
if (n != wc_end) {
printf("write error: %ld\n", (long)wc_sect);
err(36, "wtfs - writecombine");
}
wc_end = 0;
}
}
/*
* write a block to the file system
* possibly write to disk
*/
static void
wtfs(ufs2_daddr_t bno, int size, char *bf)
{
int done, n;
if (Nflag)
return;
done = 0;
if (wc_end == 0 && size <= WCSIZE) {
wc_sect = bno;
bcopy(bf, wc, size);
wc_end = size;
if (wc_end < WCSIZE)
return;
done = 1;
}
if ((off_t)wc_sect * sectorsize + wc_end == (off_t)bno * sectorsize &&
wc_end + size <= WCSIZE) {
bcopy(bf, wc + wc_end, size);
wc_end += size;
if (wc_end < WCSIZE)
return;
done = 1;
}
wtfsflush();
if (done)
return;
if (lseek(fso, (off_t)bno * sectorsize, SEEK_SET) < 0) {
printf("seek error: %ld\n", (long)bno);
err(35, "wtfs");
}
n = write(fso, bf, size);
if (n != size) {
printf("write error: %ld\n", (long)bno);
err(36, "wtfs");
}
bwrite(&disk, bno, bf, size);
}
/*

View File

@ -136,8 +136,8 @@ int maxcontig = 0; /* max contiguous blocks to allocate */
int maxbpg; /* maximum blocks per file in a cyl group */
int avgfilesize = AVFILESIZ;/* expected average file size */
int avgfilesperdir = AFPDIR;/* expected number of files per directory */
int fso; /* filedescriptor to device */
u_char *volumelabel = NULL; /* volume label for filesystem */
struct uufsd disk; /* libufs disk structure */
static char device[MAXPATHLEN];
static char *disktype;
@ -276,17 +276,21 @@ main(int argc, char *argv[])
special = device;
}
fso = open(special, Nflag ? O_RDONLY : O_RDWR);
if (fso < 0)
err(1, "%s", special);
if (fstat(fso, &st) < 0)
if (ufs_disk_fillout_blank(&disk, special) == -1 ||
(!Nflag && ufs_disk_write(&disk) == -1)) {
if (disk.d_error != NULL)
errx(1, "%s: %s", special, disk.d_error);
else
err(1, "%s", special);
}
if (fstat(disk.d_fd, &st) < 0)
err(1, "%s", special);
if ((st.st_mode & S_IFMT) != S_IFCHR)
errx(1, "%s: not a character-special device", special);
if (sectorsize == 0)
ioctl(fso, DIOCGSECTORSIZE, &sectorsize);
if (sectorsize && !ioctl(fso, DIOCGMEDIASIZE, &mediasize)) {
if (sectorsize == 0)
ioctl(disk.d_fd, DIOCGSECTORSIZE, &sectorsize);
if (sectorsize && !ioctl(disk.d_fd, DIOCGMEDIASIZE, &mediasize)) {
if (fssize == 0)
fssize = mediasize / sectorsize;
else if (fssize > mediasize / sectorsize)
@ -365,7 +369,7 @@ main(int argc, char *argv[])
if (!Nflag && bcmp(pp, &oldpartition, sizeof(oldpartition)))
rewritelabel(special, lp);
}
close(fso);
ufs_disk_close(&disk);
exit(0);
}
@ -375,7 +379,7 @@ getdisklabel(char *s)
static struct disklabel lab;
struct disklabel *lp;
if (!ioctl(fso, DIOCGDINFO, (char *)&lab))
if (!ioctl(disk.d_fd, DIOCGDINFO, (char *)&lab))
return (&lab);
unlabeled++;
if (disktype) {
@ -393,7 +397,7 @@ rewritelabel(char *s, struct disklabel *lp)
return;
lp->d_checksum = 0;
lp->d_checksum = dkcksum(lp);
if (ioctl(fso, DIOCWDINFO, (char *)lp) < 0)
if (ioctl(disk.d_fd, DIOCWDINFO, (char *)lp) < 0)
warn("ioctl (WDINFO): %s: can't rewrite disk label", s);
}

View File

@ -45,6 +45,7 @@
* $FreeBSD$
*/
#include <libufs.h>
/*
* variables set up by front end.
@ -68,7 +69,7 @@ extern int maxcontig; /* max contiguous blocks to allocate */
extern int maxbpg; /* maximum blocks per file in a cyl group */
extern int avgfilesize; /* expected average file size */
extern int avgfilesperdir; /* expected number of files per directory */
extern int fso; /* filedescriptor to device */
extern u_char *volumelabel; /* volume label for filesystem */
extern struct uufsd disk; /* libufs disk structure */
void mkfs (struct partition *, char *);

View File

@ -1,7 +1,7 @@
# $FreeBSD$
ba20315918bf2d2885eed49fee03e3ca
e2170dc5d6bd192f85da9d1085550265
510df6ee7aadd7a5477b47c1a967e8db
47a1a6afcd21c166f32027020b0b6a7e
6e3b83f554b0216206a2768f8b01d9a1
f6035a903644e118f09c6041fb29f7ce
b3e607f5666721bb97b90c57607d732c
44d7dd10f124dd0b6cc77150cc28c515
2244fff4e20df2f8d2e58892fec29da6
103b03f6ef5d976bde65d03d0f457418
1f5d2af756733946e7781af6bf2c25ca
efcd85af54bf9eb4d404e21f663aadaa