summaryrefslogtreecommitdiffstats
path: root/sys/boot
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2002-12-14 19:39:44 +0000
committerphk <phk@FreeBSD.org>2002-12-14 19:39:44 +0000
commit56254fadf231c941ef2c561d3377f35692128bb2 (patch)
tree9e8e99d0e7ce9bff8735021bc7bfc679aeafabfe /sys/boot
parentb1c8782cb78630c917841bcd70388cb29fe44d76 (diff)
downloadFreeBSD-src-56254fadf231c941ef2c561d3377f35692128bb2.zip
FreeBSD-src-56254fadf231c941ef2c561d3377f35692128bb2.tar.gz
Restructure so we can compile UFS1_ONLY, UFS2_ONLY or UFS1_AND_UFS2
versions from the same basic function.
Diffstat (limited to 'sys/boot')
-rw-r--r--sys/boot/common/ufsread.c124
1 files changed, 33 insertions, 91 deletions
diff --git a/sys/boot/common/ufsread.c b/sys/boot/common/ufsread.c
index 6173fd9..46a2878 100644
--- a/sys/boot/common/ufsread.c
+++ b/sys/boot/common/ufsread.c
@@ -122,104 +122,28 @@ lookup(const char *path)
return dt == DT_REG ? ino : 0;
}
-#ifdef UFS1_ONLY
-
-static ssize_t
-fsread(ino_t inode, void *buf, size_t nbyte)
-{
- static struct ufs1_dinode dp1;
- static ino_t inomap;
- char *blkbuf;
- caddr_t indbuf;
- struct fs *fs;
- char *s;
- size_t n, nb, size, off, vboff;
- long lbn;
- ufs1_daddr_t addr, vbaddr;
- static ufs1_daddr_t blkmap, indmap;
-
- blkbuf = dmadat->blkbuf;
- indbuf = dmadat->indbuf;
- fs = (struct fs *)dmadat->sbbuf;
- if (!dsk_meta) {
- inomap = 0;
- if (dskread(fs, SBLOCK_UFS1 / DEV_BSIZE, SBLOCKSIZE / DEV_BSIZE))
- return -1;
- if (fs->fs_magic != FS_UFS1_MAGIC) {
- printf("Not ufs\n");
- return -1;
- }
- dsk_meta++;
- }
- if (!inode)
- return 0;
- if (inomap != inode) {
- n = IPERVBLK(fs);
- if (dskread(blkbuf, INO_TO_VBA(fs, n, inode), DBPERVBLK))
- return -1;
- dp1 = ((struct ufs1_dinode *)blkbuf)[INO_TO_VBO(n, inode)];
- inomap = inode;
- fs_off = 0;
- blkmap = indmap = 0;
- }
- s = buf;
- size = dp1.di_size;
- n = size - fs_off;
- if (nbyte > n)
- nbyte = n;
- nb = nbyte;
- while (nb) {
- lbn = lblkno(fs, fs_off);
- off = blkoff(fs, fs_off);
- if (lbn < NDADDR) {
- addr = dp1.di_db[lbn];
- } else {
- n = INDIRPERVBLK(fs);
- addr = dp1.di_ib[0];
- vbaddr = fsbtodb(fs, addr) +
- (lbn - NDADDR) / (n * DBPERVBLK);
- if (indmap != vbaddr) {
- if (dskread(indbuf, vbaddr, DBPERVBLK))
- return -1;
- indmap = vbaddr;
- }
- addr = ((ufs1_daddr_t *)indbuf)[(lbn - NDADDR) % n];
- }
- vbaddr = fsbtodb(fs, addr) + (off >> VBLKSHIFT) * DBPERVBLK;
- vboff = off & VBLKMASK;
- n = sblksize(fs, size, lbn) - (off & ~VBLKMASK);
- if (n > VBLKSIZE)
- n = VBLKSIZE;
- if (blkmap != vbaddr) {
- if (dskread(blkbuf, vbaddr, n >> DEV_BSHIFT))
- return -1;
- blkmap = vbaddr;
- }
- n -= vboff;
- if (n > nb)
- n = nb;
- memcpy(s, blkbuf + vboff, n);
- s += n;
- fs_off += n;
- nb -= n;
- }
- return nbyte;
-}
-
-#else /* UFS1_AND_UFS2 */
-
/*
* Possible superblock locations ordered from most to least likely.
*/
static int sblock_try[] = SBLOCKSEARCH;
+#if defined(UFS2_ONLY)
+#define DIP(field) dp2.field
+#elif defined(UFS1_ONLY)
+#define DIP(field) dp1.field
+#else
#define DIP(field) fs->fs_magic == FS_UFS1_MAGIC ? dp1.field : dp2.field
+#endif
static ssize_t
fsread(ino_t inode, void *buf, size_t nbyte)
{
+#ifndef UFS2_ONLY
static struct ufs1_dinode dp1;
+#endif
+#ifndef UFS1_ONLY
static struct ufs2_dinode dp2;
+#endif
static ino_t inomap;
char *blkbuf;
void *indbuf;
@@ -241,9 +165,18 @@ fsread(ino_t inode, void *buf, size_t nbyte)
if (dskread(fs, sblock_try[n] / DEV_BSIZE,
SBLOCKSIZE / DEV_BSIZE))
return -1;
- if ((fs->fs_magic == FS_UFS1_MAGIC ||
+ if ((
+#if defined(UFS1_ONLY)
+ fs->fs_magic == FS_UFS1_MAGIC
+#elif defined(UFS2_ONLY)
(fs->fs_magic == FS_UFS2_MAGIC &&
- fs->fs_sblockloc == sblock_try[n])) &&
+ fs->fs_sblockloc == sblock_try[n])
+#else
+ fs->fs_magic == FS_UFS1_MAGIC ||
+ (fs->fs_magic == FS_UFS2_MAGIC &&
+ fs->fs_sblockloc == sblock_try[n])
+#endif
+ ) &&
fs->fs_bsize <= MAXBSIZE &&
fs->fs_bsize >= sizeof(struct fs))
break;
@@ -261,10 +194,16 @@ fsread(ino_t inode, void *buf, size_t nbyte)
if (dskread(blkbuf, INO_TO_VBA(fs, n, inode), DBPERVBLK))
return -1;
n = INO_TO_VBO(n, inode);
+#if defined(UFS1_ONLY)
+ dp1 = ((struct ufs1_dinode *)blkbuf)[n];
+#elif defined(UFS2_ONLY)
+ dp2 = ((struct ufs2_dinode *)blkbuf)[n];
+#else
if (fs->fs_magic == FS_UFS1_MAGIC)
dp1 = ((struct ufs1_dinode *)blkbuf)[n];
else
dp2 = ((struct ufs2_dinode *)blkbuf)[n];
+#endif
inomap = inode;
fs_off = 0;
blkmap = indmap = 0;
@@ -291,12 +230,17 @@ fsread(ino_t inode, void *buf, size_t nbyte)
indmap = vbaddr;
}
n = (lbn - NDADDR) & (n - 1);
+#if defined(UFS1_ONLY)
+ addr = ((ufs1_daddr_t *)indbuf)[n];
+#elif defined(UFS2_ONLY)
+ addr = ((ufs2_daddr_t *)indbuf)[n];
+#else
if (fs->fs_magic == FS_UFS1_MAGIC)
addr = ((ufs1_daddr_t *)indbuf)[n];
else
addr = ((ufs2_daddr_t *)indbuf)[n];
+#endif
} else {
- printf("file too big\n");
return -1;
}
vbaddr = fsbtodb(fs, addr) + (off >> VBLKSHIFT) * DBPERVBLK;
@@ -319,5 +263,3 @@ fsread(ino_t inode, void *buf, size_t nbyte)
}
return nbyte;
}
-
-#endif /* UFS1_AND_UFS2 */
OpenPOWER on IntegriCloud