Blob Blame History Raw
commit c419b886b7520e1a92a984352baa0e122ff050e9
Author: Andrew Price <anprice@redhat.com>
Date:   Thu Jan 26 11:05:42 2017 +0000

    mkfs.gfs2: Disable rgrp alignment when dev topology is unsuitable
    
    If optimal_io_size is not a multiple of minimum_io_size then the values
    are not reliable swidth and sunit values, so disable rgrp stripe
    alignment in that case.
    
    Resolves: rhbz#1437009
    
    Signed-off-by: Andrew Price <anprice@redhat.com>

diff --git a/gfs2/mkfs/main_mkfs.c b/gfs2/mkfs/main_mkfs.c
index 4436f93..c3497a8 100644
--- a/gfs2/mkfs/main_mkfs.c
+++ b/gfs2/mkfs/main_mkfs.c
@@ -590,8 +590,14 @@ static lgfs2_rgrps_t rgs_init(struct mkfs_opts *opts, struct gfs2_sbd *sdp)
 			al_off = opts->sunit / sdp->bsize;
 		}
 	} else if (opts->align) {
-		if ((opts->dev.minimum_io_size > opts->dev.physical_sector_size) &&
-		    (opts->dev.optimal_io_size > opts->dev.physical_sector_size)) {
+		if (opts->dev.optimal_io_size <= opts->dev.physical_sector_size ||
+		    opts->dev.minimum_io_size <= opts->dev.physical_sector_size ||
+		    (opts->dev.optimal_io_size % opts->dev.minimum_io_size) != 0) {
+			/* If optimal_io_size is not a multiple of minimum_io_size then
+			   the values are not reliable swidth and sunit values, so disable
+			   rgrp alignment */
+			opts->align = 0;
+		} else {
 			al_base = opts->dev.optimal_io_size / sdp->bsize;
 			al_off = opts->dev.minimum_io_size / sdp->bsize;
 		}