Currently, check_module_inuse returns a wrong user message
if the kernel is built without module unloading support.
Fix it by returning a more specific error, in case 'refcnt'
attribute is missing.
static int check_module_inuse(struct kmod_module *mod) {
struct kmod_list *holders;
- int state;
+ int state, ret;
state = kmod_module_get_initstate(mod);
return -EBUSY;
}
- if (kmod_module_get_refcnt(mod) != 0) {
+ ret = kmod_module_get_refcnt(mod);
+ if (ret > 0) {
ERR("Module %s is in use\n", kmod_module_get_name(mod));
return -EBUSY;
+ } else if (ret == -ENOENT) {
+ ERR("Module unloading is not supported\n");
}
- return 0;
+ return ret;
}
static int do_remove(int argc, char *argv[])
static int check_module_inuse(struct kmod_module *mod) {
struct kmod_list *holders;
- int state;
+ int state, ret;
state = kmod_module_get_initstate(mod);
return -EBUSY;
}
- if (kmod_module_get_refcnt(mod) != 0) {
+ ret = kmod_module_get_refcnt(mod);
+ if (ret > 0) {
ERR("Module %s is in use\n", kmod_module_get_name(mod));
return -EBUSY;
+ } else if (ret == -ENOENT) {
+ ERR("Module unloading is not supported\n");
}
- return 0;
+ return ret;
}
static int do_rmmod(int argc, char *argv[])