Subject: Re: silly question for the day - pwrite on raw disk device.
To: Simon Burge <simonb@netbsd.org>
From: Jason Thorpe <thorpej@nas.nasa.gov>
List: tech-kern
Date: 10/25/1999 00:17:20
On Mon, 25 Oct 1999 16:59:39 +1000
Simon Burge <simonb@netbsd.org> wrote:
> Time for hopefully what will be a silly question. I'm playing around
> with an installboot for the pmax. The standard pmax boot block
> structure has 8 bytes of padding at the start, and I wanted to remove
> the padding just write the data into the right position on the disk.
> I've got the following to write the new bootblock info (from a modified
> Alpha installboot):
>
> rv = pwrite(diskfd, &bb, sizeof bb, BOOT_BLOCK_OFFSET);
>
> where BOOT_BLOCK_OFFSET = 8. Using either that or
>
> lseek(diskfd, BOOT_BLOCK_OFFSET, SEEK_SET);
> rv = write(diskfd, &bb, sizeof bb);
>
> both result in the bb structure written to the _start_ of the disk, not
> 8 bytes into the first sector.
Well, it *should* return EINVAL -- certainly, the MI SCSI disk driver
would do so (dunno about the pmax `rz' driver; haven't looked at the
code).
When you're operating on the character device of a disk, all I/O must
be block-aligned and an even multiple of the block size.
Probably the rz driver is just "rounding down" to a block boundary, probably
implicitly due to a bytes-to-block shifting macro.
-- Jason R. Thorpe <thorpej@nas.nasa.gov>