A transactional file system performs multiple file system operations as
part of a user-level transaction. An application specifies that
operations should be handled as part of a transaction, and the
application is given a file handle associated with the transaction
context. Operations are managed consistent with transactional behavior
and data isolation is provided with multiple versions of a file and by
tracking copies of pages that have changed. Transactional readers do not
receive changes to a file made by transactional writers, until the
transactional writer commits the transaction and the reader reopens the
file. Logging and recovery are also facilitated by logging page data
separate from the main log, with a unique signature that enables the log
to determine whether a page was fully flushed to disk prior to a system
crash. Namespace isolation is also provided until a transaction commits
via isolation directories.