readufs_ffs.c revision 1.1 1 /* $Id: readufs_ffs.c,v 1.1 2001/09/27 10:14:50 minoura Exp $ */
2
3 /*
4 * FS specific support for 4.2BSD Fast Filesystem
5 *
6 * Written by ITOH, Yasufumi (itohy (at) netbsd.org).
7 * Public domain.
8 *
9 * Intended to be used for boot programs (first stage).
10 * DON'T ADD ANY FANCY FEATURE. THIS SHALL BE COMPACT.
11 */
12
13 #include <sys/types.h>
14 #include <sys/param.h>
15 #include <ufs/ufs/dinode.h>
16 #include <ufs/ffs/fs.h>
17
18 #include "readufs.h"
19
20 static int get_ffs_inode __P((ino_t ino, struct dinode *dibuf));
21
22 #define fsi (*ufsinfo)
23 #define fsi_ffs fsi.fs_u.u_ffs
24
25 /*
26 * Read and check superblock.
27 * If it is an FFS, save information from the superblock.
28 */
29 int
30 try_ffs()
31 {
32 union {
33 struct fs sblk;
34 unsigned char pad[SBSIZE];
35 } buf;
36 struct ufs_info *ufsinfo = &ufs_info;
37
38 #ifdef DEBUG_WITH_STDIO
39 printf("trying FFS\n");
40 #endif
41 /* read FFS superblock */
42 RAW_READ(&buf, SBLOCK, SBSIZE);
43
44 #ifdef DEBUG_WITH_STDIO
45 printf("FFS: sblk: magic: 0x%x\n", buf.sblk.fs_magic);
46 #endif
47
48 if (buf.sblk.fs_magic != FS_MAGIC)
49 return 1;
50
51 /* This partition looks like an FFS. */
52 fsi.fstype = UFSTYPE_FFS;
53 fsi.get_inode = get_ffs_inode;
54 /* Disk addr in inode is in block --- need shifting. */
55 fsi.iblkshift = buf.sblk.fs_fsbtodb;
56
57 /* Get information from the superblock. */
58 fsi.bsize = buf.sblk.fs_bsize;
59 fsi.fsbtodb = buf.sblk.fs_fsbtodb;
60 fsi.nindir = buf.sblk.fs_nindir;
61
62 fsi_ffs.iblkno = buf.sblk.fs_iblkno;
63 fsi_ffs.cgoffset = buf.sblk.fs_cgoffset;
64 fsi_ffs.cgmask = buf.sblk.fs_cgmask;
65 fsi_ffs.fragshift = buf.sblk.fs_fragshift;
66 fsi_ffs.inopb = buf.sblk.fs_inopb;
67 fsi_ffs.ipg = buf.sblk.fs_ipg;
68 fsi_ffs.fpg = buf.sblk.fs_fpg;
69
70 return 0;
71 }
72
73 /* for inode macros */
74 #define fs_ipg fs_u.u_ffs.ipg
75 #define fs_iblkno fs_u.u_ffs.iblkno
76 #define fs_cgoffset fs_u.u_ffs.cgoffset
77 #define fs_cgmask fs_u.u_ffs.cgmask
78 #define fs_fpg fs_u.u_ffs.fpg
79 #define fs_inopb fs_u.u_ffs.inopb
80 #define fs_fragshift fs_u.u_ffs.fragshift
81 #define fs_fsbtodb fsbtodb
82
83 /*
84 * Get inode from disk.
85 */
86 static int
87 get_ffs_inode(ino, dibuf)
88 ino_t ino;
89 struct dinode *dibuf;
90 {
91 struct ufs_info *ufsinfo = &ufs_info;
92 struct dinode *buf = alloca((size_t) fsi.bsize);
93 struct dinode *di;
94
95 RAW_READ(buf, (unsigned int) fsbtodb(&fsi, ino_to_fsba(&fsi, ino)),
96 (size_t) fsi.bsize);
97
98 di = &buf[ino_to_fsbo(&fsi, ino)];
99 #ifdef DEBUG_WITH_STDIO
100 printf("FFS: dinode(%d): mode 0%o, nlink %d, size %d, uid %d, gid %d, db[0] %d\n",
101 ino, di->di_mode, di->di_nlink, (int)di->di_size,
102 di->di_uid, di->di_gid, di->di_db[0]);
103 #endif
104
105 if (di->di_mode == 0)
106 return 1; /* unused inode (file is not found) */
107
108 *dibuf = *di;
109
110 return 0;
111 }
112
113