Convert newfs to use libufs. I've tested this on md filesystems, as has
keramida, and all seems well.
This commit is contained in:
parent
66e390feb6
commit
9d492cddac
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=109926
@ -2,6 +2,8 @@
|
||||
# $FreeBSD$
|
||||
|
||||
PROG= newfs
|
||||
DPADD= ${LIBUFS}
|
||||
LDADD= -lufs
|
||||
SRCS= newfs.c mkfs.c
|
||||
WARNS?= 2
|
||||
MAN= newfs.8
|
||||
|
@ -80,18 +80,10 @@ 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
|
||||
struct uufsd disk;
|
||||
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 +105,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 +118,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
|
||||
@ -487,13 +483,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, 1);
|
||||
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.
|
||||
@ -769,8 +765,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);
|
||||
@ -806,6 +802,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);
|
||||
@ -821,8 +818,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);
|
||||
@ -838,101 +835,25 @@ 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;
|
||||
else
|
||||
((struct ufs2_dinode *)iobuf)[ino_to_fsbo(&sblock, ino)] =
|
||||
ip->dp2;
|
||||
wtfs(d, sblock.fs_bsize, (char *)iobuf);
|
||||
wtfs(d, sblock.fs_size, (char *)iobuf);
|
||||
}
|
||||
|
||||
/*
|
||||
* 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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -135,7 +135,6 @@ 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 */
|
||||
|
||||
static char device[MAXPATHLEN];
|
||||
static char *disktype;
|
||||
@ -261,17 +260,20 @@ main(int argc, char *argv[])
|
||||
special = device;
|
||||
}
|
||||
|
||||
fso = open(special, Nflag ? O_RDONLY : O_RDWR);
|
||||
if (fso < 0)
|
||||
if (ufs_disk_fillout_blank(&disk, special) == -1) {
|
||||
if (disk.d_error != NULL)
|
||||
errx(1, "%s: %s", special, disk.d_error);
|
||||
else
|
||||
err(1, "%s", special);
|
||||
if (fstat(fso, &st) < 0)
|
||||
}
|
||||
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)) {
|
||||
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)
|
||||
@ -350,7 +352,7 @@ main(int argc, char *argv[])
|
||||
if (!Nflag && bcmp(pp, &oldpartition, sizeof(oldpartition)))
|
||||
rewritelabel(special, lp);
|
||||
}
|
||||
close(fso);
|
||||
ufs_disk_close(&disk);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
@ -360,7 +362,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) {
|
||||
@ -378,12 +380,12 @@ 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);
|
||||
}
|
||||
|
||||
static void
|
||||
usage()
|
||||
usage(void)
|
||||
{
|
||||
fprintf(stderr,
|
||||
"usage: %s [ -fsoptions ] special-device%s\n",
|
||||
|
@ -45,6 +45,13 @@
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
/*
|
||||
* libufs interfaces.
|
||||
*/
|
||||
#include <libufs.h>
|
||||
|
||||
extern struct uufsd disk; /* the disk where we will operate */
|
||||
|
||||
|
||||
/*
|
||||
* variables set up by front end.
|
||||
@ -67,6 +74,5 @@ 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 */
|
||||
|
||||
void mkfs (struct partition *, char *);
|
||||
|
Loading…
Reference in New Issue
Block a user