Reading 512 bytes from raw device with 2048 sector size fails. If i read
512 bytes from block device the problem is not reproduced.

How to reproduce.
1. I plugged my iPod Nano (2nd generation) into PC.
Then use the following code to reproduce the issue.

#include <sys/types.h>

#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

int
main(void)
{
        char buf[512];
        ssize_t sz;
        int fd;

        fd = open("/dev/rsd0j", O_RDONLY);
        if (fd == -1)
                err(1, "open");
        sz = read(fd, buf, sizeof(buf));
        if (sz == -1)
                err(1, "read");
        close(fd);
        return (0);
}

2. Another way to reproduce and actually why i spot this problem is fsck.
`fsck /dev/sd0j` on msdos device launches `fsck_msdos /dev/rsd0j`.
If i run fsck_msdos on /dev/sd0j the problem is not reproduced.

The problem goes into kernel in file sys/kern/subr_disk.c function
bounds_check_with_label():

        /* Ensure transfer is a whole number of aligned sectors. */
        if ((bp->b_blkno % DL_BLKSPERSEC(lp)) != 0 ||
            (bp->b_bcount % lp->d_secsize) != 0)
                goto bad;

Reply via email to