Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 149a051f authored by Jens Axboe's avatar Jens Axboe
Browse files

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: default avatarOlof Johansson <olof@lixom.net>
Signed-off-by: default avatarJens Axboe <jens.axboe@oracle.com>
parent 5b10ca19
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -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);
			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);
				double_spin_unlock(&rioc->lock, &nioc->lock,
								rioc < nioc);
			}
		}
	}