Whamcloud - gitweb
libext2fs: force DIO alignment FreeBSD when operating on a block device
authorTheodore Ts'o <tytso@mit.edu>
Tue, 13 Sep 2016 22:39:22 +0000 (18:39 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Tue, 13 Sep 2016 22:39:22 +0000 (18:39 -0400)
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>
lib/ext2fs/unix_io.c

index 27b6a95..85ad4e3 100644 (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;