- size_t acc_size = 0, rd_size = 0, bsize = bdev->hd_dev->block_size,
- rd_block = offset / bsize, r = offset % bsize,
- max_blk = (size_t)bdev->hd_dev->max_lba;
- void* block = vzalloc(bsize);
-
- while (acc_size < len && rd_block < max_blk) {
- if (!bdev->hd_dev->ops.read_buffer(
- bdev->hd_dev, rd_block, block, bsize)) {
- errno = EIO;
- goto error;
- }
- rd_size = MIN(len - acc_size, bsize - r);
- memcpy(buf + acc_size, block + r, rd_size);
- acc_size += rd_size;
- r = 0;
- rd_block++;
+ 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;