Home | History | Annotate | Line # | Download | only in boot_ufs
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