01 Nov, 2011

1 commit


06 Mar, 2010

1 commit

  • Remove the dm_get() in dm_table_get_md() because dm_table_get_md() could
    be called from presuspend/postsuspend, which are called while
    mapped_device is in DMF_FREEING state, where dm_get() is not allowed.

    Justification for that is the lifetime of both objects: As far as the
    current dm design/implementation, mapped_device is never freed while
    targets are doing something, because dm core waits for targets to become
    quiet in dm_put() using presuspend/postsuspend. So targets should be
    able to touch mapped_device without holding reference count of the
    mapped_device, and we should allow targets to touch mapped_device even
    if it is in DMF_FREEING state.

    Backgrounds:
    I'm trying to remove the multipath internal queue, since dm core now has
    a generic queue for request-based dm. In the patch-set, the multipath
    target wants to request dm core to start/stop queue. One of such
    start/stop requests can happen during postsuspend() while the target
    waits for pg-init to complete, because the target stops queue when
    starting pg-init and tries to restart it when completing pg-init. Since
    queue belongs to mapped_device, it involves calling dm_table_get_md()
    and dm_put(). On the other hand, postsuspend() is called in dm_put()
    for mapped_device which is in DMF_FREEING state, and that triggers
    BUG_ON(DMF_FREEING) in the 2nd dm_put().

    I had tried to solve this problem by changing only multipath not to
    touch mapped_device which is in DMF_FREEING state, but I couldn't and I
    came up with a question why we need dm_get() in dm_table_get_md().

    Signed-off-by: Kiyoshi Ueda
    Signed-off-by: Jun'ichi Nomura
    Signed-off-by: Alasdair G Kergon

    Kiyoshi Ueda
     

11 Dec, 2009

1 commit

  • Fix a reported deadlock if there are still unprocessed multipath events
    on a device that is being removed.

    _hash_lock is held during dev_remove while trying to send the
    outstanding events. Sending the events requests the _hash_lock
    again in dm_copy_name_and_uuid.

    This patch introduces a separate lock around regions that modify the
    link to the hash table (dm_set_mdptr) or the name or uuid so that
    dm_copy_name_and_uuid no longer needs _hash_lock.

    Additionally, dm_copy_name_and_uuid can only be called if md exists
    so we can drop the dm_get() and dm_put() which can lead to a BUG()
    while md is being freed.

    The deadlock:
    #0 [ffff8106298dfb48] schedule at ffffffff80063035
    #1 [ffff8106298dfc20] __down_read at ffffffff8006475d
    #2 [ffff8106298dfc60] dm_copy_name_and_uuid at ffffffff8824f740
    #3 [ffff8106298dfc90] dm_send_uevents at ffffffff88252685
    #4 [ffff8106298dfcd0] event_callback at ffffffff8824c678
    #5 [ffff8106298dfd00] dm_table_event at ffffffff8824dd01
    #6 [ffff8106298dfd10] __hash_remove at ffffffff882507ad
    #7 [ffff8106298dfd30] dev_remove at ffffffff88250865
    #8 [ffff8106298dfd60] ctl_ioctl at ffffffff88250d80
    #9 [ffff8106298dfee0] do_ioctl at ffffffff800418c4
    #10 [ffff8106298dff00] vfs_ioctl at ffffffff8002fab9
    #11 [ffff8106298dff40] sys_ioctl at ffffffff8004bdaf
    #12 [ffff8106298dff80] tracesys at ffffffff8005d28d (via system_call)

    Cc: stable@kernel.org
    Reported-by: guy keren
    Signed-off-by: Mikulas Patocka
    Signed-off-by: Alasdair G Kergon

    Mikulas Patocka
     

28 Apr, 2008

1 commit


20 Oct, 2007

2 commits