[Box Backup] inode, fsid, and OS dependencies

Joe Krahn boxbackup@fluffy.co.uk
Tue, 14 Dec 2004 11:44:13 -0500

While looking into info about inodes and filesystem IDs, I found some 
compatibility issues, even for POSIX systems. It also made me think 
about OS dependencies in general. So, here's some info/ideas:

When native Win32 support is merged, OS dependency issues will increase. 
If it were me, I would try to keep the code clean by consolidating 
OS-dependent code. So, instead of #ifdef WIN32/LINUX/etc., you just make 
a set of generic functions, then include source files for these 
depending on the OS, such as BoxWindows.cpp, BoxPosix.cpp, etc.

If it were me, I would use plain C for the OS functions. An alternative 
C++ approach would be an OperatingSystem class. It might be nice to have 
a POSIX class, then make subclass variants for BSD/Linux/etc.

As for filesystem ID (fsid) and inodes, the purpose, I think, is to use 
(fsid,inode) as a globally unique file identifier that does not change 
when renamed. Technically, struct statfs.f_fsid is the unique filesystem 
ID, but this field is not well supported. Struct stat.st_dev is well 
supported, but could change if a disk is added or removed. So, the 
mountpoint is a reasonable compromise. But, I would put this in the 
"OS-dependent" category. It may be better to use a filesystem label or 
GUID/UUID instead, depending on the OS.

Inodes are a further problem: Windows doesn't support inodes. (Maybe the 
Longhorn FS will.) It also turns out that inode is not always unique in 
   a POSIX system: some file systems have a larger actual inode number, 
and only return a hash of the real inode in stat.st_dev (i.e. Coda uses 
128 bit inodes). So, inode is also an OS dependent thing.

It might be good to have the inode field variable sized. Is that the 
case now? I haven't looked at the way data is stored on the server end.

Joe Krahn