aboutsummaryrefslogtreecommitdiff
path: root/sbin/fsirand
diff options
context:
space:
mode:
authorKirk McKusick <mckusick@FreeBSD.org>2018-01-26 00:58:32 +0000
committerKirk McKusick <mckusick@FreeBSD.org>2018-01-26 00:58:32 +0000
commitdffce2150eeac1c7f424324a5cade7a97b308979 (patch)
tree3de8c223a1cb007078f3bb3e3c062127eb1b80a8 /sbin/fsirand
parenta99028fc70be602db425c092b70dd0221e253bb3 (diff)
downloadsrc-dffce2150eeac1c7f424324a5cade7a97b308979.tar.gz
src-dffce2150eeac1c7f424324a5cade7a97b308979.zip
Refactoring of reading and writing of the UFS/FFS superblock.
Specifically reading is done if ffs_sbget() and writing is done in ffs_sbput(). These functions are exported to libufs via the sbget() and sbput() functions which then used in the various filesystem utilities. This work is in preparation for adding subperblock check hashes. No functional change intended. Reviewed by: kib
Notes
Notes: svn path=/head/; revision=328426
Diffstat (limited to 'sbin/fsirand')
-rw-r--r--sbin/fsirand/Makefile1
-rw-r--r--sbin/fsirand/fsirand.c93
2 files changed, 12 insertions, 82 deletions
diff --git a/sbin/fsirand/Makefile b/sbin/fsirand/Makefile
index c415b11983f1..1fc54ff44687 100644
--- a/sbin/fsirand/Makefile
+++ b/sbin/fsirand/Makefile
@@ -4,6 +4,7 @@
PACKAGE=runtime
PROG= fsirand
MAN= fsirand.8
+LIBADD= ufs
WARNS?= 3
.include <bsd.prog.mk>
diff --git a/sbin/fsirand/fsirand.c b/sbin/fsirand/fsirand.c
index 6b1b1371e17b..bb0f27a59301 100644
--- a/sbin/fsirand/fsirand.c
+++ b/sbin/fsirand/fsirand.c
@@ -46,6 +46,7 @@ static const char rcsid[] =
#include <err.h>
#include <errno.h>
#include <fcntl.h>
+#include <libufs.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
@@ -56,11 +57,6 @@ static const char rcsid[] =
static void usage(void) __dead2;
int fsirand(char *);
-/*
- * Possible superblock locations ordered from most to least likely.
- */
-static int sblock_try[] = SBLOCKSEARCH;
-
static int printonly = 0, force = 0, ignorelabel = 0;
int
@@ -117,9 +113,8 @@ fsirand(char *device)
ssize_t ibufsize;
struct fs *sblock;
ino_t inumber;
- ufs2_daddr_t sblockloc, dblk;
- char sbuf[SBLOCKSIZE], sbuftmp[SBLOCKSIZE];
- int i, devfd, n, cg;
+ ufs2_daddr_t dblk;
+ int devfd, n, cg, ret;
u_int32_t bsize = DEV_BSIZE;
if ((devfd = open(device, printonly ? O_RDONLY : O_RDWR)) < 0) {
@@ -131,30 +126,15 @@ fsirand(char *device)
dp2 = NULL;
/* Read in master superblock */
- (void)memset(&sbuf, 0, sizeof(sbuf));
- sblock = (struct fs *)&sbuf;
- for (i = 0; sblock_try[i] != -1; i++) {
- sblockloc = sblock_try[i];
- if (lseek(devfd, sblockloc, SEEK_SET) == -1) {
- warn("can't seek to superblock (%jd) on %s",
- (intmax_t)sblockloc, device);
+ if ((ret = sbget(devfd, &sblock, -1)) != 0) {
+ switch (ret) {
+ case ENOENT:
+ warn("Cannot find file system superblock");
return (1);
- }
- if ((n = read(devfd, (void *)sblock, SBLOCKSIZE))!=SBLOCKSIZE) {
- warnx("can't read superblock on %s: %s", device,
- (n < SBLOCKSIZE) ? "short read" : strerror(errno));
+ default:
+ warn("Unable to read file system superblock");
return (1);
}
- if ((sblock->fs_magic == FS_UFS1_MAGIC ||
- (sblock->fs_magic == FS_UFS2_MAGIC &&
- sblock->fs_sblockloc == sblock_try[i])) &&
- sblock->fs_bsize <= MAXBSIZE &&
- sblock->fs_bsize >= (ssize_t)sizeof(struct fs))
- break;
- }
- if (sblock_try[i] == -1) {
- fprintf(stderr, "Cannot find file system superblock\n");
- return (1);
}
if (sblock->fs_magic == FS_UFS1_MAGIC &&
@@ -167,33 +147,6 @@ fsirand(char *device)
return (1);
}
- /* Make sure backup superblocks are sane. */
- sblock = (struct fs *)&sbuftmp;
- for (cg = 0; cg < (int)sblock->fs_ncg; cg++) {
- dblk = fsbtodb(sblock, cgsblock(sblock, cg));
- if (lseek(devfd, (off_t)dblk * bsize, SEEK_SET) < 0) {
- warn("can't seek to %jd", (intmax_t)dblk * bsize);
- return (1);
- } else if ((n = write(devfd, (void *)sblock, SBLOCKSIZE)) != SBLOCKSIZE) {
- warn("can't read backup superblock %d on %s: %s",
- cg + 1, device, (n < SBLOCKSIZE) ? "short write"
- : strerror(errno));
- return (1);
- }
- if (sblock->fs_magic != FS_UFS1_MAGIC &&
- sblock->fs_magic != FS_UFS2_MAGIC) {
- warnx("bad magic number in backup superblock %d on %s",
- cg + 1, device);
- return (1);
- }
- if (sblock->fs_sbsize > SBLOCKSIZE) {
- warnx("size of backup superblock %d on %s is preposterous",
- cg + 1, device);
- return (1);
- }
- }
- sblock = (struct fs *)&sbuf;
-
/* XXX - should really cap buffer at 512kb or so */
if (sblock->fs_magic == FS_UFS1_MAGIC)
ibufsize = sizeof(struct ufs1_dinode) * sblock->fs_ipg;
@@ -215,38 +168,14 @@ fsirand(char *device)
/* Randomize fs_id and write out new sblock and backups */
sblock->fs_id[0] = (u_int32_t)time(NULL);
sblock->fs_id[1] = random();
-
- if (lseek(devfd, sblockloc, SEEK_SET) == -1) {
- warn("can't seek to superblock (%jd) on %s",
- (intmax_t)sblockloc, device);
- return (1);
- }
- if ((n = write(devfd, (void *)sblock, SBLOCKSIZE)) !=
- SBLOCKSIZE) {
- warn("can't write superblock on %s: %s", device,
- (n < SBLOCKSIZE) ? "short write" : strerror(errno));
+ if (sbput(devfd, sblock, sblock->fs_ncg) != 0) {
+ warn("could not write updated superblock");
return (1);
}
}
/* For each cylinder group, randomize inodes and update backup sblock */
for (cg = 0, inumber = 0; cg < (int)sblock->fs_ncg; cg++) {
- /* Update superblock if appropriate */
- if (!printonly) {
- dblk = fsbtodb(sblock, cgsblock(sblock, cg));
- if (lseek(devfd, (off_t)dblk * bsize, SEEK_SET) < 0) {
- warn("can't seek to %jd",
- (intmax_t)dblk * bsize);
- return (1);
- } else if ((n = write(devfd, (void *)sblock,
- SBLOCKSIZE)) != SBLOCKSIZE) {
- warn("can't write backup superblock %d on %s: %s",
- cg + 1, device, (n < SBLOCKSIZE) ?
- "short write" : strerror(errno));
- return (1);
- }
- }
-
/* Read in inodes, then print or randomize generation nums */
dblk = fsbtodb(sblock, ino_to_fsba(sblock, inumber));
if (lseek(devfd, (off_t)dblk * bsize, SEEK_SET) < 0) {