readufs_ffs.c revision 1.1.4.2 1 /* from Id: readufs_ffs.c,v 1.5 2002/01/26 16:26:44 itohy 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
55 /* Get information from the superblock. */
56 fsi.bsize = buf.sblk.fs_bsize;
57 fsi.fsbtodb = buf.sblk.fs_fsbtodb;
58 fsi.nindir = buf.sblk.fs_nindir;
59
60 fsi_ffs.iblkno = buf.sblk.fs_iblkno;
61 fsi_ffs.cgoffset = buf.sblk.fs_cgoffset;
62 fsi_ffs.cgmask = buf.sblk.fs_cgmask;
63 fsi_ffs.fragshift = buf.sblk.fs_fragshift;
64 fsi_ffs.inopb = buf.sblk.fs_inopb;
65 fsi_ffs.ipg = buf.sblk.fs_ipg;
66 fsi_ffs.fpg = buf.sblk.fs_fpg;
67
68 return 0;
69 }
70
71 /* for inode macros */
72 #define fs_ipg fs_u.u_ffs.ipg
73 #define fs_iblkno fs_u.u_ffs.iblkno
74 #define fs_cgoffset fs_u.u_ffs.cgoffset
75 #define fs_cgmask fs_u.u_ffs.cgmask
76 #define fs_fpg fs_u.u_ffs.fpg
77 #define fs_inopb fs_u.u_ffs.inopb
78 #define fs_fragshift fs_u.u_ffs.fragshift
79 #define fs_fsbtodb fsbtodb
80
81 /*
82 * Get inode from disk.
83 */
84 static int
85 get_ffs_inode(ino, dibuf)
86 ino_t ino;
87 struct dinode *dibuf;
88 {
89 struct ufs_info *ufsinfo = &ufs_info;
90 struct dinode *buf = alloca((size_t) fsi.bsize);
91 struct dinode *di;
92
93 RAW_READ(buf, fsbtodb(&fsi, ino_to_fsba(&fsi, ino)),
94 (size_t) fsi.bsize);
95
96 di = &buf[ino_to_fsbo(&fsi, ino)];
97 #ifdef DEBUG_WITH_STDIO
98 printf("FFS: dinode(%d): mode 0%o, nlink %d, size %d, uid %d, gid %d, db[0] %d\n",
99 ino, di->di_mode, di->di_nlink, (int)di->di_size,
100 di->di_uid, di->di_gid, di->di_db[0]);
101 #endif
102
103 if (di->di_mode == 0)
104 return 1; /* unused inode (file is not found) */
105
106 *dibuf = *di;
107
108 return 0;
109 }
110
111