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