• Kiyoshi Ueda's avatar
    dm ioctl: release _hash_lock between devices in remove_all · 98f33285
    Kiyoshi Ueda authored
    This patch changes dm_hash_remove_all() to release _hash_lock when
    removing a device.  After removing the device, dm_hash_remove_all()
    takes _hash_lock and searches the hash from scratch again.
    
    This patch is a preparation for the next patch, which changes device
    deletion code to wait for md reference to be 0.  Without this patch,
    the wait in the next patch may cause AB-BA deadlock:
      CPU0                                CPU1
      -----------------------------------------------------------------------
      dm_hash_remove_all()
        down_write(_hash_lock)
                                          table_status()
                                            md = find_device()
                                                   dm_get(md)
                                                     <increment md->holders>
                                            dm_get_live_or_inactive_table()
                                              dm_get_inactive_table()
                                                down_write(_hash_lock)
        <in the md deletion code>
          <wait for md->holders to be 0>
    Signed-off-by: default avatarKiyoshi Ueda <k-ueda@ct.jp.nec.com>
    Signed-off-by: default avatarJun'ichi Nomura <j-nomura@ce.jp.nec.com>
    Cc: stable@kernel.org
    Signed-off-by: default avatarAlasdair G Kergon <agk@redhat.com>
    98f33285
dm-ioctl.c 34.3 KB