Subject: libsa/ufs.c
To: None <>
From: None <>
List: tech-kern
Date: 02/21/2002 13:32:10
(sorry for the cross-post, I am currently unsubscribed to tech-kern)

	I am trying to use libsa/ufs.c in a MacOS program
(the NetBSD/Mac68k Booter), and have struck a strange problem.

	ufs_open() works fine, but when either it, or ufs_read()
use buf_read_file() to read data, it is reading a block 2 times
what I expect. e.g.:

			  Old MacOS code    libsa code
Step:			   reads block:	   reads block:
 Read FS header			16		16
 Read diinode			56		56
 unknown			580		1160
 Parse inodes, discover
 file's first block is 1428
 unknown			18436
 Read first block		1428		2856

	Now, the problem seems to be here in buf_read_file():

        if (file_block != fp->f_buf_blkno) {
                rc = block_map(f, file_block, &disk_block);
                if (rc)
                        return (rc);

                if (fp->f_buf == (char *)0)
                        fp->f_buf = alloc(fs->fs_bsize);

                if (disk_block == 0) {
                        bzero(fp->f_buf, block_size);
                        fp->f_buf_size = block_size;
                } else {
#if !defined(LIBSA_NO_TWIDDLE)
                        rc = DEV_STRATEGY(f->f_dev)(f->f_devdata, F_READ,
                                fsbtodb(fs, disk_block),
                                block_size, fp->f_buf, &fp->f_buf_size);

It calls block_map() which sets disk_block correctly, but then
the actual block read is determined by fsbtodb(fs, disk_block),
which in my case is doubling it.

	fsbtodb is the default one in ufs/ffs/fs.h:
#define fsbtodb(fs,b) ((b) << (fs)->fs_fsbtodb)
so does this mean:

1) My fs is incorrect? 
   (It was created by MacOS X's newfs -O)

2) My DEV_STRATEGY() is wrong,
   and needs to map between NetBSD and MacOS block sizes?
   (This seems unlikely, because the earlier blocks,
    like the header, are read in correctly)

3) I have included the wrong header files somewhere?
   (All seems OK - e.g. DEV_BSIZE is 512)

| Nigel Pearson,    |    "Things  you  own        |
| Telstra iDevelopments, Sydney, Australia |     end up owning you"      |
|   Office: 9206 3468    Fax:  9212 6329   | "not a beautiful snowflake" |
|   Mobile: 0408 664435  Home: 9792 6998   |     Tyler - Fight Club      |