From 3a68c6f1f071c2826e8ec6ceb810c98719a98717 Mon Sep 17 00:00:00 2001 From: Theodore Ts'o Date: Tue, 13 Sep 2016 18:39:22 -0400 Subject: [PATCH] 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 --- lib/ext2fs/unix_io.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/ext2fs/unix_io.c b/lib/ext2fs/unix_io.c index 27b6a95..85ad4e3 100644 --- a/lib/ext2fs/unix_io.c +++ b/lib/ext2fs/unix_io.c @@ -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; -- 1.8.3.1