/* A thread should never lock zones outside its working area. */
assert(f->min_zone <= nz && nz < f->max_zone);
+ assert(z->has_wp);
+
/*
* Lock the io_u target zone. The zone will be unlocked if io_u offset
* is changed or when io_u completes and zbd_put_io() executed.
{
int ret;
+ assert(z->has_wp);
ret = pthread_mutex_unlock(&z->mutex);
assert(!ret);
}
assert(zone_idx < zbd_info->nr_zones);
z = get_zone(f, zone_idx);
- if (!z->has_wp)
- return;
+ assert(z->has_wp);
if (!success)
goto unlock;
assert(zone_idx < zbd_info->nr_zones);
z = get_zone(f, zone_idx);
- if (!z->has_wp)
- return;
+ assert(z->has_wp);
dprint(FD_ZBD,
"%s: terminate I/O (%lld, %llu) for zone %u\n",
io_u->offset = zb->start +
((io_u->offset - orig_zb->start) %
(range - io_u->buflen)) / min_bs * min_bs;
+ /*
+ * When zbd_find_zone() returns a conventional zone,
+ * we can simply accept the new i/o offset here.
+ */
+ if (!zb->has_wp)
+ return io_u_accept;
/*
* Make sure the I/O does not cross over the zone wp position.
*/
assert(false);
accept:
- assert(zb);
+ assert(zb->has_wp);
assert(zb->cond != ZBD_ZONE_COND_OFFLINE);
assert(!io_u->zbd_queue_io);
assert(!io_u->zbd_put_io);
return io_u_accept;
eof:
- if (zb)
+ if (zb && zb->has_wp)
zone_unlock(zb);
return io_u_eof;
}