commit f758caf57c12fcbdad37798717a2a0655a139787
Author: Dave Reisner <dreisner@archlinux.org>
Date:   Wed Mar 14 22:15:21 2012 -0400

    modprobe: fix error path in removing modules
    
    We really haven't paid this code much attention, and it's somewhat
    evident in our divergence in behavior from module-init-tools. This patch
    asserts the following behavior on exit:
    
    * modprobe -r realmod_notloaded => exit zero
    * modprobe -r --first-time realmod_notloaded => exit non-zero
    * modprobe -r bogusmod => exit non-zero

diff --git a/tools/kmod-modprobe.c b/tools/kmod-modprobe.c
index 55f3795..996a919 100644
--- a/tools/kmod-modprobe.c
+++ b/tools/kmod-modprobe.c
@@ -412,22 +412,17 @@ static int rmmod_do_module(struct kmod_module *mod, bool do_dependencies)
 		int state = kmod_module_get_initstate(mod);
 
 		if (state < 0) {
-			LOG ("Module %s not found.\n", modname);
-			err = -ENOENT;
-			goto error;
-		} else if (state == KMOD_MODULE_BUILTIN) {
-			LOG("Module %s is builtin.\n", modname);
-			err = -ENOENT;
-			goto error;
-		} else if (state != KMOD_MODULE_LIVE) {
 			if (first_time) {
 				LOG("Module %s is not in kernel.\n", modname);
 				err = -ENOENT;
-				goto error;
 			} else {
 				err = 0;
-				goto error;
 			}
+			goto error;
+		} else if (state == KMOD_MODULE_BUILTIN) {
+			LOG("Module %s is builtin.\n", modname);
+			err = -ENOENT;
+			goto error;
 		}
 	}
 
@@ -479,8 +474,10 @@ static int rmmod(struct kmod_ctx *ctx, const char *alias)
 	if (err < 0)
 		return err;
 
-	if (list == NULL)
+	if (list == NULL) {
 		LOG("Module %s not found.\n", alias);
+		err = -ENOENT;
+	}
 
 	kmod_list_foreach(l, list) {
 		struct kmod_module *mod = kmod_module_get_module(l);
