|
@@ -160,7 +160,6 @@ typedef struct BDRVRawState {
|
|
|
bool has_write_zeroes:1;
|
|
|
bool use_linux_aio:1;
|
|
|
bool use_linux_io_uring:1;
|
|
|
- int64_t *offset; /* offset of zone append operation */
|
|
|
int page_cache_inconsistent; /* errno from fdatasync failure */
|
|
|
bool has_fallocate;
|
|
|
bool needs_alignment;
|
|
@@ -2445,12 +2444,13 @@ static bool bdrv_qiov_is_aligned(BlockDriverState *bs, QEMUIOVector *qiov)
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
-static int coroutine_fn raw_co_prw(BlockDriverState *bs, uint64_t offset,
|
|
|
+static int coroutine_fn raw_co_prw(BlockDriverState *bs, int64_t *offset_ptr,
|
|
|
uint64_t bytes, QEMUIOVector *qiov, int type)
|
|
|
{
|
|
|
BDRVRawState *s = bs->opaque;
|
|
|
RawPosixAIOData acb;
|
|
|
int ret;
|
|
|
+ uint64_t offset = *offset_ptr;
|
|
|
|
|
|
if (fd_open(bs) < 0)
|
|
|
return -EIO;
|
|
@@ -2513,8 +2513,8 @@ out:
|
|
|
uint64_t *wp = &wps->wp[offset / bs->bl.zone_size];
|
|
|
if (!BDRV_ZT_IS_CONV(*wp)) {
|
|
|
if (type & QEMU_AIO_ZONE_APPEND) {
|
|
|
- *s->offset = *wp;
|
|
|
- trace_zbd_zone_append_complete(bs, *s->offset
|
|
|
+ *offset_ptr = *wp;
|
|
|
+ trace_zbd_zone_append_complete(bs, *offset_ptr
|
|
|
>> BDRV_SECTOR_BITS);
|
|
|
}
|
|
|
/* Advance the wp if needed */
|
|
@@ -2523,7 +2523,10 @@ out:
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
- update_zones_wp(bs, s->fd, 0, 1);
|
|
|
+ /*
|
|
|
+ * write and append write are not allowed to cross zone boundaries
|
|
|
+ */
|
|
|
+ update_zones_wp(bs, s->fd, offset, 1);
|
|
|
}
|
|
|
|
|
|
qemu_co_mutex_unlock(&wps->colock);
|
|
@@ -2536,14 +2539,14 @@ static int coroutine_fn raw_co_preadv(BlockDriverState *bs, int64_t offset,
|
|
|
int64_t bytes, QEMUIOVector *qiov,
|
|
|
BdrvRequestFlags flags)
|
|
|
{
|
|
|
- return raw_co_prw(bs, offset, bytes, qiov, QEMU_AIO_READ);
|
|
|
+ return raw_co_prw(bs, &offset, bytes, qiov, QEMU_AIO_READ);
|
|
|
}
|
|
|
|
|
|
static int coroutine_fn raw_co_pwritev(BlockDriverState *bs, int64_t offset,
|
|
|
int64_t bytes, QEMUIOVector *qiov,
|
|
|
BdrvRequestFlags flags)
|
|
|
{
|
|
|
- return raw_co_prw(bs, offset, bytes, qiov, QEMU_AIO_WRITE);
|
|
|
+ return raw_co_prw(bs, &offset, bytes, qiov, QEMU_AIO_WRITE);
|
|
|
}
|
|
|
|
|
|
static int coroutine_fn raw_co_flush_to_disk(BlockDriverState *bs)
|
|
@@ -3470,7 +3473,7 @@ static int coroutine_fn raw_co_zone_mgmt(BlockDriverState *bs, BlockZoneOp op,
|
|
|
len >> BDRV_SECTOR_BITS);
|
|
|
ret = raw_thread_pool_submit(handle_aiocb_zone_mgmt, &acb);
|
|
|
if (ret != 0) {
|
|
|
- update_zones_wp(bs, s->fd, offset, i);
|
|
|
+ update_zones_wp(bs, s->fd, offset, nrz);
|
|
|
error_report("ioctl %s failed %d", op_name, ret);
|
|
|
return ret;
|
|
|
}
|
|
@@ -3506,8 +3509,6 @@ static int coroutine_fn raw_co_zone_append(BlockDriverState *bs,
|
|
|
int64_t zone_size_mask = bs->bl.zone_size - 1;
|
|
|
int64_t iov_len = 0;
|
|
|
int64_t len = 0;
|
|
|
- BDRVRawState *s = bs->opaque;
|
|
|
- s->offset = offset;
|
|
|
|
|
|
if (*offset & zone_size_mask) {
|
|
|
error_report("sector offset %" PRId64 " is not aligned to zone size "
|
|
@@ -3528,7 +3529,7 @@ static int coroutine_fn raw_co_zone_append(BlockDriverState *bs,
|
|
|
}
|
|
|
|
|
|
trace_zbd_zone_append(bs, *offset >> BDRV_SECTOR_BITS);
|
|
|
- return raw_co_prw(bs, *offset, len, qiov, QEMU_AIO_ZONE_APPEND);
|
|
|
+ return raw_co_prw(bs, offset, len, qiov, QEMU_AIO_ZONE_APPEND);
|
|
|
}
|
|
|
#endif
|
|
|
|