Hi,
The cause of this bug is on debian/patches/10_fix-probing-of-large-block-devices.patch so it is Debian specific. The patch changes from using BLKGETSIZE to BLKGETSIZE64 without correcting for the fact that BLKGETSIZE returns the 512 byte sector size and BLKGETSIZE64 returns the byte size. This is from /usr/include/linux/fs.h:

#define BLKGETSIZE _IO(0x12,96) /* return device size /512 (long *arg) */
#define BLKGETSIZE64 _IOR(0x12,114,size_t) /* return device size in bytes (u64 *arg) */

and this is the patch:
===================================================================
--- dcfldd-1.3.4.1.orig/sizeprobe.c
+++ dcfldd-1.3.4.1/sizeprobe.c
@@ -63,9 +63,13 @@ static off_t midpoint(off_t a, off_t b,
 static off_t get_dev_size(int fd, long blksize)
 {
     off_t num_sectors = 0;
-
-    if (ioctl(fd, BLKGETSIZE, &num_sectors))
-        log_info("%s: ioctl call to BLKGETSIZE failed.\n", program_name);
+
+    /*
+ * Use BLKGETSIZE64 unconditionally, since dcfldd.h #defines _FILE_OFFSET_BITS 64
+     * and off_t is guaranteed to be large enough to hold the result.
+     */
+    if (ioctl(fd, BLKGETSIZE64, &num_sectors))
+        log_info("%s: ioctl call to BLKGETSIZE64 failed.\n", program_name);
     else
         return (num_sectors * 512);
 }


Should be a trivial fix
Cheers,
Tim.

Reply via email to