[PATCH 1/7] fdisk: read topology info from libblkid

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxx>
---
 fdisk/Makefile.am |   15 +++++++++++++++
 fdisk/fdisk.c     |   34 +++++++++++++++++++++++++++++++---
 2 files changed, 46 insertions(+), 3 deletions(-)

diff --git a/fdisk/Makefile.am b/fdisk/Makefile.am
index fed3ebf..31d6312 100644
--- a/fdisk/Makefile.am
+++ b/fdisk/Makefile.am
@@ -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
diff --git a/fdisk/fdisk.c b/fdisk/fdisk.c
index d0b4c5f..9b51ce9 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");
-- 
1.6.5.1

--
To unsubscribe from this list: send the line "unsubscribe util-linux-ng" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux