libext2fs: force DIO alignment FreeBSD when operating on a block device

FreeBSD (and possibly BSD systems) requires that reads and writes to
block devices must be aligned, even when the O_DIRECT flag is not
specified.  Previously this was hard-coded to 512 bytes, but in order
to properly handle Advanced Format HDD's, query the BSD kernel to
determine the proper alignment to use.

Signed-off-by: Theodore Ts'o <tytso@mit.edu>
test
Theodore Ts'o 2016-09-13 18:39:22 -04:00
parent 370a24cd33
commit 3a68c6f1f0
1 changed files with 9 additions and 1 deletions

View File

@ -613,7 +613,7 @@ static errcode_t unix_open_channel(const char *name, int fd,
}
#endif
#if defined(__CYGWIN__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
#if defined(__CYGWIN__)
/*
* Some operating systems require that the buffers be aligned,
* regardless of O_DIRECT
@ -622,6 +622,14 @@ static errcode_t unix_open_channel(const char *name, int fd,
io->align = 512;
#endif
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
if (io->flags & CHANNEL_FLAGS_BLOCK_DEVICE) {
int dio_align = ext2fs_get_dio_alignment(fd);
if (io->align < dio_align)
io->align = dio_align;
}
#endif
if ((retval = alloc_cache(io, data)))
goto cleanup;