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

Commit 7bc9fdda authored by Tejun Heo's avatar Tejun Heo Committed by Jens Axboe
Browse files

lguest: replace VIRTIO_F_BARRIER support with VIRTIO_F_FLUSH support



VIRTIO_F_BARRIER is deprecated.  Replace it with VIRTIO_F_FLUSH
support.

Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Cc: Christoph Hellwig <hch@lst.de>
Signed-off-by: default avatarJens Axboe <jaxboe@fusionio.com>
parent 02c42b7a
Loading
Loading
Loading
Loading
+9 −20
Original line number Original line Diff line number Diff line
@@ -1638,15 +1638,6 @@ static void blk_request(struct virtqueue *vq)
	 */
	 */
	off = out->sector * 512;
	off = out->sector * 512;


	/*
	 * The block device implements "barriers", where the Guest indicates
	 * that it wants all previous writes to occur before this write.  We
	 * don't have a way of asking our kernel to do a barrier, so we just
	 * synchronize all the data in the file.  Pretty poor, no?
	 */
	if (out->type & VIRTIO_BLK_T_BARRIER)
		fdatasync(vblk->fd);

	/*
	/*
	 * In general the virtio block driver is allowed to try SCSI commands.
	 * In general the virtio block driver is allowed to try SCSI commands.
	 * It'd be nice if we supported eject, for example, but we don't.
	 * It'd be nice if we supported eject, for example, but we don't.
@@ -1679,6 +1670,13 @@ static void blk_request(struct virtqueue *vq)
			/* Die, bad Guest, die. */
			/* Die, bad Guest, die. */
			errx(1, "Write past end %llu+%u", off, ret);
			errx(1, "Write past end %llu+%u", off, ret);
		}
		}

		wlen = sizeof(*in);
		*in = (ret >= 0 ? VIRTIO_BLK_S_OK : VIRTIO_BLK_S_IOERR);
	} else if (out->type & VIRTIO_BLK_T_FLUSH) {
		/* Flush */
		ret = fdatasync(vblk->fd);
		verbose("FLUSH fdatasync: %i\n", ret);
		wlen = sizeof(*in);
		wlen = sizeof(*in);
		*in = (ret >= 0 ? VIRTIO_BLK_S_OK : VIRTIO_BLK_S_IOERR);
		*in = (ret >= 0 ? VIRTIO_BLK_S_OK : VIRTIO_BLK_S_IOERR);
	} else {
	} else {
@@ -1702,15 +1700,6 @@ static void blk_request(struct virtqueue *vq)
		}
		}
	}
	}


	/*
	 * OK, so we noted that it was pretty poor to use an fdatasync as a
	 * barrier.  But Christoph Hellwig points out that we need a sync
	 * *afterwards* as well: "Barriers specify no reordering to the front
	 * or the back."  And Jens Axboe confirmed it, so here we are:
	 */
	if (out->type & VIRTIO_BLK_T_BARRIER)
		fdatasync(vblk->fd);

	/* Finished that request. */
	/* Finished that request. */
	add_used(vq, head, wlen);
	add_used(vq, head, wlen);
}
}
@@ -1735,8 +1724,8 @@ static void setup_block_file(const char *filename)
	vblk->fd = open_or_die(filename, O_RDWR|O_LARGEFILE);
	vblk->fd = open_or_die(filename, O_RDWR|O_LARGEFILE);
	vblk->len = lseek64(vblk->fd, 0, SEEK_END);
	vblk->len = lseek64(vblk->fd, 0, SEEK_END);


	/* We support barriers. */
	/* We support FLUSH. */
	add_feature(dev, VIRTIO_BLK_F_BARRIER);
	add_feature(dev, VIRTIO_BLK_F_FLUSH);


	/* Tell Guest how many sectors this device has. */
	/* Tell Guest how many sectors this device has. */
	conf.capacity = cpu_to_le64(vblk->len / 512);
	conf.capacity = cpu_to_le64(vblk->len / 512);