struct most_common {
        struct config_group group;
+       struct module *mod;
        struct configfs_subsystem subsys;
 };
 
                                                 const char *name)
 {
        struct mdev_link *mdev_link;
+       struct most_common *mc = to_most_common(group->cg_subsys);
 
        mdev_link = kzalloc(sizeof(*mdev_link), GFP_KERNEL);
        if (!mdev_link)
                return ERR_PTR(-ENOMEM);
 
+       if (!try_module_get(mc->mod)) {
+               kfree(mdev_link);
+               return ERR_PTR(-ENOLCK);
+       }
        config_item_init_type_name(&mdev_link->item, name,
                                   &mdev_link_type);
 
        .release        = most_common_release,
 };
 
+static void most_common_disconnect(struct config_group *group,
+                                  struct config_item *item)
+{
+       struct most_common *mc = to_most_common(group->cg_subsys);
+
+       module_put(mc->mod);
+}
+
 static struct configfs_group_operations most_common_group_ops = {
        .make_item      = most_common_make_item,
+       .disconnect_notify = most_common_disconnect,
 };
 
 static const struct config_item_type most_common_type = {
 struct most_sound {
        struct configfs_subsystem subsys;
        struct list_head soundcard_list;
+       struct module *mod;
 };
 
 static struct config_group *most_sound_make_group(struct config_group *group,
                                                  const char *name)
 {
        struct most_snd_grp *most;
-       struct most_sound *ms = container_of(to_configfs_subsystem(group),
+       struct most_sound *ms = container_of(group->cg_subsys,
                                             struct most_sound, subsys);
 
        list_for_each_entry(most, &ms->soundcard_list, list) {
                        return ERR_PTR(-EPROTO);
                }
        }
+       if (!try_module_get(ms->mod))
+               return ERR_PTR(-ENOLCK);
        most = kzalloc(sizeof(*most), GFP_KERNEL);
-       if (!most)
+       if (!most) {
+               module_put(ms->mod);
                return ERR_PTR(-ENOMEM);
-
+       }
        config_group_init_type_name(&most->group, name, &most_snd_grp_type);
        list_add_tail(&most->list, &ms->soundcard_list);
        return &most->group;
 }
 
+static void most_sound_disconnect(struct config_group *group,
+                                 struct config_item *item)
+{
+       struct most_sound *ms = container_of(group->cg_subsys,
+                                            struct most_sound, subsys);
+       module_put(ms->mod);
+}
+
 static struct configfs_group_operations most_sound_group_ops = {
        .make_group     = most_sound_make_group,
+       .disconnect_notify = most_sound_disconnect,
 };
 
 static const struct config_item_type most_sound_type = {
        int ret;
 
        if (!strcmp(c->name, "cdev")) {
+               most_cdev.mod = c->mod;
                ret = configfs_register_subsystem(&most_cdev.subsys);
        } else if (!strcmp(c->name, "net")) {
+               most_net.mod = c->mod;
                ret = configfs_register_subsystem(&most_net.subsys);
        } else if (!strcmp(c->name, "video")) {
+               most_video.mod = c->mod;
                ret = configfs_register_subsystem(&most_video.subsys);
        } else if (!strcmp(c->name, "sound")) {
+               most_sound_subsys.mod = c->mod;
                ret = configfs_register_subsystem(&most_sound_subsys.subsys);
        } else {
                return -ENODEV;