• Mikulas Patocka's avatar
    dm: allocate a special workqueue for deferred device removal · acfe0ad7
    Mikulas Patocka authored
    The commit 2c140a24 ("dm: allow remove to be deferred") introduced a
    deferred removal feature for the device mapper.  When this feature is
    used (by passing a flag DM_DEFERRED_REMOVE to DM_DEV_REMOVE_CMD ioctl)
    and the user tries to remove a device that is currently in use, the
    device will be removed automatically in the future when the last user
    closes it.
    
    Device mapper used the system workqueue to perform deferred removals.
    However, some targets (dm-raid1, dm-mpath, dm-stripe) flush work items
    scheduled for the system workqueue from their destructor.  If the
    destructor itself is called from the system workqueue during deferred
    removal, it introduces a possible deadlock - the workqueue tries to flush
    itself.
    
    Fix this possible deadlock by introducing a new workqueue for deferred
    removals.  We allocate just one workqueue for all dm targets.  The
    ability of dm targets to process IOs isn't dependent on deferred removal
    of unused targets, so a deadlock due to shared workqueue isn't possible.
    
    Also, cleanup local_init() to eliminate potential for returning success
    on failure.
    Signed-off-by: default avatarMikulas Patocka <mpatocka@redhat.com>
    Signed-off-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
    Cc: stable@vger.kernel.org # 3.13+
    acfe0ad7
dm.c 66.8 KB