• Omar Sandoval's avatar
    btrfs: move common inode creation code into btrfs_create_new_inode() · caae78e0
    Omar Sandoval authored
    All of our inode creation code paths duplicate the calls to
    btrfs_init_inode_security() and btrfs_add_link(). Subvolume creation
    additionally duplicates property inheritance and the call to
    btrfs_set_inode_index(). Fix this by moving the common code into
    btrfs_create_new_inode(). This accomplishes a few things at once:
    
    1. It reduces code duplication.
    
    2. It allows us to set up the inode completely before inserting the
       inode item, removing calls to btrfs_update_inode().
    
    3. It fixes a leak of an inode on disk in some error cases. For example,
       in btrfs_create(), if btrfs_new_inode() succeeds, then we have
       inserted an inode item and its inode ref. However, if something after
       that fails (e.g., btrfs_init_inode_security()), then we end the
       transaction and then decrement the link count on the inode. If the
       transaction is committed and the system crashes before the failed
       inode is deleted, then we leak that inode on disk. Instead, this
       refactoring aborts the transaction when we can't recover more
       gracefully.
    
    4. It exposes various ways that subvolume creation diverges from mkdir
       in terms of inheriting flags, properties, permissions, and POSIX
       ACLs, a lot of which appears to be accidental. This patch explicitly
       does _not_ change the existing non-standard behavior, but it makes
       those differences more clear in the code and documents them so that
       we can discuss whether they should be changed.
    Reviewed-by: default avatarSweet Tea Dorminy <sweettea-kernel@dorminy.me>
    Signed-off-by: default avatarOmar Sandoval <osandov@fb.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    caae78e0
ioctl.c 139 KB