]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
fdisk: don't ignore 1MiB granularity on 512-byte sector devices stable/v2.21
authorKarel Zak <kzak@redhat.com>
Mon, 23 Jul 2012 21:09:41 +0000 (23:09 +0200)
committerKarel Zak <kzak@redhat.com>
Mon, 23 Jul 2012 21:09:41 +0000 (23:09 +0200)
Note that +10MB is 100000 (10^N) and relative values (+<size>
convention) should be be aligned to the default grain (= 1 MiB).

Old version:

  Last sector, +sectors or +size{K,M,G} (2048-2047999, default 2047999): +10MB
  Partition 1 of type Linux and of size 9.5 MiB is set
  ...
  /dev/loop0p1            2048       21578        9765+  83  Linux
  /dev/loop0p2           21579       43062       10742   83  Linux

New version:
  Last sector, +sectors or +size{K,M,G} (2048-2047999, default 2047999): +10MB
  Partition 1 of type Linux and of size 10 MiB is set
  ...
  /dev/loop0p1            2048       22527       10240   83  Linux
  /dev/loop0p2           22528       43007       10240   83  Linux

Addresses: http://thread.gmane.org/gmane.linux.kernel.device-mapper.dm-crypt/5913/focus=5929
Reported-by: Milan Broz <mbroz@redhat.com>
Signed-off-by: Karel Zak <kzak@redhat.com>
fdisk/fdisk.c

index 8893a017493991ed1a74279aa73f4477815c12e8..b65703f88ade3b9dda37e08a16f972c17571b67b 100644 (file)
@@ -567,6 +567,19 @@ test_c(char **m, char *mesg) {
 
 static int
 lba_is_aligned(unsigned long long lba)
+{
+       unsigned int granularity = max(phy_sector_size, min_io_size);
+       unsigned long long offset;
+
+       if (grain > granularity)
+               granularity = grain;
+       offset = (lba * sector_size) & (granularity - 1);
+
+       return !((granularity + alignment_offset - offset) & (granularity - 1));
+}
+
+static int
+lba_is_phy_aligned(unsigned long long lba)
 {
        unsigned int granularity = max(phy_sector_size, min_io_size);
        unsigned long long offset = (lba * sector_size) & (granularity - 1);
@@ -1808,7 +1821,7 @@ static void check_consistency(struct partition *p, int partition) {
 static void
 check_alignment(unsigned long long lba, int partition)
 {
-       if (!lba_is_aligned(lba))
+       if (!lba_is_phy_aligned(lba))
                printf(_("Partition %i does not start on physical sector boundary.\n"),
                        partition + 1);
 }