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;