• Misono, Tomohiro's avatar
    btrfs: cleanup btrfs_mount() using btrfs_mount_root() · 312c89fb
    Misono, Tomohiro authored
    Cleanup btrfs_mount() by using btrfs_mount_root(). This avoids getting
    btrfs_mount() called twice in mount path.
    
    Old btrfs_mount() will do:
    0. VFS layer calls vfs_kern_mount() with registered file_system_type
       (for btrfs, btrfs_fs_type). btrfs_mount() is called on the way.
    1. btrfs_parse_early_options() parses "subvolid=" mount option and set the
       value to subvol_objectid. Otherwise, subvol_objectid has the initial
       value of 0
    2. check subvol_objectid is 5 or not. Assume this time id is not 5, then
       btrfs_mount() returns by calling mount_subvol()
    3. In mount_subvol(), original mount options are modified to contain
       "subvolid=0" in setup_root_args(). Then, vfs_kern_mount() is called with
       btrfs_fs_type and new options
    4. btrfs_mount() is called again
    5. btrfs_parse_early_options() parses "subvolid=0" and set 5 (instead of 0)
       to subvol_objectid
    6. check subvol_objectid is 5 or not. This time id is 5 and mount_subvol()
       is not called. btrfs_mount() finishes mounting a root
    7. (in mount_subvol()) with using a return vale of vfs_kern_mount(), it
       calls mount_subtree()
    8. return subvolume's dentry
    
    Reusing the same file_system_type (and btrfs_mount()) for vfs_kern_mount()
    is the cause of complication.
    
    Instead, new btrfs_mount() will do:
    1. parse subvol id related options for later use in mount_subvol()
    2. mount device's root by calling vfs_kern_mount() with
       btrfs_root_fs_type, which is not registered to VFS by
       register_filesystem(). As a result, btrfs_mount_root() is called
    3. return by calling mount_subvol()
    
    The code of 2. is moved from the first part of mount_subvol().
    
    The semantics of device holder changes from btrfs_fs_type to
    btrfs_root_fs_type and has to be used in all contexts. Otherwise we'd
    get wrong results when mount and dev scan would not check the same
    thing. (this has been found indendently and the fix is folded into this
    patch)
    Signed-off-by: default avatarTomohiro Misono <misono.tomohiro@jp.fujitsu.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    [ fold the btrfs_control_ioctl fixup, extend the comment ]
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    312c89fb
super.c 66.5 KB