rpms/libvirt/devel libvirt-iscsi-sysfs4.patch, NONE, 1.1 libvirt-storage-api-iscsi-sendtarget.patch, NONE, 1.1 libvirt.spec, 1.78, 1.79

Chris Lalancette (clalance) fedora-extras-commits at redhat.com
Thu Mar 27 19:19:40 UTC 2008


Author: clalance

Update of /cvs/pkgs/rpms/libvirt/devel
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv7741

Modified Files:
	libvirt.spec 
Added Files:
	libvirt-iscsi-sysfs4.patch 
	libvirt-storage-api-iscsi-sendtarget.patch 
Log Message:
Add a couple of iscsi patches to the storage backend; without these two
patches, iscsi storage support is incomplete (and won't work properly).



libvirt-iscsi-sysfs4.patch:

--- NEW FILE libvirt-iscsi-sysfs4.patch ---
--- a/src/storage_backend_iscsi.c	4 Mar 2008 20:02:34 -0000	1.3
+++ b/src/storage_backend_iscsi.c	26 Mar 2008 22:07:05 -0000
@@ -170,20 +170,91 @@
 virStorageBackendISCSIMakeLUN(virConnectPtr conn,
                               virStoragePoolObjPtr pool,
                               char **const groups,
-                              void *data ATTRIBUTE_UNUSED)
+                              void *data)
 {
     virStorageVolDefPtr vol;
     int fd = -1;
+    unsigned int target, channel, id, lun;
     char lunid[100];
-    char *dev = groups[4];
     int opentries = 0;
     char *devpath = NULL;
+    char *session = data;
+    char sysfs_path[PATH_MAX];
+    char *dev = NULL;
+    DIR *sysdir;
+    struct dirent *block_dirent;
+    struct stat sbuf;
+    int len;
+
+    if ((virStrToLong_ui(groups[0], NULL, 10, &target) < 0) ||
+        (virStrToLong_ui(groups[1], NULL, 10, &channel) < 0) ||
+        (virStrToLong_ui(groups[2], NULL, 10, &id) < 0) ||
+        (virStrToLong_ui(groups[3], NULL, 10, &lun) < 0)) {
+        virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR, "%s",
+                              _("Failed parsing iscsiadm commands"));
+        return -1;
+    }
+
+    if (lun == 0) {
+        /* the 0'th LUN isn't a real LUN, it's just a control LUN; skip it */
+        return 0;
+    }
+
+    snprintf(sysfs_path, PATH_MAX,
+             "/sys/class/iscsi_session/session%s/device/"
+             "target%d:%d:%d/%d:%d:%d:%d/block",
+             session, target, channel, id, target, channel, id, lun);
+
+    if (stat(sysfs_path, &sbuf) < 0) {
+        /* block path in subdir didn't exist; this is unexpected, so fail */
+        virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
+                              _("Failed to find the sysfs path for %d:%d:%d:%d: %s"),
+                              target, channel, id, lun, strerror(errno));
+        return -1;
+    }
+
+    sysdir = opendir(sysfs_path);
+    if (sysdir == NULL) {
+        /* we failed for some reason; return an error */
+        virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
+                              _("Failed to opendir sysfs path %s: %s"),
+                              sysfs_path, strerror(errno));
+        return -1;
+    }
+
+    while ((block_dirent = readdir(sysdir)) != NULL) {
+        len = strlen(block_dirent->d_name);
+        if ((len == 1 && block_dirent->d_name[0] == '.') ||
+            (len == 2 && block_dirent->d_name[0] == '.' && block_dirent->d_name[1] == '.')) {
+            /* the . and .. directories; just skip them */
+            continue;
+        }
+
+        /* OK, not . or ..; let's see if it is a SCSI device */
+        if (len > 2 &&
+            block_dirent->d_name[0] == 's' &&
+            block_dirent->d_name[1] == 'd') {
+            /* looks like a scsi device, smells like scsi device; it must be
+               a scsi device */
+            dev = strdup(block_dirent->d_name);
+            break;
+        }
+    }
+    closedir(sysdir);
+
+    if (dev == NULL) {
+        /* we didn't find the sd? device we were looking for; fail */
+        virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
+                              _("Failed to find SCSI device for %d:%d:%d:%d: %s"),
+                              target, channel, id, lun, strerror(errno));
+        return -1;
+    }
 
     snprintf(lunid, sizeof(lunid)-1, "lun-%s", groups[3]);
 
     if ((vol = calloc(1, sizeof(virStorageVolDef))) == NULL) {
         virStorageReportError(conn, VIR_ERR_NO_MEMORY, "%s", _("volume"));
-        return -1;
+        goto cleanup;
     }
 
     if ((vol->name = strdup(lunid)) == NULL) {
@@ -197,6 +268,8 @@
     }
     strcpy(devpath, "/dev/");
     strcat(devpath, dev);
+    free(dev);
+    dev = NULL;
     /* It can take a little while between logging into the ISCSI
      * server and udev creating the /dev nodes, so if we get ENOENT
      * we must retry a few times - they should eventually appear.
@@ -258,6 +331,7 @@
     if (fd != -1) close(fd);
     free(devpath);
     virStorageVolDefFree(vol);
+    free(dev);
     return -1;
 }
 
@@ -281,14 +355,13 @@
      *           scsi1 Channel 00 Id 0 Lun: 5
      *                   Attached scsi disk sdg          State: running
      *
-     * Need 2 regex to match alternating lines
+     * Need a regex to match the Channel:Id:Lun lines
      */
     const char *regexes[] = {
-        "^\\s*scsi(\\S+)\\s+Channel\\s+(\\S+)\\s+Id\\s+(\\S+)\\s+Lun:\\s+(\\S+)\\s*$",
-        "^\\s*Attached\\s+scsi\\s+disk\\s+(\\S+)\\s+State:\\s+running\\s*$"
+        "^\\s*scsi(\\S+)\\s+Channel\\s+(\\S+)\\s+Id\\s+(\\S+)\\s+Lun:\\s+(\\S+)\\s*$"
     };
     int vars[] = {
-        4, 1
+        4
     };
     const char *prog[] = {
         ISCSIADM, "--mode", "session", "-r", session, "-P", "3", NULL,
@@ -296,11 +369,11 @@
 
     return virStorageBackendRunProgRegex(conn, pool,
                                          prog,
-                                         2,
+                                         1,
                                          regexes,
                                          vars,
                                          virStorageBackendISCSIMakeLUN,
-                                         NULL);
+                                         (void *)session);
 }
 
 

libvirt-storage-api-iscsi-sendtarget.patch:

--- NEW FILE libvirt-storage-api-iscsi-sendtarget.patch ---
--- /home/boston/clalance/devel/libvirt--devel/src/storage_backend_iscsi.c	2008-02-13 13:48:32.497466000 -0500
+++ libvirt-0.4.0/src/storage_backend_iscsi.c	2008-02-11 17:19:35.000000000 -0500
@@ -143,6 +143,14 @@ static int virStorageBackendISCSIConnect
         "--targetname", pool->def->source.devices[0].path, action, NULL
     };
 
+    const char *cmdsendtarget[] = {
+        ISCSIADM, "--mode", "discovery", "--type", "sendtargets",
+        "--portal", portal, NULL
+    };
+
+    if (virRun(conn, (char **)cmdsendtarget, NULL) < 0)
+        return -1;
+
     if (virRun(conn, (char **)cmdargv, NULL) < 0)
         return -1;
 


Index: libvirt.spec
===================================================================
RCS file: /cvs/pkgs/rpms/libvirt/devel/libvirt.spec,v
retrieving revision 1.78
retrieving revision 1.79
diff -u -r1.78 -r1.79
--- libvirt.spec	13 Mar 2008 15:31:57 -0000	1.78
+++ libvirt.spec	27 Mar 2008 19:18:59 -0000	1.79
@@ -21,7 +21,7 @@
 Summary: Library providing a simple API virtualization
 Name: libvirt
 Version: 0.4.1
-Release: 4%{?dist}%{?extra_release}
+Release: 5%{?dist}%{?extra_release}
 License: LGPL
 Group: Development/Libraries
 Source: libvirt-%{version}.tar.gz
@@ -31,6 +31,8 @@
 Patch3: %{name}-%{version}-qemu-media-change.patch
 Patch4: %{name}-%{version}-xen-boot-device.patch
 Patch5: %{name}-%{version}-tap-ifname.patch
+Patch6: libvirt-storage-api-iscsi-sendtarget.patch 
+Patch7: libvirt-iscsi-sysfs4.patch 
 BuildRoot: %{_tmppath}/%{name}-%{version}-root
 URL: http://libvirt.org/
 BuildRequires: python python-devel
@@ -148,6 +150,8 @@
 %patch3 -p1
 %patch4 -p1
 %patch5 -p1
+%patch6 -p1
+%patch7 -p1
 
 %build
 # Xen is available only on i386 x86_64 ia64
@@ -291,6 +295,11 @@
 %doc docs/examples/python
 
 %changelog
+* Thu Mar 27 2008 Chris Lalancette <clalance at redhat.com> - 0.4.1-5.fc9
+- Do iscsiadm sendtarget before trying to do login
+- Do sysfs scanning for iSCSI LUNs instead of trying to parse them from
+  iscsiadm session output
+
 * Thu Mar 13 2008 Daniel P. Berrange <berrange at redhat.com> - 0.4.1-4.fc9
 - Fix QEMU tap device setup
 - Fix Xen boot device XML processing




More information about the fedora-extras-commits mailing list