userspace_ctr() takes a reference on the log device with
dm_get_device().  When the integrated-flush workqueue allocation fails it
jumps to the shared error path, which frees the log context without
dropping that reference, so the device stays busy and cannot be removed.

userspace_dtr() drops the reference correctly; do the same here.

Fixes: 5066a4df1f42 ("dm log userspace: allow mark requests to piggyback on 
flush requests")
Signed-off-by: Shao Mingyin <[email protected]>
---
diff --git a/drivers/md/dm-log-userspace-base.c 
b/drivers/md/dm-log-userspace-base.c
index 3ca35aa4e057..267ae428dde4 100644
--- a/drivers/md/dm-log-userspace-base.c
+++ b/drivers/md/dm-log-userspace-base.c
@@ -315,6 +315,8 @@ static int userspace_ctr(struct dm_dirty_log *log, struct 
dm_target *ti,
 out:
        kfree(devices_rdata);
        if (r) {
+               if (lc->log_dev)
+                       dm_put_device(lc->ti, lc->log_dev);
                mempool_exit(&lc->flush_entry_pool);
                kfree(lc);
                kfree(ctr_str);

Reply via email to