• Filipe Manana's avatar
    btrfs: skip logging directories already logged when logging all parents · 3e6a86a1
    Filipe Manana authored
    Some times when we fsync an inode we need to do a full log of all its
    ancestors (due to unlink, link or rename operations), which can be an
    expensive operation, specially if the directories are large.
    
    However if we find an ancestor directory inode that is already logged in
    the current transaction, and has no inserted/updated/deleted xattrs since
    it was last logged, we can skip logging the directory again. We are safe
    to skip that since we know that for logged directories, any link, unlink
    or rename operations that implicate the directory will update the log as
    necessary.
    
    So use the helper need_log_dir(), introduced in a previous commit, to
    detect already logged directories that can be skipped.
    
    This patch is part of a patchset comprised of the following patches:
    
      btrfs: remove unnecessary directory inode item update when deleting dir entry
      btrfs: stop setting nbytes when filling inode item for logging
      btrfs: avoid logging new ancestor inodes when logging new inode
      btrfs: skip logging directories already logged when logging all parents
      btrfs: skip logging inodes already logged when logging new entries
      btrfs: remove unnecessary check_parent_dirs_for_sync()
      btrfs: make concurrent fsyncs wait less when waiting for a transaction commit
    
    Performance results, after applying all patches, are mentioned in the
    change log of the last patch.
    Reviewed-by: default avatarJosef Bacik <josef@toxicpanda.com>
    Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    3e6a86a1
tree-log.c 175 KB