]> err.no Git - util-linux/commitdiff
fdisk: fix -b <sectorsize>
authorKarel Zak <kzak@redhat.com>
Fri, 19 Mar 2010 14:56:27 +0000 (15:56 +0100)
committerKarel Zak <kzak@redhat.com>
Fri, 19 Mar 2010 14:56:27 +0000 (15:56 +0100)
The old fdisk (<2.17) does not differentiate between logical and
physical sector size, it uses the <sectorsize> for everything.

Now, we have logical and physical sectors size, but the -b option
changes the logical size only. The second bug is that "fdisk -b <sz>"
does not read topology information (it means that all I/O limits and
physical sector size are 512 (default).

The backwardly compatible bug fix is to override both sizes, logical
and physical if "-b" is used.

In future we can add a special option for physical size only.

Signed-off-by: Karel Zak <kzak@redhat.com>
fdisk/fdisk.8
fdisk/fdisk.c

index 367837d9d5c0ee307da9f3f4773fb41b919ee094..30dc9678ad534d2612d6408819baf081da195284 100644 (file)
@@ -182,7 +182,9 @@ program and Linux partitions with the Linux fdisk or Linux cfdisk program.
 .BI "\-b " sectorsize
 Specify the sector size of the disk. Valid values are 512, 1024, 2048 or 4096.
 (Recent kernels know the sector size. Use this only on old kernels or
-to override the kernel's ideas.)
+to override the kernel's ideas.) Since util-linux-ng 2.17 fdisk differentiates
+between logical and physical sector size. This option changes both sector sizes to
+.IB sectorsize .
 .TP
 .BI \-h
 Print help and then exit.
index 2a6d419f379ddeef46531077117a83f05c985766..f5c67904ca80e0e6123f85c2aee9c77c81dd3dd9 100644 (file)
@@ -976,8 +976,6 @@ get_topology(int fd) {
 #ifdef HAVE_LIBBLKID_INTERNAL
        blkid_probe pr;
 
-       if (user_set_sector_size)
-               return;
        pr = blkid_new_probe();
        if (pr && blkid_probe_set_device(pr, fd, 0, 0) == 0) {
                blkid_topology tp = blkid_probe_get_topology(pr);
@@ -1006,12 +1004,20 @@ get_topology(int fd) {
 #endif
 
        if (user_set_sector_size)
-               ;
-       else if (blkdev_get_sector_size(fd, &arg) == 0)
+               /* fdisk since 2.17 differentiate between logical and physical
+                * sectors size. For backward compatibility the
+                *    fdisk -b <sectorsize>
+                * changes both, logical and physical sector size.
+                */
+               phy_sector_size = sector_size;
+
+       else if (blkdev_get_sector_size(fd, &arg) == 0) {
                sector_size = arg;
 
-       if (!phy_sector_size)
-               phy_sector_size = sector_size;
+               if (!phy_sector_size)
+                       phy_sector_size = sector_size;
+       }
+
        if (!min_io_size)
                min_io_size = phy_sector_size;
        if (!io_size)