Implement function to remove module
diff --git a/libkmod/libkmod-loaded.c b/libkmod/libkmod-loaded.c
index 7d0e963..af55386 100644
--- a/libkmod/libkmod-loaded.c
+++ b/libkmod/libkmod-loaded.c
@@ -226,3 +226,36 @@
 
 	return 0;
 }
+
+extern long delete_module(const char *name, unsigned int flags);
+
+KMOD_EXPORT int kmod_loaded_remove_module(struct kmod_loaded *mod,
+						struct kmod_list *entry,
+						unsigned int flags)
+{
+	struct kmod_loaded_module *m;
+	int err;
+
+	if (mod == NULL)
+		return -ENOSYS;
+
+	if (entry == NULL)
+		return -ENOENT;
+
+	m = entry->data;
+
+	/* Filter out other flags */
+	flags &= (KMOD_REMOVE_FORCE | KMOD_REMOVE_NOWAIT);
+
+	err = delete_module(m->name, flags);
+	if (err != 0) {
+		err(mod->ctx, "Removing '%s': %s\n", m->name,
+							strerror(-err));
+		return err;
+	}
+
+	loaded_modules_free_module(m);
+	kmod_list_remove(entry);
+
+	return 0;
+}
diff --git a/libkmod/libkmod.h b/libkmod/libkmod.h
index f31820d..3f0b792 100644
--- a/libkmod/libkmod.h
+++ b/libkmod/libkmod.h
@@ -21,6 +21,7 @@
 #ifndef _LIBKMOD_H_
 #define _LIBKMOD_H_
 
+#include <fcntl.h>
 #include <stdarg.h>
 #include <inttypes.h>
 
@@ -74,4 +75,11 @@
 				const char **name, long *size, int *use_count,
 				const char **deps, uintptr_t *addr);
 
+enum KMOD_REMOVE {
+	KMOD_REMOVE_FORCE = O_TRUNC,
+	KMOD_REMOVE_NOWAIT = O_NONBLOCK,
+};
+
+int kmod_loaded_remove_module(struct kmod_loaded *kmod,
+				struct kmod_list *entry, unsigned int flags);
 #endif
diff --git a/libkmod/libkmod.sym b/libkmod/libkmod.sym
index 0482ada..b22312d 100644
--- a/libkmod/libkmod.sym
+++ b/libkmod/libkmod.sym
@@ -15,6 +15,7 @@
 	kmod_loaded_unref;
 	kmod_loaded_get_list;
 	kmod_loaded_get_module_info;
+	kmod_loaded_remove_module;
 local:
         *;
 };