• Al Viro's avatar
    cgroup: saner refcounting for cgroup_root · 35ac1184
    Al Viro authored
    * make the reference from superblock to cgroup_root counting -
    do cgroup_put() in cgroup_kill_sb() whether we'd done
    percpu_ref_kill() or not; matching grab is done when we allocate
    a new root.  That gives the same refcounting rules for all callers
    of cgroup_do_mount() - a reference to cgroup_root has been grabbed
    by caller and it either is transferred to new superblock or dropped.
    
    * have cgroup_kill_sb() treat an already killed refcount as "just
    don't bother killing it, then".
    
    * after successful cgroup_do_mount() have cgroup1_mount() recheck
    if we'd raced with mount/umount from somebody else and cgroup_root
    got killed.  In that case we drop the superblock and bugger off
    with -ERESTARTSYS, same as if we'd found it in the list already
    dying.
    
    * don't bother with delayed initialization of refcount - it's
    unreliable and not needed.  No need to prevent attempts to bump
    the refcount if we find cgroup_root of another mount in progress -
    sget will reuse an existing superblock just fine and if the
    other sb manages to die before we get there, we'll catch
    that immediately after cgroup_do_mount().
    
    * don't bother with kernfs_pin_sb() - no need for doing that
    either.
    Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
    35ac1184
cgroup.c 160 KB