OSDN Git Service

Patch from Jim Meyering <jim@meyering.net> to linux_write() to support logical
authorDavid Cantrell <dcantrel@mortise.boston.redhat.com>
Mon, 23 Apr 2007 20:25:11 +0000 (16:25 -0400)
committerDavid Cantrell <dcantrel@mortise.boston.redhat.com>
Wed, 2 May 2007 18:17:28 +0000 (14:17 -0400)
sector sizes other than 512 (PED_SECTOR_SIZE_DEFAULT).

libparted/arch/linux.c

index 285e2b9..b921730 100644 (file)
@@ -1531,9 +1531,7 @@ linux_write (PedDevice* dev, const void* buffer, PedSector start,
              PedSector count)
 {
         LinuxSpecific*          arch_specific = LINUX_SPECIFIC (dev);
-        int                     status;
         PedExceptionOption      ex_status;
-        size_t                  write_length = count * dev->sector_size;
         void*                   diobuf;
         void*                   diobuf_start;
 
@@ -1591,15 +1589,15 @@ linux_write (PedDevice* dev, const void* buffer, PedSector start,
         printf ("ped_device_write (\"%s\", %p, %d, %d)\n",
                 dev->path, buffer, (int) start, (int) count);
 #else
+        size_t write_length = count * dev->sector_size;
         dev->dirty = 1;
-        if (posix_memalign(&diobuf, PED_SECTOR_SIZE_DEFAULT,
-                           count * PED_SECTOR_SIZE_DEFAULT) != 0)
+        if (posix_memalign(&diobuf, dev->sector_size, write_length) != 0)
                 return 0;
-        memcpy(diobuf, buffer, count * PED_SECTOR_SIZE_DEFAULT);
+        memcpy(diobuf, buffer, write_length);
         diobuf_start = diobuf;
         while (1) {
-                status = write (arch_specific->fd, diobuf, write_length);
-                if (status == count * dev->sector_size) break;
+                ssize_t status = write (arch_specific->fd, diobuf, write_length);
+                if (status == write_length) break;
                 if (status > 0) {
                         write_length -= status;
                         diobuf = (char *) diobuf + status;