X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/7515e526342f6ee07cbe92f5a458f1c2c4a1fcaf..96cf56ea15a22b8b362aac6c3ab202d2608e9151:/lunaix-os/kernel/block.c diff --git a/lunaix-os/kernel/block.c b/lunaix-os/kernel/block.c index a4c1942..b855910 100644 --- a/lunaix-os/kernel/block.c +++ b/lunaix-os/kernel/block.c @@ -39,26 +39,24 @@ block_init() } int -__block_read(struct device* dev, - void* buf, - unsigned int offset, - unsigned int len) +__block_read(struct device* dev, void* buf, size_t offset, size_t len) { int errno; struct block_dev* bdev = (struct block_dev*)dev->underlay; size_t acc_size = 0, rd_size = 0, bsize = bdev->hd_dev->block_size, - rd_block = 0; - void* block = valloc(bsize); + rd_block = offset / bsize, r = offset % bsize; + void* block = vzalloc(bsize); while (acc_size < len) { if (!bdev->hd_dev->ops.read_buffer( - bdev->hd_dev, offset + rd_block, block, bsize)) { + bdev->hd_dev, rd_block, block, bsize)) { errno = ENXIO; goto error; } - rd_size = MIN(len - acc_size, bsize); - memcpy(buf + acc_size, block, rd_size); + rd_size = MIN(len - acc_size, bsize - r); + memcpy(buf + acc_size, block + r, rd_size); acc_size += rd_size; + r = 0; rd_block++; } @@ -71,26 +69,24 @@ error: } int -__block_write(struct device* dev, - void* buf, - unsigned int offset, - unsigned int len) +__block_write(struct device* dev, void* buf, size_t offset, size_t len) { int errno; struct block_dev* bdev = (struct block_dev*)dev->underlay; size_t acc_size = 0, wr_size = 0, bsize = bdev->hd_dev->block_size, - wr_block = 0; - void* block = valloc(bsize); + wr_block = offset / bsize, r = offset % bsize; + void* block = vzalloc(bsize); while (acc_size < len) { - wr_size = MIN(len - acc_size, bsize); - memcpy(block, buf + acc_size, wr_size); + wr_size = MIN(len - acc_size, bsize - r); + memcpy(block + r, buf + acc_size, wr_size); if (!bdev->hd_dev->ops.write_buffer( - bdev->hd_dev, offset + wr_block, block, bsize)) { + bdev->hd_dev, wr_block, block, bsize)) { errno = ENXIO; break; } acc_size += wr_size; + r = 0; wr_block++; } @@ -132,7 +128,7 @@ __block_register(struct block_dev* bdev) return 0; } - struct device* dev = device_add(NULL, bdev, "sd%c", 'a' + free_slot); + struct device* dev = device_addvol(NULL, bdev, "sd%c", 'a' + free_slot); dev->write = __block_write; dev->read = __block_read;