Subject: Supporting sector size != DEV_BSIZE -- uh-oh!
To: None <tech-kern@netbsd.org>
From: Trevin Beattie <trevin@xmission.com>
List: tech-kern
Date: 06/13/2002 14:21:27
--Boundary_(ID_B4/7he3ScaOVw1w+khgyaQ)
Content-type: text/plain; charset=us-ascii
Content-transfer-encoding: 7BIT

>Date: Mon, 10 Jun 2002 13:53:32 -0700
>To: tech-kern@netbsd.org
>From: Trevin Beattie <trevin@xmission.com>
>Subject: Re: Supporting sector size != DEV_BSIZE
>
>Remember, what triggered the suggestion was Robert's view on what the
>*intention* was for di_blocks:
>
>> At 10:34 PM 6/10/2002 +0700, Robert Elz wrote:
>> >The theory is that di_blocks is in very well known constant units,
>> >that are known by everyone.   If the count was in units of fragments
>> >then applications (like du, ls) that extract the information would
>> >need to have a way to know the fragment size before they could use
>> >the information.
>> >
>> >So, di_blocks isn't really supposed to be in DEV_BSIZE units, it is
>> >supposed to be in 512 byte block units.   But it happens that at the
>> >time, DEV_BSIZE==512 was one of the unchangable constants of the
>> >universe (kind of like pi=3.14159... or NULL=0) and the distinction
>> >between things wanting the constant number, and things wanting device
>> >blocksize units was very much blurred (as you're discovering).
>
>I was also concerned because there was nothing in <ufs/ufs/dinode.h> to
>indicate either the sector size, the fs fragment size, or the value of
>DEV_BSIZE used by the kernel that created the file system.  Just
>considering the lack of a unit made me think that a constant would be the
>better way to go.
>
>However, after looking into the kernel code that uses di_blocks (which
>in most cases is handled by the i_ffs_blocks macro), it would appear
>that all affected functions also have access to struct fs for the
>inode's file system.  If there are no exceptions, then yes, we can
>define the units of di_blocks to be physical sectors, using the NSPF
>macro.

I've been working on this today, and as expected, I was able to get the ffs
code converted to treat i_ffs_blocks (a.k.a. di_blocks) as a number of
sectors using some extra math with two fields from struct fs.

HOWEVER -- when I moved on to the ufs code I discovered that ufs_vnops.c
uses i_ffs_blocks in three functions, _none_ of which have an existing
struct fs pointer at all!  And if I'm reading ufs/inode.h correctly, the
inode could be used by either ffs or lfs, so a reference to ip->inode_u.fs
may not work.

So it looks like this attempt to redefine di_blocks in terms of sectors, as
recommended by Bill (ref. 11 Jun 2002 17:55:57 and 10 Jun 2002 10:26:24),
won't work.  But as for the alternatives: using a constant unit of 512
bytes (from Robert on 10 Jun 2002 22:34:25, and Chuck on 10 Jun 2002
21:44:24) will probably break existing file systems on ports where
DEV_BSIZE != 512; and using the fs fragment size will almost certainly
break all existing file systems, and still have the same roadblock I found
in ufs_vnops.c.

Any ideas on how to work around this problem, or alternate solutions?

By the way, I've already moved the i386 disk label to sector LABELSECTOR
(instead of byte offset LABELSECTOR * DEV_BSIZE).  It was trivial.  The
patch works.  I've also patched fdisk to work with sector sizes up to 8K.
That works too, though I haven't tried reading any extended DOS partitions
with it.  (MS-Windows doesn't use a partition table when it formats a MO
disk.  It's just one BIG floppy.)  The attached file contains the patches I
made _before_ messing with di_blocks.

--Boundary_(ID_B4/7he3ScaOVw1w+khgyaQ)
Content-type: application/octet-stream; name=patches.gz; x-mac-type=477A6970;
 x-mac-creator=477A6970
Content-transfer-encoding: base64
Content-disposition: attachment; filename=patches.gz

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

--Boundary_(ID_B4/7he3ScaOVw1w+khgyaQ)
Content-type: text/plain; charset=us-ascii
Content-transfer-encoding: 7BIT


-----------------------
Trevin Beattie          "Do not meddle in the affairs of wizards,
trevin@xmission.com     for you are crunchy and good with ketchup."
      {:->                                     --unknown

--Boundary_(ID_B4/7he3ScaOVw1w+khgyaQ)--