Versioning File System for FreeBSD?

Roland Smith rsmith at
Wed Jun 24 19:11:35 UTC 2009

On Wed, Jun 24, 2009 at 07:59:18PM +0200, cpghost wrote:
> On Wed, Jun 24, 2009 at 06:37:55PM +0200, Roland Smith wrote:
> > On Wed, Jun 24, 2009 at 05:04:22PM +0200, cpghost wrote:
> > > Hi,
> > > 
> > > is there anybody working on a versioning file system for FreeBSD
> > > right now?
> > 
> > > I don't care if it is native or a layer, geom-ified, fuse-based,
> > > or even if it uses subversion as its backend, as long as it
> > > provides some kind of transparent versioning.
> > 
> > You could try devel/git? It's not a file system, but a very efficient
> > directory content tracker/version control system. One of the things I
> > use it for is to keep a certain directory in sync between a desktop and
> > a laptop. It works equally well with text or binary files.
> Yes, that's one possibility. But just like Subversion (which I'm
> using extensively here), it's not really transparent.

What is? If you have to extend the API like you propose below, all
programs that want to use that feature have to be changed. So if you're
going around changing your program, why not have it interface to an existing
revision control that you are already familiar with? That seems a lot
easier that tacking revision control onto a filesystem!

Git is very good at efficiently storing the differences between
commits. And every copy of a directory under git control is a full-blown
repository, so you can experiment with a copy without fear of fouling up
your precious repository.

> I was actually thinking of a real versioning file system, with an
> extended POSIX API (yet to be defined), to access all revisions of
> a file system, just like with Subversion revisions.
> As an example: opendir(2) would grow an additional and optional
> argument "revision" to select either HEAD or some revision of the
> directory:
> DIR *dirp;
> dirp = opendir("/path/to/dir", 0);   /* open /path/to/file at HEAD */
> dirp = opendir("/path/to/dir");      /* same as above, POSIX compat */
> dirp = opendir("/path/to/dir", 323); /* open dir at revision 323 */
> /* From here on, readdir() would retrieve /path/to/dir entries
>    at the specified revision. */
> open(2) could open a file at an earlier revision:
> FILE *filep;
> /* open file in HEAD */
> filep = open("/path/to/file", O_RDONLY);
> /* open same path, but at revision 323 */
> filep = open("/path/to/file", O_RDONLY, /* 0666 */, 323);

There is some ambiguity here. Does 323 refer to a single file, or to the
state of its parent directory? If changing a file doesn't update the
version of its parent directory, then why have version numbers for
directories? On the other hand, if changing a file updates the revision
for the file and its parent directory, the revision for the root
directory will increase quite rapidly!

> unlink(2) would remove an entry from a directory, and bump the revision
> of the directory. Accessing that path from the new revision wouldn't be
> possible, but the file would still be there in an earlier revision.
> Modifying a file would also create new revisions (e.g. at each
> write(2), or at each close(2), that should be selectable).

I don't know what you want to do use this for, but a simple trick (used
e.g. by Pro/Engineer) is to have your application append a version
number after the filename (e.g. "foo.prt.1") that is incremented every
time the file is saved. This does waste some disk space (or provides
redundancy, take your pick).
> Of course, there would be additional API calls to traverse the
> list of revisions, to access meta data (properties?, tags?,
> commit logs?, ...) etc., so that the file system remains manageable.

VMS had a filesystem that uses versioning: []

> I didn't try them (yet), but on Linux, there are some experimental
> versioning file systems like:
> and there's a (unmaintained?) FUSE file system at:
> all of which differ in the way POSIX API should be extended and
> the semantics for versioning. But there's apparently nothing yet
> in the works for FreeBSD. Perhaps some layer on top of existing
> file systems, or an extension of UFS/FFS that stores versioning
> meta data directly at the block level?
> > Roland
> -cpghost.

[plain text _non-HTML_ PGP/GnuPG encrypted/signed email much appreciated]
pgp: 1A2B 477F 9970 BA3C 2914  B7CE 1277 EFB0 C321 A725 (KeyID: C321A725)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 196 bytes
Desc: not available
Url :

More information about the freebsd-questions mailing list