summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sbin/newfs/Makefile2
-rw-r--r--sbin/newfs/mkfs.c116
-rw-r--r--sbin/newfs/newfs.c26
-rw-r--r--sbin/newfs/newfs.h3
-rw-r--r--sbin/newfs/ref.test12
5 files changed, 43 insertions, 116 deletions
diff --git a/sbin/newfs/Makefile b/sbin/newfs/Makefile
index f12e266..efbe7ab 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 de8140f..c84d164 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 75832b3..a0dcdf8 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, &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);
}
diff --git a/sbin/newfs/newfs.h b/sbin/newfs/newfs.h
index 60347f3..1ef0c91 100644
--- a/sbin/newfs/newfs.h
+++ b/sbin/newfs/newfs.h
@@ -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 *);
diff --git a/sbin/newfs/ref.test b/sbin/newfs/ref.test
index 099ef78..66563af 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
OpenPOWER on IntegriCloud