Blob Blame History Raw
From c9605484d165d2b707f78eef14a224b0b47ba322 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Mon, 6 Apr 2020 13:25:43 +0200
Subject: [PATCH 13/16] ucm: fix the device remove operation

- allow to remove device only from conflicting lists
- unify the error codes when the device is not found (ENODEV)

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
 src/ucm/utils.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/src/ucm/utils.c b/src/ucm/utils.c
index 50b2a1df4a6a..d78ba91c3844 100644
--- a/src/ucm/utils.c
+++ b/src/ucm/utils.c
@@ -371,7 +371,7 @@ int uc_mgr_rename_in_dev_list(struct dev_list *dev_list, const char *src,
 			return 0;
 		}
 	}
-	return -ENOENT;
+	return -ENODEV;
 }
 
 int uc_mgr_remove_from_dev_list(struct dev_list *dev_list, const char *name)
@@ -528,17 +528,22 @@ int uc_mgr_remove_device(struct use_case_verb *verb, const char *name)
 {
 	struct use_case_device *device;
 	struct list_head *pos, *npos;
+	int err, found = 0;
 
 	list_for_each_safe(pos, npos, &verb->device_list) {
 		device = list_entry(pos, struct use_case_device, list);
 		if (strcmp(device->name, name) == 0) {
 			uc_mgr_free_device(device);
+			found++;
 			continue;
 		}
-		uc_mgr_remove_from_dev_list(&device->dev_list, name);
-		return 0;
+		err = uc_mgr_remove_from_dev_list(&device->dev_list, name);
+		if (err < 0 && err != -ENODEV)
+			return err;
+		if (err == 0)
+			found++;
 	}
-	return -ENOENT;
+	return found == 0 ? -ENODEV : 0;
 }
 
 void uc_mgr_free_verb(snd_use_case_mgr_t *uc_mgr)
-- 
2.16.4