• F
    btrfs: skip logging parent dir when conflicting inode is not a dir · 5557a069
    Filipe Manana 提交于
    When we find a conflicting inode (an inode that had the same name and
    parent directory as the inode we are logging now) that was deleted in the
    current transaction, we always end up logging its parent directory.
    
    This is to deal with the case where the conflicting inode corresponds to
    a deleted subvolume/snapshot or a directory that had subvolumes/snapshots
    (or some subdirectory inside it had subvolumes/snapshots, etc), because
    we can't deal with dropping subvolumes/snapshots during log replay. So
    if we log the parent directory, and if we are dealing with these special
    cases, then we fallback to a transaction commit when logging the parent,
    because its last_unlink_trans will match the current transaction (which
    gets set and propagated when a subvolume/snapshot is deleted).
    
    This change skips the logging of the parent directory when the conflicting
    inode is not a directory (or a subvolume/snapshot). This is ok because in
    this case logging the current inode is enough to trigger an unlink of the
    conflicting inode during log replay.
    
    So for a case like this:
    
      $ mkdir /mnt/dir
      $ echo -n "first foo data" > /mnt/dir/foo
    
      $ sync
    
      $ rm -f /mnt/dir/foo
      $ echo -n "second foo data" > /mnt/dir/foo
      $ xfs_io -c "fsync" /mnt/dir/foo
    
    We avoid logging parent directory "dir" when logging the new file "foo".
    In other cases it avoids falling back to a transaction commit, when the
    parent directory has a last_unlink_trans value that matches the current
    transaction, due to moving a file from it to some other directory.
    
    This is a case that happens frequently with dbench for example, where a
    new file that has the name/parent of another file that was deleted in the
    current transaction, is fsynced.
    Signed-off-by: NFilipe Manana <fdmanana@suse.com>
    Signed-off-by: NDavid Sterba <dsterba@suse.com>
    5557a069
tree-log.c 199.3 KB