Whamcloud - gitweb
libext2fs: refactor Direct I/O alignment requirement calculations
[tools/e2fsprogs.git] / lib / ext2fs / mmp.c
index 49a11da..bb3772d 100644 (file)
 #include "ext2fs/ext2_fs.h"
 #include "ext2fs/ext2fs.h"
 
-static int mmp_pagesize(void)
-{
-#ifdef _SC_PAGESIZE
-       int sysval = sysconf(_SC_PAGESIZE);
-       if (sysval > 0)
-               return sysval;
-#endif /* _SC_PAGESIZE */
-#ifdef HAVE_GETPAGESIZE
-       return getpagesize();
-#else
-       return 4096;
-#endif
-}
-
 #ifndef O_DIRECT
 #define O_DIRECT 0
 #endif
@@ -54,20 +40,6 @@ errcode_t ext2fs_mmp_read(ext2_filsys fs, blk64_t mmp_blk, void *buf)
            (mmp_blk >= fs->super->s_blocks_count))
                return EXT2_ET_MMP_BAD_BLOCK;
 
-       if (fs->mmp_cmp == NULL) {
-               /* O_DIRECT in linux 2.4: page aligned
-                * O_DIRECT in linux 2.6: sector aligned
-                * A filesystem cannot be created with blocksize < sector size,
-                * or with blocksize > page_size. */
-               int bufsize = fs->blocksize;
-
-               if (bufsize < mmp_pagesize())
-                       bufsize = mmp_pagesize();
-               retval = ext2fs_get_memalign(bufsize, bufsize, &fs->mmp_cmp);
-               if (retval)
-                       return retval;
-       }
-
        /* ext2fs_open() reserves fd0,1,2 to avoid stdio collision, so checking
         * mmp_fd <= 0 is OK to validate that the fd is valid.  This opens its
         * own fd to read the MMP block to ensure that it is using O_DIRECT,
@@ -81,6 +53,15 @@ errcode_t ext2fs_mmp_read(ext2_filsys fs, blk64_t mmp_blk, void *buf)
                }
        }
 
+       if (fs->mmp_cmp == NULL) {
+               int align = ext2fs_get_dio_alignment(fs->mmp_fd);
+
+               retval = ext2fs_get_memalign(fs->blocksize, align,
+                                            &fs->mmp_cmp);
+               if (retval)
+                       return retval;
+       }
+
        if (ext2fs_llseek(fs->mmp_fd, mmp_blk * fs->blocksize, SEEK_SET) !=
            mmp_blk * fs->blocksize) {
                retval = EXT2_ET_LLSEEK_FAILED;