diff --git a/sbin/newfs/Makefile b/sbin/newfs/Makefile index f12e266917e0..efbe7abfe492 100644 --- a/sbin/newfs/Makefile +++ b/sbin/newfs/Makefile @@ -2,6 +2,8 @@ # $FreeBSD$ PROG= newfs +DPADD= ${LIBUFS} +LDADD= -lufs SRCS= newfs.c mkfs.c WARNS?= 2 MAN= newfs.8 diff --git a/sbin/newfs/mkfs.c b/sbin/newfs/mkfs.c index de8140f7b979..c84d164c79b4 100644 --- a/sbin/newfs/mkfs.c +++ b/sbin/newfs/mkfs.c @@ -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 @@ goth: 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); } /* diff --git a/sbin/newfs/newfs.c b/sbin/newfs/newfs.c index 75832b38fa6b..a0dcdf8a9eaa 100644 --- a/sbin/newfs/newfs.c +++ b/sbin/newfs/newfs.c @@ -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, §orsize); - if (sectorsize && !ioctl(fso, DIOCGMEDIASIZE, &mediasize)) { + if (sectorsize == 0) + ioctl(disk.d_fd, DIOCGSECTORSIZE, §orsize); + 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); } diff --git a/sbin/newfs/newfs.h b/sbin/newfs/newfs.h index 60347f337594..1ef0c9186ac6 100644 --- a/sbin/newfs/newfs.h +++ b/sbin/newfs/newfs.h @@ -45,6 +45,7 @@ * $FreeBSD$ */ +#include /* * 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 *); diff --git a/sbin/newfs/ref.test b/sbin/newfs/ref.test index 099ef78fa57c..66563af416b0 100644 --- a/sbin/newfs/ref.test +++ b/sbin/newfs/ref.test @@ -1,7 +1,7 @@ # $FreeBSD$ -ba20315918bf2d2885eed49fee03e3ca -e2170dc5d6bd192f85da9d1085550265 -510df6ee7aadd7a5477b47c1a967e8db -47a1a6afcd21c166f32027020b0b6a7e -6e3b83f554b0216206a2768f8b01d9a1 -f6035a903644e118f09c6041fb29f7ce +b3e607f5666721bb97b90c57607d732c +44d7dd10f124dd0b6cc77150cc28c515 +2244fff4e20df2f8d2e58892fec29da6 +103b03f6ef5d976bde65d03d0f457418 +1f5d2af756733946e7781af6bf2c25ca +efcd85af54bf9eb4d404e21f663aadaa