From: Karel Zak Date: Fri, 19 Mar 2010 14:56:27 +0000 (+0100) Subject: fdisk: fix -b X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=eb406c0e66cdeffa239c23b09d73ac73d5d643de;p=util-linux fdisk: fix -b The old fdisk (<2.17) does not differentiate between logical and physical sector size, it uses the 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 " 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 --- diff --git a/fdisk/fdisk.8 b/fdisk/fdisk.8 index 367837d9..30dc9678 100644 --- a/fdisk/fdisk.8 +++ b/fdisk/fdisk.8 @@ -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. diff --git a/fdisk/fdisk.c b/fdisk/fdisk.c index 09efd1cc..1d7196e3 100644 --- a/fdisk/fdisk.c +++ b/fdisk/fdisk.c @@ -965,8 +965,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); @@ -995,12 +993,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 + * 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)