- io->i_bn = fsbtodb(io->i_offset/(off_t)BSIZE);
- if (io->i_flgs&F_FILE)
- io->i_bn = fsbtodb(sbmap(io, dbtofsb(io->i_bn))) + io->i_boff;
+ if ((io->i_flgs & F_FILE) != 0) {
+ diff = io->i_ino.i_size - io->i_offset;
+ if (diff <= 0)
+ return (-1);
+ fs = &io->i_fs;
+ lbn = lblkno(fs, io->i_offset);
+ io->i_bn = fsbtodb(fs, sbmap(io, lbn)) + io->i_boff;
+ off = blkoff(fs, io->i_offset);
+ size = blksize(fs, &io->i_ino, lbn);
+ } else {
+ io->i_bn = io->i_offset / DEV_BSIZE;
+ off = 0;
+ size = DEV_BSIZE;
+ }