• Logan Gunthorpe's avatar
    md/raid5: Ensure batch_last is released before sleeping for quiesce · 20313b1b
    Logan Gunthorpe authored
    A race condition exists where if raid5_quiesce() is called in the
    middle of a request that has set batch_last, it will deadlock.
    
    batch_last will hold a reference to a stripe when raid5_quiesce() is
    called. This will cause the next raid5_get_active_stripe() call to
    sleep waiting for the quiesce to finish, but the raid5_quiesce() thread
    will wait for active_stripes to go to zero which will never happen
    because request thread is waiting for the quiesce to stop.
    
    Fix this by creating a special __raid5_get_active_stripe() function
    which takes the request context and clears the last_batch before
    sleeping.
    
    While we're at it, change the arguments of raid5_get_active_stripe()
    to bools.
    
    Fixes: 3312e6c8 ("md/raid5: Keep a reference to last stripe_head for batch")
    Reported-by: default avatarDavid Sloan <David.Sloan@eideticom.com>
    Signed-off-by: default avatarLogan Gunthorpe <logang@deltatee.com>
    Signed-off-by: default avatarSong Liu <song@kernel.org>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    20313b1b
raid5.h 29.2 KB