- block_idx_t id = (fd)->seek_pos / fb->b->blk_size; \
- size_t offset = (fd)->seek_pos % fb->b->blk_size; \
- size_t len = kblock_##dir(fb->b, id, buf, offset, size); \
- (fd)->seek_pos += len; \
+ size_t len = 0; \
+ while (size) \
+ { \
+ block_idx_t id = (fd)->seek_pos / fb->blk->blk_size; \
+ size_t offset = (fd)->seek_pos % fb->blk->blk_size; \
+ size_t count = MIN(size, (size_t)(fb->blk->blk_size - offset)); \
+ size_t ret_len = kblock_##dir(fb->blk, id, buf, offset, count); \
+ size -= ret_len; \
+ (fd)->seek_pos += ret_len; \
+ buf = buf + ret_len; \
+ len += ret_len; \
+ if (ret_len != count) \
+ break; \
+ } \