Skip to content
  • Mike Snitzer's avatar
    dm space map metadata: return on failure in sm_metadata_new_block · f62b6b8f
    Mike Snitzer authored
    Commit 2fc48021
    
     ("dm persistent
    metadata: add space map threshold callback") introduced a regression
    to the metadata block allocation path that resulted in errors being
    ignored.  This regression was uncovered by running the following
    device-mapper-test-suite test:
    dmtest run --suite thin-provisioning -n /exhausting_metadata_space_causes_fail_mode/
    
    The ignored error codes in sm_metadata_new_block() could crash the
    kernel through use of either the dm-thin or dm-cache targets, e.g.:
    
    device-mapper: thin: 253:4: reached low water mark for metadata device: sending event.
    device-mapper: space map metadata: unable to allocate new metadata block
    general protection fault: 0000 [#1] SMP
    ...
    Workqueue: dm-thin do_worker [dm_thin_pool]
    task: ffff880035ce2ab0 ti: ffff88021a054000 task.ti: ffff88021a054000
    RIP: 0010:[<ffffffffa0331385>]  [<ffffffffa0331385>] metadata_ll_load_ie+0x15/0x30 [dm_persistent_data]
    RSP: 0018:ffff88021a055a68  EFLAGS: 00010202
    RAX: 003fc8243d212ba0 RBX: ffff88021a780070 RCX: ffff88021a055a78
    RDX: ffff88021a055a78 RSI: 0040402222a92a80 RDI: ffff88021a780070
    RBP: ffff88021a055a68 R08: ffff88021a055ba4 R09: 0000000000000010
    R10: 0000000000000000 R11: 00000002a02e1000 R12: ffff88021a055ad4
    R13: 0000000000000598 R14: ffffffffa0338470 R15: ffff88021a055ba4
    FS:  0000000000000000(0000) GS:ffff88033fca0000(0000) knlGS:0000000000000000
    CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
    CR2: 00007f467c0291b8 CR3: 0000000001a0b000 CR4: 00000000000007e0
    Stack:
     ffff88021a055ab8 ffffffffa0332020 ffff88021a055b30 0000000000000001
     ffff88021a055b30 0000000000000000 ffff88021a055b18 0000000000000000
     ffff88021a055ba4 ffff88021a055b98 ffff88021a055ae8 ffffffffa033304c
    Call Trace:
     [<ffffffffa0332020>] sm_ll_lookup_bitmap+0x40/0xa0 [dm_persistent_data]
     [<ffffffffa033304c>] sm_metadata_count_is_more_than_one+0x8c/0xc0 [dm_persistent_data]
     [<ffffffffa0333825>] dm_tm_shadow_block+0x65/0x110 [dm_persistent_data]
     [<ffffffffa0331b00>] sm_ll_mutate+0x80/0x300 [dm_persistent_data]
     [<ffffffffa0330e60>] ? set_ref_count+0x10/0x10 [dm_persistent_data]
     [<ffffffffa0331dba>] sm_ll_inc+0x1a/0x20 [dm_persistent_data]
     [<ffffffffa0332270>] sm_disk_new_block+0x60/0x80 [dm_persistent_data]
     [<ffffffff81520036>] ? down_write+0x16/0x40
     [<ffffffffa001e5c4>] dm_pool_alloc_data_block+0x54/0x80 [dm_thin_pool]
     [<ffffffffa001b23c>] alloc_data_block+0x9c/0x130 [dm_thin_pool]
     [<ffffffffa001c27e>] provision_block+0x4e/0x180 [dm_thin_pool]
     [<ffffffffa001fe9a>] ? dm_thin_find_block+0x6a/0x110 [dm_thin_pool]
     [<ffffffffa001c57a>] process_bio+0x1ca/0x1f0 [dm_thin_pool]
     [<ffffffff8111e2ed>] ? mempool_free+0x8d/0xa0
     [<ffffffffa001d755>] process_deferred_bios+0xc5/0x230 [dm_thin_pool]
     [<ffffffffa001d911>] do_worker+0x51/0x60 [dm_thin_pool]
     [<ffffffff81067872>] process_one_work+0x182/0x3b0
     [<ffffffff81068c90>] worker_thread+0x120/0x3a0
     [<ffffffff81068b70>] ? manage_workers+0x160/0x160
     [<ffffffff8106eb2e>] kthread+0xce/0xe0
     [<ffffffff8106ea60>] ? kthread_freezable_should_stop+0x70/0x70
     [<ffffffff8152af6c>] ret_from_fork+0x7c/0xb0
     [<ffffffff8106ea60>] ? kthread_freezable_should_stop+0x70/0x70
     [<ffffffff8152af6c>] ret_from_fork+0x7c/0xb0
     [<ffffffff8106ea60>] ? kthread_freezable_should_stop+0x70/0x70
    
    Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
    Acked-by: default avatarJoe Thornber <ejt@redhat.com>
    Cc: stable@vger.kernel.org # v3.10+
    f62b6b8f