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@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