summaryrefslogtreecommitdiffstats
path: root/fdisk/fdisk.c
diff options
context:
space:
mode:
authorKarel Zak2009-10-29 11:25:59 +0100
committerKarel Zak2009-11-18 11:25:09 +0100
commit05dc9645f64e21167d297f435951a7bf2a43c43e (patch)
tree07fc402774c1fb232af97a6e5ee6817a1d6a4b56 /fdisk/fdisk.c
parentmore: limited line buffer length results in corrupted UTF-8 text (diff)
downloadkernel-qcow2-util-linux-05dc9645f64e21167d297f435951a7bf2a43c43e.tar.gz
kernel-qcow2-util-linux-05dc9645f64e21167d297f435951a7bf2a43c43e.tar.xz
kernel-qcow2-util-linux-05dc9645f64e21167d297f435951a7bf2a43c43e.zip
fdisk: read topology info from libblkid
and print ('p' command) info about logical and physical sectors and alignment_offset. minimum_io_size we don't use physical sector size directly, because on RAIDs is better to use minimum_io_size (aka stripe chunk size). For disk drives is minimum_io_size the same value as physical sector size. alignment_offset For compatibility with legacy operating systems some vendors provide disks where logical and physical sectors are aligned at sector 63 (= geometry.sectors). In other words the physical 4KB sectors start at LBA -1. Then the physical boundary is at: alignment_offset + N * phy_sector_size Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'fdisk/fdisk.c')
-rw-r--r--fdisk/fdisk.c34
1 files changed, 31 insertions, 3 deletions
diff --git a/fdisk/fdisk.c b/fdisk/fdisk.c
index d0b4c5f89..9b51ce9d4 100644
--- a/fdisk/fdisk.c
+++ b/fdisk/fdisk.c
@@ -39,6 +39,9 @@
#ifdef HAVE_LINUX_BLKPG_H
#include <linux/blkpg.h>
#endif
+#ifdef HAVE_LIBBLKID_INTERNAL
+#include <blkid.h>
+#endif
#include "gpt.h"
@@ -219,6 +222,7 @@ unsigned int heads,
display_in_cyl_units = 1;
unsigned long long total_number_of_sectors; /* (!) 512-byte sectors */
+unsigned long minimum_io_size, alignment_offset;
#define dos_label (!sun_label && !sgi_label && !aix_label && !mac_label && !osf_label)
int sun_label = 0; /* looking at sun disklabel */
@@ -849,14 +853,33 @@ create_doslabel(void) {
}
static void
-get_sectorsize(int fd) {
+get_topology(int fd) {
int arg;
+#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);
+
+ if (tp) {
+ minimum_io_size = blkid_topology_get_minimum_io_size(tp);
+ alignment_offset = blkid_topology_get_alignment_offset(tp);
+ }
+ }
+ blkid_free_probe(pr);
+#endif
- if (blkdev_get_sector_size(fd, &arg) == 0)
+ if (user_set_sector_size)
+ ;
+ else if (blkdev_get_sector_size(fd, &arg) == 0)
sector_size = arg;
+
+ if (!minimum_io_size)
+ minimum_io_size = sector_size;
+
if (sector_size != DEFAULT_SECTOR_SIZE)
printf(_("Note: sector size is %d (not %d)\n"),
sector_size, DEFAULT_SECTOR_SIZE);
@@ -911,7 +934,7 @@ void
get_geometry(int fd, struct geom *g) {
unsigned long long llcyls;
- get_sectorsize(fd);
+ get_topology(fd);
sector_factor = sector_size / 512;
guess_device_type(fd);
heads = cylinders = sectors = 0;
@@ -1667,6 +1690,11 @@ list_disk_geometry(void) {
printf(_("Units = %s of %d * %d = %d bytes\n"),
str_units(PLURAL),
units_per_sector, sector_size, units_per_sector * sector_size);
+
+ printf(_("Sector size (logical/physical): %u bytes / %lu bytes\n"),
+ sector_size, minimum_io_size);
+ if (alignment_offset)
+ printf(_("Alignment offset: %lu bytes\n"), alignment_offset);
if (dos_label)
dos_print_mbr_id();
printf("\n");