• David Howells's avatar
    afs: Fix cell purging with aliases · 286377f6
    David Howells authored
    When the afs module is removed, one of the things that has to be done is to
    purge the cell database.  afs_cell_purge() cancels the management timer and
    then starts the cell manager work item to do the purging.  This does a
    single run through and then assumes that all cells are now purged - but
    this is no longer the case.
    
    With the introduction of alias detection, a later cell in the database can
    now be holding an active count on an earlier cell (cell->alias_of).  The
    purge scan passes by the earlier cell first, but this can't be got rid of
    until it has discarded the alias.  Ordinarily, afs_unuse_cell() would
    handle this by setting the management timer to trigger another pass - but
    afs_set_cell_timer() doesn't do anything if the namespace is being removed
    (net->live == false).  rmmod then hangs in the wait on cells_outstanding in
    afs_cell_purge().
    
    Fix this by making afs_set_cell_timer() directly queue the cell manager if
    net->live is false.  This causes additional management passes.
    
    Queueing the cell manager increments cells_outstanding to make sure the
    wait won't complete until all cells are destroyed.
    
    Fixes: 8a070a96 ("afs: Detect cell aliases 1 - Cells with root volumes")
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    286377f6
cell.c 21.6 KB