DragonFly commits List (threaded) for 2007-12
cvs commit: src/sys/vfs/hammer hammer.h hammer_btree.c hammer_inode.c hammer_io.c hammer_object.c hammer_ondisk.c hammer_subs.c hammer_transaction.c hammer_vfsops.c hammer_vnops.c
dillon 2007/12/31 17:00:03 PST
DragonFly src repository
sys/vfs/hammer hammer.h hammer_btree.c hammer_inode.c
HAMMER 14/many - historical access cleanup, itimes, bug fixes.
With this commit most historical accesses work and I can go through at least
two cycles of cpdup / rm -rf without crashing.
* Fix a bug in the B-Tree code related to searches on historical records.
These records are differentiated by key.create_tid but unlike the rest
of the key the matching algorithm has to be somewhat more sophisticated.
e.g. A search as of time 10 needs to find a record with a create_tid of 5.
To make this work properly we use a trick when we generate the separator
when splitting a leaf. see hammer_btree.c / hammer_make_separator().
* Recycle inodes a link count of 0 immediately.
* Optimization: Do not flush backing store to disk on reclaim.
* Add a per-inode read-only flag. Mark all historical inodes as read-only
* Implement read-only semantics in the vnops and assert attempts to modify
inodes marked read-only.
* Properly record the last transaction id for use when synchronizing
inodes to the platter. There were a few cases when late synchronizations
were using the wrong transaction id, breaking user expectations when
accessing historical data after a sync.
* Update the itimes (atime and mtime). These are non-historical updates by
default (meaning we just overwrite the latest inode record instead of
deleting it and inserting a new one). A future mount option will allow
these updates to operate historically (the coding is trivial)... didn't
you always want to know the last time a file was accessed prior to a
particular date? Think about it...
* Fix an inode memory leak. The inode in-memory structure must be freed
on last reference. There were cases where it was being left in the
* Optimization: Reduce vnode scan overhead during 'sync' by improving
on the inode flags which indicate that some sort of sync is required.
* Optimization: Don't flush inodes when their link count drops by 1, try
to only flush them when their link drops to 0.
* Fix a couple of potential deadlocks.
* Fix a case in the vnops code where an inode was not being properly flagged
as being dirty.
Revision Changes Path
1.18 +12 -6 src/sys/vfs/hammer/hammer.h
1.15 +62 -23 src/sys/vfs/hammer/hammer_btree.c
1.16 +152 -43 src/sys/vfs/hammer/hammer_inode.c
1.11 +4 -3 src/sys/vfs/hammer/hammer_io.c
1.14 +11 -10 src/sys/vfs/hammer/hammer_object.c
1.15 +21 -11 src/sys/vfs/hammer/hammer_ondisk.c
1.10 +9 -0 src/sys/vfs/hammer/hammer_subs.c
1.6 +22 -1 src/sys/vfs/hammer/hammer_transaction.c
1.13 +4 -1 src/sys/vfs/hammer/hammer_vfsops.c
1.15 +89 -17 src/sys/vfs/hammer/hammer_vnops.c