About the directories:
Implying directory entries cause a lot of extra overhead at these points:
Deleting files
The entire index must be scanned if the underlying directory is now empty so that a directory marker must be created
Deleting directories
See deleting files
Moving files
when contents is moved, there might be need to recreate a directory entry, which is quite common after a large move
Moving directories
See moving files
These operations are also strictly poorer in complexity:
Listing directory contents
The entire index must be scanned for implied directories to be listed, after which you need to run a filter algorithm to cut duplicates
It also needs adaptations to the following parts of code and makes optimizing them more difficult:
Adding files
Instead of looking for the existance of the host directory, all file entries must be processed as well to see if that directory exists and the file is allowed to be written
Adding directories
See adding files
In short, most if not all operations are affected by that architectural decision, and i still think that for simplicity we are better off with them than without them.
Furthermore, implying directories will require in several cases that the entire index area is in memory, which is bad if you have a lot of files and limited memory. If you want to list a directory's contents for example you can do that in n-log-n time only if its entirely loaded in memory. In-place you'll probably spend n^2 time which is a horror.
As for directory ratio:
i found an old DOS floppy: 3 dirs ~50 files, which is a more likely combination. And although i'm not sure what directory usage is among os floppies i dont think the directory overhead is as big as 33% of the index size, more like 5-10%.
As for the resulting directory inconsistencies:
If directories must be listed and they dont, then the end user has a problem. The filesystem is still useable - and you can find all the files not in a missing directory.
Which brings us to a very infamous necessity: CHKDSK
In FAT days, this is used to find inconsistencies and attempt to resolve them, as well attempting to redo or undo incomplete transactions. The downside is, that it needs a lot of time to complete a run, bringing us to the need to avoid it.
As such, avoiding to run it if the disk is known not to be inconsistent is probably a good thing (and we know M$ to do it).
Since SFS can remain working in an inconsistent state, its not a necessity for drivers to be aware of "possibly if not likely implied directories" and just keep it simple, while having an utility that verifies the integrity of the entire system as such.
On the other hand, SFS is slow by design: you need to read the entire index to check if a file exists instead of walking a directory structure, so running a scandisk upon mount is likely not to be such an time horror when compared to loading the index into RAM.
As for 64 or 32 bit numbers:
Now to cancel your party, the 1 TB is not a hard limit of SFS in 32bit mode - Think FAT and change block size: 2^(7+255) * 2^32 = a lot (I am so not calculating this number). Shame the spec reads 'must equal sector size'
, but then who says holographic disks dont have 256MB sectors
Personally, i dont mind 64 bits, but its annoying only because basic is hardlimitng me at 32 bits here ::) (hands out "insult combuster" invitations)
As for compatibility
It looks like we're throwing the same arguments over and over again. (And I'm happily joining in)
Honestly if a driver finds a disk it doesnt fully understand it should not attempt to alter it without permission. Its not until SFS 2.0 is out to see wether --rw is a do or don't. The only advice i have is to include a reserved field in the superblock, for the rest keep the backwards compatibility issues for the 2.0 design.
It also reminds me of PNG: it used a set of flags to tell what to do with unknown blocks: one of them was keep if modified/remove if modified, which was designed for forward compatibility. You could for instance split the index codes into 0-F and 10-1F for keep/dont keep so SFS 1.0 might retain some SFS 2.0 data without bringing it entirely down to SFS 1.0 level.
That's all folks
[edit]I misread something in the spec, fixed it[/edit]