On Mon, Oct 12, 2020 at 11:47 AM Bakul Shah wrote: > On Oct 12, 2020, at 9:57 AM, Arthur Krewat wrote: > > > > On 10/11/2020 9:56 PM, Warner Losh wrote: > >> unaligned I/O on the block device > > Sorry, I have to laugh... isn't that an oxymoron? ;) > > Actually there are no *block* devices in FreeBSD. > And while raw device files such as /dev/r > no longer exist, it is the block devices (with > their buffering etc.) that are gone. Only raw devices > exist now. > There's still the buffer cache that does do buffering on the devices... but it's a different kind of buffering than traditional kernels. but you're right, only the cdevs are plumbed down, not the bdevs. > And FreeBSD raw disk device drivers don't allow > unaligned I/O access. Nor should they paper over > what is not allowed by the underlying device. Try > > #include > #include > #include > > unsigned char buf[1024]; > > int main(int c, char**v) { > char* a = c > 1? v[1] : "1"; > off_t off = (off_t)strtoull(a, 0, 0); > ssize_t r = pread(0, buf, sizeof buf, off); > if (r < 0) { perror("read"); return 1; } > for (int i = 0; i < 4; i++) printf(" %02x", buf[i]); > printf("\n"); > return 0; > } > I meant something different about 'unaligned' access. I mean that the buffers you read the data into needn't be page aligned. That causes a fair amount of hair in the lower layers where I spend much of my time... You are correct you have to read them on an LBA boundary. Warner