as-iosched: fix double locking bug in as_merged_requests()
If the two requests belong to the same io context, we will attempt to lock the same lock twice. But swapping contexts is pointless in that case, so just check for rioc == nioc before doing the double lock and copy. Tested-by: Olof Johansson <olof@lixom.net> Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
This commit is contained in:
parent
5b10ca19ea
commit
149a051f82
|
@ -1275,9 +1275,13 @@ static void as_merged_requests(struct request_queue *q, struct request *req,
|
|||
* Don't copy here but swap, because when anext is
|
||||
* removed below, it must contain the unused context
|
||||
*/
|
||||
double_spin_lock(&rioc->lock, &nioc->lock, rioc < nioc);
|
||||
swap_io_context(&rioc, &nioc);
|
||||
double_spin_unlock(&rioc->lock, &nioc->lock, rioc < nioc);
|
||||
if (rioc != nioc) {
|
||||
double_spin_lock(&rioc->lock, &nioc->lock,
|
||||
rioc < nioc);
|
||||
swap_io_context(&rioc, &nioc);
|
||||
double_spin_unlock(&rioc->lock, &nioc->lock,
|
||||
rioc < nioc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user