Skip to content
  • Al Viro's avatar
    [PATCH] allow delayed freeing of ctl_table_header · f7e6ced4
    Al Viro authored
    
    
    Refcount the sucker; instead of freeing it by the end of unregistration
    just drop the refcount and free only when it hits zero.  Make sure that
    we _always_ make ->unregistering non-NULL in start_unregistering().
    
    That allows anybody to get a reference to such puppy, preventing its
    freeing and reuse.  It does *not* block unregistration.  Anybody who
    holds such a reference can
    	* try to grab a "use" reference (ctl_head_grab()); that will
    succeeds if and only if it hadn't entered unregistration yet.  If it
    succeeds, we can use it in all normal ways until we release the "use"
    reference (with ctl_head_finish()).  Note that this relies on having
    ->unregistering become non-NULL in all cases when one starts to unregister
    the sucker.
    	* keep pointers to ctl_table entries; they *can* be freed if
    the entire thing is unregistered.  However, if ctl_head_grab() succeeds,
    we know that unregistration had not happened (and will not happen until
    ctl_head_finish()) and such pointers can be used safely.
    
    IOW, now we can have inodes under /proc/sys keep references to ctl_table
    entries, protecting them with references to ctl_table_header and
    grabbing the latter for the duration of operations that require access
    to ctl_table.  That won't cause deadlocks, since unregistration will not
    be stopped by mere keeping a reference to ctl_table_header.
    
    Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
    f7e6ced4