git: hammer2 hammer2 - Implement nsymlink, readlink, remove, and rmdir
Matthew Dillon
dillon at crater.dragonflybsd.org
Tue Feb 28 15:48:06 PST 2012
commit 4e2004ea5955eabda0d124fdaf1d28a1766d92db
Author: Matthew Dillon <dillon at apollo.backplane.com>
Date: Tue Feb 28 15:38:49 2012 -0800
hammer2 - Implement nsymlink, readlink, remove, and rmdir
* Implement nsymlink and readlink. Currently requires VMIO because core
file r/w procedures are used to read and write the symlink target.
The symlink target will use inode-embedded data for targets with a
string length <= 512 bytes.
* Move a number of functions embedded in VOPs to their own separate
procedures so they can be called from multiple VOPs. So far: read,
write, and remove. Truncate and extend already had their own
helper procedures.
* Implement rm and rmdir. Currently does not optimize the presence of a
cached vnode (to get to the ip->chain), but the directory lookup is
cheap so it might not matter.
Implement two interesting optmiizations.
First, free block handling is not done in the active path. Since we
never know what snapshots might be pointing deep into our directory
hierarchy there's no point. This means that a removal only needs to
modify the parent chain element pointing to the item. The item itself
DOES NOT NEED TO BE MODIFIED IN ANY WAY, even if it is representitive
of a deep hierarchy (such as if it is a large file).
Second, recursive removals ala 'rm -rf' can proactive CLEAR the modified
bit on directory elements being removed that were previously marked
modified due to removals made from within those elements.
Together this can reduce the amount of write I/O required to remove a
directory hierarchy OF ANY SIZE, even terrabytes, to near zero.
* Hardlinks not yet handled but for the hardlink case the directory entry
itself will be a dummy and thus can be removed without modification. The
related 'real' inode, when we implement hardlinks, will be in some
parent directory and it will be marked modified. However, if a rm -rf is
able to traverse upward through that parent then even the real hardlink
inode will be re-marked as unmodified and virtually no write I/O will
result.
Summary of changes:
sys/vfs/hammer2/hammer2_chain.c | 18 ++-
sys/vfs/hammer2/hammer2_inode.c | 10 +
sys/vfs/hammer2/hammer2_vnops.c | 413 ++++++++++++++++++++++++++++++++++-----
3 files changed, 394 insertions(+), 47 deletions(-)
http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff/4e2004ea5955eabda0d124fdaf1d28a1766d92db
--
DragonFly BSD source repository
More information about the Commits
mailing list