]> err.no Git - util-linux/commitdiff
fdisk: read topology info from libblkid
authorKarel Zak <kzak@redhat.com>
Thu, 29 Oct 2009 10:25:59 +0000 (11:25 +0100)
committerKarel Zak <kzak@redhat.com>
Wed, 18 Nov 2009 10:25:09 +0000 (11:25 +0100)
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>
fdisk/Makefile.am
fdisk/fdisk.c

index fed3ebfda47f16bdb388fd31792e1ddf9780a46d..31d6312133eee310ca71b44756ac63c68d2df4d1 100644 (file)
@@ -18,12 +18,27 @@ fdisk_SOURCES = fdisk.c fdiskbsdlabel.c fdisksgilabel.c \
        fdisk.h fdisksunlabel.h fdisksgilabel.h fdiskaixlabel.h \
        fdiskbsdlabel.h fdiskmaclabel.h $(fdisk_common)
 
+cflags_fdisk = $(AM_CFLAGS)
+ldadd_fdisk =
+
+if BUILD_LIBBLKID
+# only in-tree libblkid has topology support
+ldadd_fdisk += $(ul_libblkid_la)
+cflags_fdisk += -I$(ul_libblkid_srcdir)
+endif
+
 if HAVE_STATIC_FDISK
 sbin_PROGRAMS += fdisk.static
 fdisk_static_SOURCES = $(fdisk_SOURCES)
 fdisk_static_LDFLAGS = -all-static
+fdisk_static_CFLAGS = $(cflags_fdisk)
+fdisk_static_LDADD = $(ldadd_fdisk)
 endif
 
+fdisk_CFLAGS = $(cflags_fdisk)
+fdisk_LDADD = $(ldadd_fdisk)
+
+
 if !ARCH_SPARC
 
 sbin_PROGRAMS += sfdisk
index d0b4c5f897ac0a1a30c646d6bcf51a298f22e920..9b51ce9d4a40360ed70fc9257a82c7689e65ee20 100644 (file)
@@ -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");