Changeset View
Changeset View
Standalone View
Standalone View
sbin/newfs/mkfs.c
Show First 20 Lines • Show All 267 Lines • ▼ Show 20 Lines | restart: | ||||
* as incompletely initialized. | * as incompletely initialized. | ||||
*/ | */ | ||||
sblock.fs_magic = FS_BAD_MAGIC; | sblock.fs_magic = FS_BAD_MAGIC; | ||||
if (Oflag == 1) { | if (Oflag == 1) { | ||||
sblock.fs_sblockloc = SBLOCK_UFS1; | sblock.fs_sblockloc = SBLOCK_UFS1; | ||||
sblock.fs_nindir = sblock.fs_bsize / sizeof(ufs1_daddr_t); | sblock.fs_nindir = sblock.fs_bsize / sizeof(ufs1_daddr_t); | ||||
sblock.fs_inopb = sblock.fs_bsize / sizeof(struct ufs1_dinode); | sblock.fs_inopb = sblock.fs_bsize / sizeof(struct ufs1_dinode); | ||||
sblock.fs_maxsymlinklen = ((NDADDR + NIADDR) * | sblock.fs_maxsymlinklen = ((UFS_NDADDR + UFS_NIADDR) * | ||||
sizeof(ufs1_daddr_t)); | sizeof(ufs1_daddr_t)); | ||||
sblock.fs_old_inodefmt = FS_44INODEFMT; | sblock.fs_old_inodefmt = FS_44INODEFMT; | ||||
sblock.fs_old_cgoffset = 0; | sblock.fs_old_cgoffset = 0; | ||||
sblock.fs_old_cgmask = 0xffffffff; | sblock.fs_old_cgmask = 0xffffffff; | ||||
sblock.fs_old_size = sblock.fs_size; | sblock.fs_old_size = sblock.fs_size; | ||||
sblock.fs_old_rotdelay = 0; | sblock.fs_old_rotdelay = 0; | ||||
sblock.fs_old_rps = 60; | sblock.fs_old_rps = 60; | ||||
sblock.fs_old_nspf = sblock.fs_fsize / sectorsize; | sblock.fs_old_nspf = sblock.fs_fsize / sectorsize; | ||||
sblock.fs_old_cpg = 1; | sblock.fs_old_cpg = 1; | ||||
sblock.fs_old_interleave = 1; | sblock.fs_old_interleave = 1; | ||||
sblock.fs_old_trackskew = 0; | sblock.fs_old_trackskew = 0; | ||||
sblock.fs_old_cpc = 0; | sblock.fs_old_cpc = 0; | ||||
sblock.fs_old_postblformat = 1; | sblock.fs_old_postblformat = 1; | ||||
sblock.fs_old_nrpos = 1; | sblock.fs_old_nrpos = 1; | ||||
} else { | } else { | ||||
sblock.fs_sblockloc = SBLOCK_UFS2; | sblock.fs_sblockloc = SBLOCK_UFS2; | ||||
sblock.fs_nindir = sblock.fs_bsize / sizeof(ufs2_daddr_t); | sblock.fs_nindir = sblock.fs_bsize / sizeof(ufs2_daddr_t); | ||||
sblock.fs_inopb = sblock.fs_bsize / sizeof(struct ufs2_dinode); | sblock.fs_inopb = sblock.fs_bsize / sizeof(struct ufs2_dinode); | ||||
sblock.fs_maxsymlinklen = ((NDADDR + NIADDR) * | sblock.fs_maxsymlinklen = ((UFS_NDADDR + UFS_NIADDR) * | ||||
sizeof(ufs2_daddr_t)); | sizeof(ufs2_daddr_t)); | ||||
} | } | ||||
sblock.fs_sblkno = | sblock.fs_sblkno = | ||||
roundup(howmany(sblock.fs_sblockloc + SBLOCKSIZE, sblock.fs_fsize), | roundup(howmany(sblock.fs_sblockloc + SBLOCKSIZE, sblock.fs_fsize), | ||||
sblock.fs_frag); | sblock.fs_frag); | ||||
sblock.fs_cblkno = sblock.fs_sblkno + | sblock.fs_cblkno = sblock.fs_sblkno + | ||||
roundup(howmany(SBLOCKSIZE, sblock.fs_fsize), sblock.fs_frag); | roundup(howmany(SBLOCKSIZE, sblock.fs_fsize), sblock.fs_frag); | ||||
sblock.fs_iblkno = sblock.fs_cblkno + sblock.fs_frag; | sblock.fs_iblkno = sblock.fs_cblkno + sblock.fs_frag; | ||||
sblock.fs_maxfilesize = sblock.fs_bsize * NDADDR - 1; | sblock.fs_maxfilesize = sblock.fs_bsize * UFS_NDADDR - 1; | ||||
for (sizepb = sblock.fs_bsize, i = 0; i < NIADDR; i++) { | for (sizepb = sblock.fs_bsize, i = 0; i < UFS_NIADDR; i++) { | ||||
sizepb *= NINDIR(&sblock); | sizepb *= NINDIR(&sblock); | ||||
sblock.fs_maxfilesize += sizepb; | sblock.fs_maxfilesize += sizepb; | ||||
} | } | ||||
/* | /* | ||||
* It's impossible to create a snapshot in case that fs_maxfilesize | * It's impossible to create a snapshot in case that fs_maxfilesize | ||||
* is smaller than the fssize. | * is smaller than the fssize. | ||||
*/ | */ | ||||
▲ Show 20 Lines • Show All 154 Lines • ▼ Show 20 Lines | sblock.fs_dsize = sblock.fs_size - sblock.fs_sblkno - | ||||
sblock.fs_ncg * (sblock.fs_dblkno - sblock.fs_sblkno); | sblock.fs_ncg * (sblock.fs_dblkno - sblock.fs_sblkno); | ||||
sblock.fs_cstotal.cs_nbfree = | sblock.fs_cstotal.cs_nbfree = | ||||
fragstoblks(&sblock, sblock.fs_dsize) - | fragstoblks(&sblock, sblock.fs_dsize) - | ||||
howmany(csfrags, sblock.fs_frag); | howmany(csfrags, sblock.fs_frag); | ||||
sblock.fs_cstotal.cs_nffree = | sblock.fs_cstotal.cs_nffree = | ||||
fragnum(&sblock, sblock.fs_size) + | fragnum(&sblock, sblock.fs_size) + | ||||
(fragnum(&sblock, csfrags) > 0 ? | (fragnum(&sblock, csfrags) > 0 ? | ||||
sblock.fs_frag - fragnum(&sblock, csfrags) : 0); | sblock.fs_frag - fragnum(&sblock, csfrags) : 0); | ||||
sblock.fs_cstotal.cs_nifree = sblock.fs_ncg * sblock.fs_ipg - ROOTINO; | sblock.fs_cstotal.cs_nifree = sblock.fs_ncg * sblock.fs_ipg - | ||||
UFS_ROOTINO; | |||||
sblock.fs_cstotal.cs_ndir = 0; | sblock.fs_cstotal.cs_ndir = 0; | ||||
sblock.fs_dsize -= csfrags; | sblock.fs_dsize -= csfrags; | ||||
sblock.fs_time = utime; | sblock.fs_time = utime; | ||||
if (Oflag == 1) { | if (Oflag == 1) { | ||||
sblock.fs_old_time = utime; | sblock.fs_old_time = utime; | ||||
sblock.fs_old_dsize = sblock.fs_dsize; | sblock.fs_old_dsize = sblock.fs_dsize; | ||||
sblock.fs_old_csaddr = sblock.fs_csaddr; | sblock.fs_old_csaddr = sblock.fs_csaddr; | ||||
sblock.fs_old_cstotal.cs_ndir = sblock.fs_cstotal.cs_ndir; | sblock.fs_old_cstotal.cs_ndir = sblock.fs_cstotal.cs_ndir; | ||||
▲ Show 20 Lines • Show All 206 Lines • ▼ Show 20 Lines | acg.cg_nextfreeoff = acg.cg_clusteroff + | ||||
howmany(fragstoblks(&sblock, sblock.fs_fpg), CHAR_BIT); | howmany(fragstoblks(&sblock, sblock.fs_fpg), CHAR_BIT); | ||||
} | } | ||||
if (acg.cg_nextfreeoff > (unsigned)sblock.fs_cgsize) { | if (acg.cg_nextfreeoff > (unsigned)sblock.fs_cgsize) { | ||||
printf("Panic: cylinder group too big\n"); | printf("Panic: cylinder group too big\n"); | ||||
exit(37); | exit(37); | ||||
} | } | ||||
acg.cg_cs.cs_nifree += sblock.fs_ipg; | acg.cg_cs.cs_nifree += sblock.fs_ipg; | ||||
if (cylno == 0) | if (cylno == 0) | ||||
for (i = 0; i < (long)ROOTINO; i++) { | for (i = 0; i < (long)UFS_ROOTINO; i++) { | ||||
setbit(cg_inosused(&acg), i); | setbit(cg_inosused(&acg), i); | ||||
acg.cg_cs.cs_nifree--; | acg.cg_cs.cs_nifree--; | ||||
} | } | ||||
if (cylno > 0) { | if (cylno > 0) { | ||||
/* | /* | ||||
* In cylno 0, beginning space is reserved | * In cylno 0, beginning space is reserved | ||||
* for boot and super blocks. | * for boot and super blocks. | ||||
*/ | */ | ||||
▲ Show 20 Lines • Show All 95 Lines • ▼ Show 20 Lines | |||||
} | } | ||||
/* | /* | ||||
* initialize the file system | * initialize the file system | ||||
*/ | */ | ||||
#define ROOTLINKCNT 3 | #define ROOTLINKCNT 3 | ||||
static struct direct root_dir[] = { | static struct direct root_dir[] = { | ||||
{ ROOTINO, sizeof(struct direct), DT_DIR, 1, "." }, | { UFS_ROOTINO, sizeof(struct direct), DT_DIR, 1, "." }, | ||||
{ ROOTINO, sizeof(struct direct), DT_DIR, 2, ".." }, | { UFS_ROOTINO, sizeof(struct direct), DT_DIR, 2, ".." }, | ||||
{ ROOTINO + 1, sizeof(struct direct), DT_DIR, 5, ".snap" }, | { UFS_ROOTINO + 1, sizeof(struct direct), DT_DIR, 5, ".snap" }, | ||||
}; | }; | ||||
#define SNAPLINKCNT 2 | #define SNAPLINKCNT 2 | ||||
static struct direct snap_dir[] = { | static struct direct snap_dir[] = { | ||||
{ ROOTINO + 1, sizeof(struct direct), DT_DIR, 1, "." }, | { UFS_ROOTINO + 1, sizeof(struct direct), DT_DIR, 1, "." }, | ||||
{ ROOTINO, sizeof(struct direct), DT_DIR, 2, ".." }, | { UFS_ROOTINO, sizeof(struct direct), DT_DIR, 2, ".." }, | ||||
}; | }; | ||||
void | void | ||||
fsinit(time_t utime) | fsinit(time_t utime) | ||||
{ | { | ||||
union dinode node; | union dinode node; | ||||
struct group *grp; | struct group *grp; | ||||
gid_t gid; | gid_t gid; | ||||
Show All 20 Lines | if (sblock.fs_magic == FS_UFS1_MAGIC) { | ||||
node.dp1.di_mode = IFDIR | UMASK; | node.dp1.di_mode = IFDIR | UMASK; | ||||
node.dp1.di_nlink = entries; | node.dp1.di_nlink = entries; | ||||
node.dp1.di_size = makedir(root_dir, entries); | node.dp1.di_size = makedir(root_dir, entries); | ||||
node.dp1.di_db[0] = alloc(sblock.fs_fsize, node.dp1.di_mode); | node.dp1.di_db[0] = alloc(sblock.fs_fsize, node.dp1.di_mode); | ||||
node.dp1.di_blocks = | node.dp1.di_blocks = | ||||
btodb(fragroundup(&sblock, node.dp1.di_size)); | btodb(fragroundup(&sblock, node.dp1.di_size)); | ||||
wtfs(fsbtodb(&sblock, node.dp1.di_db[0]), sblock.fs_fsize, | wtfs(fsbtodb(&sblock, node.dp1.di_db[0]), sblock.fs_fsize, | ||||
iobuf); | iobuf); | ||||
iput(&node, ROOTINO); | iput(&node, UFS_ROOTINO); | ||||
if (!nflag) { | if (!nflag) { | ||||
/* | /* | ||||
* create the .snap directory | * create the .snap directory | ||||
*/ | */ | ||||
node.dp1.di_mode |= 020; | node.dp1.di_mode |= 020; | ||||
node.dp1.di_gid = gid; | node.dp1.di_gid = gid; | ||||
node.dp1.di_nlink = SNAPLINKCNT; | node.dp1.di_nlink = SNAPLINKCNT; | ||||
node.dp1.di_size = makedir(snap_dir, SNAPLINKCNT); | node.dp1.di_size = makedir(snap_dir, SNAPLINKCNT); | ||||
node.dp1.di_db[0] = | node.dp1.di_db[0] = | ||||
alloc(sblock.fs_fsize, node.dp1.di_mode); | alloc(sblock.fs_fsize, node.dp1.di_mode); | ||||
node.dp1.di_blocks = | node.dp1.di_blocks = | ||||
btodb(fragroundup(&sblock, node.dp1.di_size)); | btodb(fragroundup(&sblock, node.dp1.di_size)); | ||||
wtfs(fsbtodb(&sblock, node.dp1.di_db[0]), | wtfs(fsbtodb(&sblock, node.dp1.di_db[0]), | ||||
sblock.fs_fsize, iobuf); | sblock.fs_fsize, iobuf); | ||||
iput(&node, ROOTINO + 1); | iput(&node, UFS_ROOTINO + 1); | ||||
} | } | ||||
} else { | } else { | ||||
/* | /* | ||||
* initialize the node | * initialize the node | ||||
*/ | */ | ||||
node.dp2.di_atime = utime; | node.dp2.di_atime = utime; | ||||
node.dp2.di_mtime = utime; | node.dp2.di_mtime = utime; | ||||
node.dp2.di_ctime = utime; | node.dp2.di_ctime = utime; | ||||
node.dp2.di_birthtime = utime; | node.dp2.di_birthtime = utime; | ||||
/* | /* | ||||
* create the root directory | * create the root directory | ||||
*/ | */ | ||||
node.dp2.di_mode = IFDIR | UMASK; | node.dp2.di_mode = IFDIR | UMASK; | ||||
node.dp2.di_nlink = entries; | node.dp2.di_nlink = entries; | ||||
node.dp2.di_size = makedir(root_dir, entries); | node.dp2.di_size = makedir(root_dir, entries); | ||||
node.dp2.di_db[0] = alloc(sblock.fs_fsize, node.dp2.di_mode); | node.dp2.di_db[0] = alloc(sblock.fs_fsize, node.dp2.di_mode); | ||||
node.dp2.di_blocks = | node.dp2.di_blocks = | ||||
btodb(fragroundup(&sblock, node.dp2.di_size)); | btodb(fragroundup(&sblock, node.dp2.di_size)); | ||||
wtfs(fsbtodb(&sblock, node.dp2.di_db[0]), sblock.fs_fsize, | wtfs(fsbtodb(&sblock, node.dp2.di_db[0]), sblock.fs_fsize, | ||||
iobuf); | iobuf); | ||||
iput(&node, ROOTINO); | iput(&node, UFS_ROOTINO); | ||||
if (!nflag) { | if (!nflag) { | ||||
/* | /* | ||||
* create the .snap directory | * create the .snap directory | ||||
*/ | */ | ||||
node.dp2.di_mode |= 020; | node.dp2.di_mode |= 020; | ||||
node.dp2.di_gid = gid; | node.dp2.di_gid = gid; | ||||
node.dp2.di_nlink = SNAPLINKCNT; | node.dp2.di_nlink = SNAPLINKCNT; | ||||
node.dp2.di_size = makedir(snap_dir, SNAPLINKCNT); | node.dp2.di_size = makedir(snap_dir, SNAPLINKCNT); | ||||
node.dp2.di_db[0] = | node.dp2.di_db[0] = | ||||
alloc(sblock.fs_fsize, node.dp2.di_mode); | alloc(sblock.fs_fsize, node.dp2.di_mode); | ||||
node.dp2.di_blocks = | node.dp2.di_blocks = | ||||
btodb(fragroundup(&sblock, node.dp2.di_size)); | btodb(fragroundup(&sblock, node.dp2.di_size)); | ||||
wtfs(fsbtodb(&sblock, node.dp2.di_db[0]), | wtfs(fsbtodb(&sblock, node.dp2.di_db[0]), | ||||
sblock.fs_fsize, iobuf); | sblock.fs_fsize, iobuf); | ||||
iput(&node, ROOTINO + 1); | iput(&node, UFS_ROOTINO + 1); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
/* | /* | ||||
* construct a set of directory entries in "iobuf". | * construct a set of directory entries in "iobuf". | ||||
* return size of directory. | * return size of directory. | ||||
*/ | */ | ||||
▲ Show 20 Lines • Show All 241 Lines • Show Last 20 Lines |