On 13.03.20 г. 21:58 ч., Josef Bacik wrote: > With normal tickets we could have a large reservation at the front of > the list that is unable to be satisfied, but a smaller ticket later on > that can be satisfied. The way we handle this is to run > btrfs_try_granting_tickets() in maybe_fail_all_tickets(). > > However no such protection exists for priority tickets. Fix this by > handling it in handle_reserve_ticket(). If we've returned after > attempting to flush space in a priority related way, we'll still be on > the priority list and need to be removed. > > We rely on the flushing to free up space and wake the ticket, but if > there is not enough space to reclaim _but_ there's enough space in the > space_info to handle subsequent reservations then we would have gotten > an ENOSPC erroneously. > > Address this by catching where we are still on the list, meaning we were > a priority ticket, and removing ourselves and then running > btrfs_try_granting_tickets(). This will handle this particular corner > case. > > Signed-off-by: Josef Bacik <josef@xxxxxxxxxxxxxx> Reviewed-by: Nikolay Borisov <nborisov@xxxxxxxx>
