• Omar Sandoval's avatar
    Btrfs: remove all subvol options before mounting top-level · e6e4dbe8
    Omar Sandoval authored
    Currently, setup_root_args() substitutes 's/subvol=[^,]*/subvolid=0/'.
    But, this means that if the user passes both a subvol and subvolid for
    some reason, we won't actually mount the top-level when we recursively
    mount. For example, consider:
    
    mkfs.btrfs -f /dev/sdb
    mount /dev/sdb /mnt
    btrfs subvol create /mnt/subvol1 # subvolid=257
    btrfs subvol create /mnt/subvol2 # subvolid=258
    umount /mnt
    mount -osubvol=/subvol1,subvolid=258 /dev/sdb /mnt
    
    In the final mount, subvol=/subvol1,subvolid=258 becomes
    subvolid=0,subvolid=258, and the last option takes precedence, so we
    mount subvol2 and try to look up subvol1 inside of it, which fails.
    
    So, instead, do a thorough scan through the argument list and remove any
    subvol= and subvolid= options, then append subvolid=0 to the end. This
    implicitly makes subvol= take precedence over subvolid=, but we're about
    to add a stricter check for that. This also makes setup_root_args() more
    generic, which we'll need soon.
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.cz>
    Signed-off-by: default avatarOmar Sandoval <osandov@osandov.com>
    Signed-off-by: default avatarChris Mason <clm@fb.com>
    e6e4dbe8
super.c 56.5 KB