]> git.ipfire.org Git - thirdparty/kmod.git/commitdiff
libkmod: Allow to ignore log message on module removal
authorLucas De Marchi <lucas.de.marchi@gmail.com>
Fri, 3 Jun 2022 21:50:41 +0000 (14:50 -0700)
committerLucas De Marchi <lucas.de.marchi@gmail.com>
Mon, 27 Jun 2022 06:23:46 +0000 (23:23 -0700)
Caller may want to handle retries, in which case the log message is not
appropriate.

Signed-off-by: Lucas De Marchi <lucas.de.marchi@gmail.com>
libkmod/libkmod-module.c
libkmod/libkmod.h

index efdd679851ce1134e4f7df50cc8073afa33168e2..12d8ed18fff9e520c7a92bb4cf9a016145daa0de 100644 (file)
@@ -823,11 +823,13 @@ extern long delete_module(const char *name, unsigned int flags);
 /**
  * kmod_module_remove_module:
  * @mod: kmod module
- * @flags: flags to pass to Linux kernel when removing the module. The only valid flag is
+ * @flags: flags used when removing the module.
  * KMOD_REMOVE_FORCE: force remove module regardless if it's still in
- * use by a kernel subsystem or other process;
- * KMOD_REMOVE_NOWAIT is always enforced, causing us to pass O_NONBLOCK to
+ * use by a kernel subsystem or other process; passed directly to Linux kernel
+ * KMOD_REMOVE_NOWAIT: is always enforced, causing us to pass O_NONBLOCK to
  * delete_module(2).
+ * KMOD_REMOVE_NOLOG: when module removal fails, do not log anything as the
+ * caller may want to handle retries and log when appropriate.
  *
  * Remove a module from Linux kernel.
  *
@@ -836,6 +838,8 @@ extern long delete_module(const char *name, unsigned int flags);
 KMOD_EXPORT int kmod_module_remove_module(struct kmod_module *mod,
                                                        unsigned int flags)
 {
+       unsigned int libkmod_flags = flags & 0xff;
+
        int err;
 
        if (mod == NULL)
@@ -848,7 +852,8 @@ KMOD_EXPORT int kmod_module_remove_module(struct kmod_module *mod,
        err = delete_module(mod->name, flags);
        if (err != 0) {
                err = -errno;
-               ERR(mod->ctx, "could not remove '%s': %m\n", mod->name);
+               if (!(libkmod_flags & KMOD_REMOVE_NOLOG))
+                       ERR(mod->ctx, "could not remove '%s': %m\n", mod->name);
        }
 
        return err;
index fed216b4425f5c6b2eee6233a35387b84efa6e5a..7251aa7286dd969fe151c7199070bf33a011e45f 100644 (file)
@@ -145,6 +145,8 @@ struct kmod_module *kmod_module_get_module(const struct kmod_list *entry);
 enum kmod_remove {
        KMOD_REMOVE_FORCE = O_TRUNC,
        KMOD_REMOVE_NOWAIT = O_NONBLOCK, /* always set */
+       /* libkmod-only defines, not passed to kernel */
+       KMOD_REMOVE_NOLOG = 1,
 };
 
 /* Insertion flags */