• Nicholas Bellinger's avatar
    [SCSI] target: Fix top-level configfs_subsystem default_group shutdown breakage · 7c2bf6e9
    Nicholas Bellinger authored
    This patch fixes two bugs uncovered during testing with
    slub_debug=FPUZ during module_exit() -> target_core_exit_configfs()
    with release of configfs subsystem consumer default groups, namely how
    this should be working with
    fs/configfs/dir.c:configfs_unregister_subsystem() release logic for
    struct config_group->default_group.
    
    The first issue involves configfs_unregister_subsystem() expecting to
    walk+drain the top-level subsys->su_group.default_groups directly in
    unlink_group(), and not directly from the configfs subsystem consumer
    for the top level struct config_group->default_groups.  This patch
    drops the walk+drain of subsys->su_group.default_groups from TCM
    configfs subsystem consumer code, and moves the top-level
    ->default_groups kfree() after configfs_unregister_subsystem() has
    been called.
    
    The second issue involves calling
    core_alua_free_lu_gp(se_global->default_lu_gp) to release the
    default_lu_gp->lu_gp_group before configfs_unregister_subsystem() has
    been called.  This patches also moves the core_alua_free_lu_gp() call
    to release default_lu_group->lu_gp_group after the subsys has been
    unregistered.
    
    Finally, this patch explictly clears the
    [lu_gp,alua,hba]_cg->default_groups pointers after kfree() to ensure
    that no stale memory is picked up from child struct
    config_group->default_group[] while configfs_unregister_subsystem() is
    called.
    Reported-by: default avatarFubo Chen <fubo.chen@gmail.com>
    Signed-off-by: default avatarNicholas A. Bellinger <nab@linux-iscsi.org>
    Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
    7c2bf6e9
target_core_configfs.c 87.3 KB