]> err.no Git - util-linux/commitdiff
fdisk: non-linux support (BLK* and HDIO_*)
authorSamuel Thibault <samuel.thibault@ens-lyon.org>
Wed, 23 Jul 2008 22:46:05 +0000 (00:46 +0200)
committerKarel Zak <kzak@redhat.com>
Wed, 23 Jul 2008 22:52:52 +0000 (00:52 +0200)
BLK* and HDIO_* are not available on all platform. Work around this
in a few places.

[kzak@redhat.com: split the original patch to small patches]

Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
Signed-off-by: Karel Zak <kzak@redhat.com>
fdisk/cfdisk.c
fdisk/fdisk.c
fdisk/fdisksgilabel.c
fdisk/fdisksunlabel.c
fdisk/gpt.c
fdisk/sfdisk.c

index 9d32a1908d52404b41a8e20bfc76167b5cf67da9..300518d6e8598ddf6a290e271d0c344eae8ccda3 100644 (file)
@@ -1685,6 +1685,7 @@ fill_p_info(void) {
         clear_warning();
     }
 
+#ifdef BLKFLSBUF
     /* Blocks are visible in more than one way:
        e.g. as block on /dev/hda and as block on /dev/hda3
        By a bug in the Linux buffer cache, we will see the old
@@ -1694,6 +1695,7 @@ fill_p_info(void) {
        so this only plays a role if we want to show volume labels. */
     ioctl(fd, BLKFLSBUF);      /* ignore errors */
                                /* e.g. Permission Denied */
+#endif
 
     if (blkdev_get_sectors(fd, &llsectors) == -1)
            fatal(_("Cannot get disk size"), 3);
@@ -1903,10 +1905,12 @@ write_part_table(void) {
        }
 
     if (is_bdev) {
+#ifdef BLKRRPART
         sync();
         sleep(2);
         if (!ioctl(fd,BLKRRPART))
              changed = TRUE;
+#endif
         sync();
         sleep(4);
 
index 58b8bbdefb1c23a3ddcbef26baf2cb2ab362bf03..d3fb1ea96dd673ef2c2ab878c1f85482c79d8702 100644 (file)
@@ -2261,10 +2261,15 @@ reread_partition_table(int leave) {
 
        i = fstat(fd, &statbuf);
        if (i == 0 && S_ISBLK(statbuf.st_mode)) {
-               printf(_("Calling ioctl() to re-read partition table.\n"));
                sync();
                sleep(2);
+#ifdef BLKRRPART
+               printf(_("Calling ioctl() to re-read partition table.\n"));
                i = ioctl(fd, BLKRRPART);
+#else
+               errno = ENOSYS;
+               i = 1;
+#endif
         }
 
        if (i) {
index 14b2d61025d1edd4b1ba46d6b0afddb70008571b..9f87751d3ada7324097ed99cd982d7ad4d25cbec 100644 (file)
@@ -713,6 +713,7 @@ create_sgilabel(void)
 
        res = blkdev_get_sectors(fd, &llsectors);
 
+#ifdef HDIO_GETGEO
        if (!ioctl(fd, HDIO_GETGEO, &geometry)) {
                heads = geometry.heads;
                sectors = geometry.sectors;
@@ -733,6 +734,7 @@ create_sgilabel(void)
                                  " > 33.8 GB.\n"), disk_device, cylinders);
                }
        }
+#endif
        for (i = 0; i < 4; i++) {
                old[i].sysid = 0;
                if (valid_part_table_flag(MBRbuffer)) {
index f4e8671ef4da483fbbbc890ed455e82bd940fad4..e6f17256455b55ba428ba7dd6bde38bb014bd191 100644 (file)
@@ -212,6 +212,7 @@ void create_sunlabel(void)
        res = blkdev_get_sectors(fd, &llsectors);
        sec_fac = sector_size / 512;
 
+#ifdef HDIO_GETGEO
        if (!ioctl(fd, HDIO_GETGEO, &geometry)) {
                heads = geometry.heads;
                sectors = geometry.sectors;
@@ -228,7 +229,9 @@ void create_sunlabel(void)
                                  "This value may be truncated for devices"
                                  " > 33.8 GB.\n"), disk_device, cylinders);
                }
-       } else {
+       } else
+#endif
+       {
                heads = read_int(1,1,1024,0,_("Heads"));
                sectors = read_int(1,1,1024,0,_("Sectors/track"));
                cylinders = read_int(1,1,65535,0,_("Cylinders"));
index 2c96b02624bee1b24cd43f094bdcfe1565859c1e..8cdf57f598122e8cfa867ee6770b0d11d1920986 100644 (file)
@@ -131,6 +131,7 @@ last_lba(int fd)
        return sectors - 1;
 }
 
+#ifdef __linux__
 static ssize_t
 read_lastoddsector(int fd, uint64_t lba, void *buffer, size_t count)
 {
@@ -148,6 +149,7 @@ read_lastoddsector(int fd, uint64_t lba, void *buffer, size_t count)
 
         return !rc;
 }
+#endif
 
 static ssize_t
 read_lba(int fd, uint64_t lba, void *buffer, size_t bytes)
@@ -159,6 +161,7 @@ read_lba(int fd, uint64_t lba, void *buffer, size_t bytes)
        lseek(fd, offset, SEEK_SET);
        bytesread = read(fd, buffer, bytes);
 
+#ifdef __linux__
         /* Kludge.  This is necessary to read/write the last
            block of an odd-sized disk, until Linux 2.5.x kernel fixes.
            This is only used by gpt.c, and only to read
@@ -166,6 +169,7 @@ read_lba(int fd, uint64_t lba, void *buffer, size_t bytes)
         */
         if (!bytesread && !(last_lba(fd) & 1) && lba == last_lba(fd))
                 bytesread = read_lastoddsector(fd, lba, buffer, bytes);
+#endif
         return bytesread;
 }
 
index d737d69d17cbb26ea85c73dc23b7f015658df29c..f70b1629cc6caedbf353b33bd1ff230b4942b8df 100644 (file)
@@ -446,7 +446,10 @@ get_geometry(char *dev, int fd, int silent) {
     unsigned long long sectors;
     struct geometry R;
 
-    if (ioctl(fd, HDIO_GETGEO, &g)) {
+#ifdef HDIO_GETGEO
+    if (ioctl(fd, HDIO_GETGEO, &g))
+#endif
+    {
        g.heads = g.sectors = g.cylinders = g.start = 0;
        if (!silent)
            do_warn(_("Disk %s: cannot get geometry\n"), dev);
@@ -790,7 +793,12 @@ add_sector_and_offset(struct disk_desc *z) {
 /* tell the kernel to reread the partition tables */
 static int
 reread_ioctl(int fd) {
-    if (ioctl(fd, BLKRRPART)) {
+#ifdef BLKRRPART
+    if (ioctl(fd, BLKRRPART))
+#else
+    errno = ENOSYS;
+#endif
+    {
        perror("BLKRRPART");
 
        /* 2.6.8 returns EIO for a zero table */