]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
scsi: scsi_debug: Fix create target debugfs failure
authorMing Lei <ming.lei@redhat.com>
Wed, 19 Jun 2024 01:38:03 +0000 (09:38 +0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 26 Jun 2024 02:12:50 +0000 (22:12 -0400)
Target debugfs entry is removed via async_schedule() which isn't drained
when adding same name target, so failure of "Directory 'target11:0:0' with
parent 'scsi_debug' already present!" can be triggered easily.

Fix it by switching to domain async schedule, and draining it before
adding new target debugfs entry.

Cc: Wenchao Hao <haowenchao2@huawei.com>
Fixes: f084fe52c640 ("scsi: scsi_debug: Add debugfs interface to fail target reset")
Signed-off-by: Ming Lei <ming.lei@redhat.com>
Acked-by: Wenchao Hao <haowenchao22@gmail.com>
Link: https://lore.kernel.org/r/20240619013803.3008857-1-ming.lei@redhat.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/scsi_debug.c

index acf0592d63dae44f13ca9772a3938d08a136ef91..91f022fb8d0ce4b8472e2b281d3b94b68c8374e9 100644 (file)
@@ -926,6 +926,7 @@ static const int device_qfull_result =
 static const int condition_met_result = SAM_STAT_CONDITION_MET;
 
 static struct dentry *sdebug_debugfs_root;
+static ASYNC_DOMAIN_EXCLUSIVE(sdebug_async_domain);
 
 static void sdebug_err_free(struct rcu_head *head)
 {
@@ -1148,6 +1149,8 @@ static int sdebug_target_alloc(struct scsi_target *starget)
        if (!targetip)
                return -ENOMEM;
 
+       async_synchronize_full_domain(&sdebug_async_domain);
+
        targetip->debugfs_entry = debugfs_create_dir(dev_name(&starget->dev),
                                sdebug_debugfs_root);
 
@@ -1174,7 +1177,8 @@ static void sdebug_target_destroy(struct scsi_target *starget)
        targetip = (struct sdebug_target_info *)starget->hostdata;
        if (targetip) {
                starget->hostdata = NULL;
-               async_schedule(sdebug_tartget_cleanup_async, targetip);
+               async_schedule_domain(sdebug_tartget_cleanup_async, targetip,
+                               &sdebug_async_domain);
        }
 }