• Mike Snitzer's avatar
    dm thin: fix unprotected use of prepared_discards list · c3a0ce2e
    Mike Snitzer authored
    Fix two places in commit 104655fd ("dm thin: support discards") that
    didn't use pool->lock to protect against concurrent changes to the
    prepared_discards list.
    
    Without this fix, thin_endio() can race with process_discard(), leading
    to concurrent list_add()s that result in the processes locking up with
    an error like the following:
    
    WARNING: at lib/list_debug.c:32 __list_add+0x8f/0xa0()
    ...
    list_add corruption. next->prev should be prev (ffff880323b96140), but was ffff8801d2c48440. (next=ffff8801d2c485c0).
    ...
    Pid: 17205, comm: kworker/u:1 Tainted: G        W  O 3.4.0-rc3.snitm+ #1
    Call Trace:
     [<ffffffff8103ca1f>] warn_slowpath_common+0x7f/0xc0
     [<ffffffff8103cb16>] warn_slowpath_fmt+0x46/0x50
     [<ffffffffa04f6ce6>] ? bio_detain+0xc6/0x210 [dm_thin_pool]
     [<ffffffff8124ff3f>] __list_add+0x8f/0xa0
     [<ffffffffa04f70d2>] process_discard+0x2a2/0x2d0 [dm_thin_pool]
     [<ffffffffa04f6a78>] ? remap_and_issue+0x38/0x50 [dm_thin_pool]
     [<ffffffffa04f7c3b>] process_deferred_bios+0x7b/0x230 [dm_thin_pool]
     [<ffffffffa04f7df0>] ? process_deferred_bios+0x230/0x230 [dm_thin_pool]
     [<ffffffffa04f7e42>] do_worker+0x52/0x60 [dm_thin_pool]
     [<ffffffff81056fa9>] process_one_work+0x129/0x450
     [<ffffffff81059b9c>] worker_thread+0x17c/0x3c0
     [<ffffffff81059a20>] ? manage_workers+0x120/0x120
     [<ffffffff8105eabe>] kthread+0x9e/0xb0
     [<ffffffff814ceda4>] kernel_thread_helper+0x4/0x10
     [<ffffffff8105ea20>] ? kthread_freezable_should_stop+0x70/0x70
     [<ffffffff814ceda0>] ? gs_change+0x13/0x13
    ---[ end trace 7e0a523bc5e52692 ]---
    Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
    Signed-off-by: default avatarAlasdair G Kergon <agk@redhat.com>
    c3a0ce2e
dm-thin.c 65.7 KB