• Chandan Rajendra's avatar
    Btrfs: Initialize btrfs_root->highest_objectid when loading tree root and subvolume roots · f32e48e9
    Chandan Rajendra authored
    The following call trace is seen when btrfs/031 test is executed in a loop,
    
    [  158.661848] ------------[ cut here ]------------
    [  158.662634] WARNING: CPU: 2 PID: 890 at /home/chandan/repos/linux/fs/btrfs/ioctl.c:558 create_subvol+0x3d1/0x6ea()
    [  158.664102] BTRFS: Transaction aborted (error -2)
    [  158.664774] Modules linked in:
    [  158.665266] CPU: 2 PID: 890 Comm: btrfs Not tainted 4.4.0-rc6-g511711af #2
    [  158.666251] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Bochs 01/01/2011
    [  158.667392]  ffffffff81c0a6b0 ffff8806c7c4f8e8 ffffffff81431fc8 ffff8806c7c4f930
    [  158.668515]  ffff8806c7c4f920 ffffffff81051aa1 ffff880c85aff000 ffff8800bb44d000
    [  158.669647]  ffff8808863b5c98 0000000000000000 00000000fffffffe ffff8806c7c4f980
    [  158.670769] Call Trace:
    [  158.671153]  [<ffffffff81431fc8>] dump_stack+0x44/0x5c
    [  158.671884]  [<ffffffff81051aa1>] warn_slowpath_common+0x81/0xc0
    [  158.672769]  [<ffffffff81051b27>] warn_slowpath_fmt+0x47/0x50
    [  158.673620]  [<ffffffff813bc98d>] create_subvol+0x3d1/0x6ea
    [  158.674440]  [<ffffffff813777c9>] btrfs_mksubvol.isra.30+0x369/0x520
    [  158.675376]  [<ffffffff8108a4aa>] ? percpu_down_read+0x1a/0x50
    [  158.676235]  [<ffffffff81377a81>] btrfs_ioctl_snap_create_transid+0x101/0x180
    [  158.677268]  [<ffffffff81377b52>] btrfs_ioctl_snap_create+0x52/0x70
    [  158.678183]  [<ffffffff8137afb4>] btrfs_ioctl+0x474/0x2f90
    [  158.678975]  [<ffffffff81144b8e>] ? vma_merge+0xee/0x300
    [  158.679751]  [<ffffffff8115be31>] ? alloc_pages_vma+0x91/0x170
    [  158.680599]  [<ffffffff81123f62>] ? lru_cache_add_active_or_unevictable+0x22/0x70
    [  158.681686]  [<ffffffff813d99cf>] ? selinux_file_ioctl+0xff/0x1d0
    [  158.682581]  [<ffffffff8117b791>] do_vfs_ioctl+0x2c1/0x490
    [  158.683399]  [<ffffffff813d3cde>] ? security_file_ioctl+0x3e/0x60
    [  158.684297]  [<ffffffff8117b9d4>] SyS_ioctl+0x74/0x80
    [  158.685051]  [<ffffffff819b2bd7>] entry_SYSCALL_64_fastpath+0x12/0x6a
    [  158.685958] ---[ end trace 4b63312de5a2cb76 ]---
    [  158.686647] BTRFS: error (device loop0) in create_subvol:558: errno=-2 No such entry
    [  158.709508] BTRFS info (device loop0): forced readonly
    [  158.737113] BTRFS info (device loop0): disk space caching is enabled
    [  158.738096] BTRFS error (device loop0): Remounting read-write after error is not allowed
    [  158.851303] BTRFS error (device loop0): cleaner transaction attach returned -30
    
    This occurs because,
    
    Mount filesystem
    Create subvol with ID 257
    Unmount filesystem
    Mount filesystem
    Delete subvol with ID 257
      btrfs_drop_snapshot()
        Add root corresponding to subvol 257 into
        btrfs_transaction->dropped_roots list
    Create new subvol (i.e. create_subvol())
      257 is returned as the next free objectid
      btrfs_read_fs_root_no_name()
        Finds the btrfs_root instance corresponding to the old subvol with ID 257
        in btrfs_fs_info->fs_roots_radix.
        Returns error since btrfs_root_item->refs has the value of 0.
    
    To fix the issue the commit initializes tree root's and subvolume root's
    highest_objectid when loading the roots from disk.
    Signed-off-by: default avatarChandan Rajendra <chandan@linux.vnet.ibm.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    f32e48e9
ioctl.c 136 KB