]> xenbits.xensource.com Git - libvirt.git/commitdiff
Don't lose file format info on volume refresh.
authorCole Robinson <crobinso@redhat.com>
Fri, 3 Apr 2009 14:17:57 +0000 (14:17 +0000)
committerCole Robinson <crobinso@redhat.com>
Fri, 3 Apr 2009 14:17:57 +0000 (14:17 +0000)
ChangeLog
src/storage_backend.c
src/storage_backend_scsi.c

index 3b669f11aa8fcbcad8ba0a2cdc9d345590bae74c..da0b6d24ee295cec3aa940bb2864922dd83ed1ff 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Fri Apr  3 10:16:55 EDT 2009 Cole Robinson <crobinso@redhat.com>
+
+       * src/storage_backend.c src/storage_backend_scsi.c:
+       Don't lose file format info on volume refresh.
+
 Fri Apr  3 10:15:01 EDT 2009 Cole Robinson <crobinso@redhat.com>
 
        * src/storage_driver.c: Refresh volume alloc/capacity when dumping XML.
index 79c070c9f6be978b34583b3012b8545f92d89fa9..b1541407a989ef4944c204849432e5e960fc48c9 100644 (file)
@@ -156,37 +156,6 @@ virStorageBackendUpdateVolInfo(virConnectPtr conn,
     return 0;
 }
 
-struct diskType {
-    int part_table_type;
-    unsigned short offset;
-    unsigned short length;
-    unsigned long long magic;
-};
-
-static struct diskType const disk_types[] = {
-    { VIR_STORAGE_POOL_DISK_LVM2, 0x218, 8, 0x31303020324D564CULL },
-    { VIR_STORAGE_POOL_DISK_GPT,  0x200, 8, 0x5452415020494645ULL },
-    { VIR_STORAGE_POOL_DISK_DVH,  0x0,   4, 0x41A9E50BULL },
-    { VIR_STORAGE_POOL_DISK_MAC,  0x0,   2, 0x5245ULL },
-    { VIR_STORAGE_POOL_DISK_BSD,  0x40,  4, 0x82564557ULL },
-    { VIR_STORAGE_POOL_DISK_SUN,  0x1fc, 2, 0xBEDAULL },
-    /*
-     * NOTE: pc98 is funky; the actual signature is 0x55AA (just like dos), so
-     * we can't use that.  At the moment I'm relying on the "dummy" IPL
-     * bootloader data that comes from parted.  Luckily, the chances of running
-     * into a pc98 machine running libvirt are approximately nil.
-     */
-    /*{ 0x1fe, 2, 0xAA55UL },*/
-    { VIR_STORAGE_POOL_DISK_PC98, 0x0,   8, 0x314C5049000000CBULL },
-    /*
-     * NOTE: the order is important here; some other disk types (like GPT and
-     * and PC98) also have 0x55AA at this offset.  For that reason, the DOS
-     * one must be the last one.
-     */
-    { VIR_STORAGE_POOL_DISK_DOS,  0x1fe, 2, 0xAA55ULL },
-    { -1,                         0x0,   0, 0x0ULL },
-};
-
 int
 virStorageBackendUpdateVolTargetInfoFD(virConnectPtr conn,
                                        virStorageVolTargetPtr target,
@@ -244,41 +213,6 @@ virStorageBackendUpdateVolTargetInfoFD(virConnectPtr conn,
         }
     }
 
-    /* make sure to set the target format "unknown" to begin with */
-    target->format = VIR_STORAGE_POOL_DISK_UNKNOWN;
-
-    if (S_ISBLK(sb.st_mode)) {
-        off_t start;
-        int i;
-        unsigned char buffer[1024];
-        ssize_t bytes;
-
-        start = lseek(fd, 0, SEEK_SET);
-        if (start < 0) {
-            virReportSystemError(conn, errno,
-                                 _("cannot seek to beginning of file '%s'"),
-                                 target->path);
-            return -1;
-        }
-        bytes = saferead(fd, buffer, sizeof(buffer));
-        if (bytes < 0) {
-            virReportSystemError(conn, errno,
-                                 _("cannot read beginning of file '%s'"),
-                                 target->path);
-            return -1;
-        }
-
-        for (i = 0; disk_types[i].part_table_type != -1; i++) {
-            if (disk_types[i].offset + disk_types[i].length > bytes)
-                continue;
-            if (memcmp(buffer+disk_types[i].offset, &disk_types[i].magic,
-                disk_types[i].length) == 0) {
-                target->format = disk_types[i].part_table_type;
-                break;
-            }
-        }
-    }
-
     target->perms.mode = sb.st_mode & S_IRWXUGO;
     target->perms.uid = sb.st_uid;
     target->perms.gid = sb.st_gid;
index a962d1c258f25cb6e6a832722b59f0538e78fbe6..b3e6180cb6832f20847d826da050fd8c8b2a693d 100644 (file)
@@ -100,6 +100,92 @@ out:
     return retval;
 }
 
+struct diskType {
+    int part_table_type;
+    unsigned short offset;
+    unsigned short length;
+    unsigned long long magic;
+};
+
+static struct diskType const disk_types[] = {
+    { VIR_STORAGE_POOL_DISK_LVM2, 0x218, 8, 0x31303020324D564CULL },
+    { VIR_STORAGE_POOL_DISK_GPT,  0x200, 8, 0x5452415020494645ULL },
+    { VIR_STORAGE_POOL_DISK_DVH,  0x0,   4, 0x41A9E50BULL },
+    { VIR_STORAGE_POOL_DISK_MAC,  0x0,   2, 0x5245ULL },
+    { VIR_STORAGE_POOL_DISK_BSD,  0x40,  4, 0x82564557ULL },
+    { VIR_STORAGE_POOL_DISK_SUN,  0x1fc, 2, 0xBEDAULL },
+    /*
+     * NOTE: pc98 is funky; the actual signature is 0x55AA (just like dos), so
+     * we can't use that.  At the moment I'm relying on the "dummy" IPL
+     * bootloader data that comes from parted.  Luckily, the chances of running
+     * into a pc98 machine running libvirt are approximately nil.
+     */
+    /*{ 0x1fe, 2, 0xAA55UL },*/
+    { VIR_STORAGE_POOL_DISK_PC98, 0x0,   8, 0x314C5049000000CBULL },
+    /*
+     * NOTE: the order is important here; some other disk types (like GPT and
+     * and PC98) also have 0x55AA at this offset.  For that reason, the DOS
+     * one must be the last one.
+     */
+    { VIR_STORAGE_POOL_DISK_DOS,  0x1fe, 2, 0xAA55ULL },
+    { -1,                         0x0,   0, 0x0ULL },
+};
+
+static int
+virStorageBackendSCSIUpdateVolTargetInfo(virConnectPtr conn,
+                                         virStorageVolTargetPtr target,
+                                         unsigned long long *allocation,
+                                         unsigned long long *capacity)
+{
+    int fd, i;
+    off_t start;
+    unsigned char buffer[1024];
+    ssize_t bytes;
+
+    if ((fd = open(target->path, O_RDONLY)) < 0) {
+        virReportSystemError(conn, errno,
+                             _("cannot open volume '%s'"),
+                             target->path);
+        return -1;
+    }
+
+    if (virStorageBackendUpdateVolTargetInfoFD(conn,
+                                               target,
+                                               fd,
+                                               allocation,
+                                               capacity) < 0)
+        return -1;
+
+    /* make sure to set the target format "unknown" to begin with */
+    target->format = VIR_STORAGE_POOL_DISK_UNKNOWN;
+
+    start = lseek(fd, 0, SEEK_SET);
+    if (start < 0) {
+        virReportSystemError(conn, errno,
+                             _("cannot seek to beginning of file '%s'"),
+                             target->path);
+        return -1;
+    }
+    bytes = saferead(fd, buffer, sizeof(buffer));
+    if (bytes < 0) {
+        virReportSystemError(conn, errno,
+                             _("cannot read beginning of file '%s'"),
+                             target->path);
+        return -1;
+    }
+
+    for (i = 0; disk_types[i].part_table_type != -1; i++) {
+        if (disk_types[i].offset + disk_types[i].length > bytes)
+            continue;
+        if (memcmp(buffer+disk_types[i].offset, &disk_types[i].magic,
+            disk_types[i].length) == 0) {
+            target->format = disk_types[i].part_table_type;
+            break;
+        }
+    }
+
+    return 0;
+}
 
 static int
 virStorageBackendSCSINewLun(virConnectPtr conn,
@@ -160,10 +246,10 @@ virStorageBackendSCSINewLun(virConnectPtr conn,
         goto free_vol;
     }
 
-    if (virStorageBackendUpdateVolTargetInfo(conn,
-                                             &vol->target,
-                                             &vol->allocation,
-                                             &vol->capacity) < 0) {
+    if (virStorageBackendSCSIUpdateVolTargetInfo(conn,
+                                                 &vol->target,
+                                                 &vol->allocation,
+                                                 &vol->capacity) < 0) {
 
         virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
                               _("Failed to update volume for '%s'"),