• Tejun Heo's avatar
    klist: don't iterate over deleted entries · a1ed5b0c
    Tejun Heo authored
    A klist entry is kept on the list till all its current iterations are
    finished; however, a new iteration after deletion also iterates over
    deleted entries as long as their reference count stays above zero.
    This causes problems for cases where there are users which iterate
    over the list while synchronized against list manipulations and
    natuarally expect already deleted entries to not show up during
    iteration.
    
    This patch implements dead flag which gets set on deletion so that
    iteration can skip already deleted entries.  The dead flag piggy backs
    on the lowest bit of knode->n_klist and only visible to klist
    implementation proper.
    
    While at it, drop klist_iter->i_head as it's redundant and doesn't
    offer anything in semantics or performance wise as klist_iter->i_klist
    is dereferenced on every iteration anyway.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Cc: Greg Kroah-Hartman <gregkh@suse.de>
    Cc: Alan Stern <stern@rowland.harvard.edu>
    Cc: Jens Axboe <jens.axboe@oracle.com>
    Signed-off-by: default avatarJens Axboe <jens.axboe@oracle.com>
    a1ed5b0c
klist.c 8.58 KB