void
block_init()
{
+ blkio_init();
lbd_pile = cake_new_pile("block_dev", sizeof(struct block_dev), 1, 0);
dev_registry = vcalloc(sizeof(struct block_dev*), MAX_DEV);
free_slot = 0;
size_t bsize = bdev->blk_size, rd_block = offset / bsize,
r = offset % bsize, rd_size = 0;
+ if (!(len = MIN(len, ((size_t)bdev->end_lba - rd_block + 1) * bsize))) {
+ return 0;
+ }
+
struct vecbuf* vbuf = vbuf_alloc(NULL, buf, len);
struct blkio_req* req;
void* tmp_buf = NULL;
req = blkio_vrd(vbuf, rd_block, NULL, NULL, 0);
blkio_commit(bdev->blkio, req);
- wait_if(req->flags & BLKIO_PENDING);
+
+ pwait(&req->wait);
if (!(errno = req->errcode)) {
memcpy(buf, tmp_buf + r, rd_size);
+ errno = len;
+ } else {
+ errno = -errno;
}
if (tmp_buf) {
size_t bsize = bdev->blk_size, rd_block = offset / bsize,
r = offset % bsize;
+ if (!(len = MIN(len, ((size_t)bdev->end_lba - rd_block + 1) * bsize))) {
+ return 0;
+ }
+
struct vecbuf* vbuf = vbuf_alloc(NULL, buf, len);
struct blkio_req* req;
void* tmp_buf = NULL;
req = blkio_vwr(vbuf, rd_block, NULL, NULL, 0);
blkio_commit(bdev->blkio, req);
- wait_if(req->flags & BLKIO_PENDING);
+
+ pwait(&req->wait);
int errno = req->errcode;
+ if (!errno) {
+ errno = len;
+ } else {
+ errno = -errno;
+ }
if (tmp_buf) {
vfree(tmp_buf);
block_alloc_dev(const char* blk_id, void* driver, req_handler ioreq_handler)
{
struct block_dev* bdev = cake_grab(lbd_pile);
- *bdev = (struct block_dev){ .driver = driver };
+ memset(bdev, 0, sizeof(struct block_dev));
strncpy(bdev->name, blk_id, PARTITION_NAME_SIZE);
bdev->blkio = blkio_newctx(ioreq_handler);
+ bdev->driver = driver;
+ bdev->blkio->driver = driver;
return bdev;
}