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

Commit a9b54bb9 authored by Bob Liu's avatar Bob Liu Committed by Konrad Rzeszutek Wilk
Browse files

drivers: xen-blkfront: only talk_to_blkback() when in XenbusStateInitialising



Patch 69b91ede
"drivers: xen-blkback: delay pending_req allocation to connect_ring"
exposed an problem that Xen blkfront has. There is a race
with XenStored and the drivers such that we can see two:

vbd vbd-268440320: blkfront:blkback_changed to state 2.
vbd vbd-268440320: blkfront:blkback_changed to state 2.
vbd vbd-268440320: blkfront:blkback_changed to state 4.

state changes to XenbusStateInitWait ('2'). The end result is that
blkback_changed() receives two notify and calls twice setup_blkring().

While the backend driver may only get the first setup_blkring() which is
wrong and reads out-dated (or reads them as they are being updated
with new ring-ref values).

The end result is that the ring ends up being incorrectly set.

The other drivers in the tree have such checks already in.

Reported-and-Tested-by: default avatarRobert Butera <robert.butera@oracle.com>
Signed-off-by: default avatarBob Liu <bob.liu@oracle.com>
Signed-off-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
parent 86839c56
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -1951,6 +1951,8 @@ static void blkback_changed(struct xenbus_device *dev,

	switch (backend_state) {
	case XenbusStateInitWait:
		if (dev->state != XenbusStateInitialising)
			break;
		if (talk_to_blkback(dev, info)) {
			kfree(info);
			dev_set_drvdata(&dev->dev, NULL);