[Libvir] [RFC][PATCH]: Make the iscsi storage backend mostly use sysfs
Jim Meyering
jim at meyering.net
Fri Feb 22 21:58:49 UTC 2008
Chris Lalancette <clalance at redhat.com> wrote:
> The newer version of iscsi-initiator-utils (6.2.0.865-0.2),
> available in the f8-updates repository, is required as part of the fix
> for a hang when doing iscsi logout (the other fix is in the 2.6.25
> kernel). Unfortunately, this version also changes the output of the
> iscsiadm -m session -P 3 command; this output was being used to gather
> the scsi devices available in a pool and present them as volumes.
> Consequently, when starting an iSCSI pool on a machine with these newer
> versions of the iscsi tools, the pool will be successfully created but
> you won't be able to see any of the LUNs presented.
>
> The attached patch *lessens* our dependency on the iscsiadm output by
> using sysfs to gather the /dev devices. Note that this patch is not to
> be applied; I'm just putting it out there so people can take a look at
> it. DanB has suggested getting rid of our dependency on the iscsiadm
> output altogether is the way to go, and I agree with him there; this is
> mostly just a short-term solution, to possibly base future work on.
Hi Chris,
This looks like a fine short-term fix.
I see that the new regexp is just relaxed,
so old iscsiadm output will still be accepted. Good ;-)
Regarding the code, a couple nits:
> Chris Lalancette
> --- libvirt-0.4.0/src/storage_backend_iscsi.c.orig 2008-02-22 15:56:03.000000000 -0500
> +++ libvirt-0.4.0/src/storage_backend_iscsi.c 2008-02-22 15:57:38.000000000 -0500
> @@ -161,24 +161,59 @@ static int virStorageBackendISCSIConnect
> static int virStorageBackendISCSIMakeLUN(virConnectPtr conn,
> virStoragePoolObjPtr pool,
> char **const groups,
> - void *data ATTRIBUTE_UNUSED)
> + void *data)
> {
> virStorageVolDefPtr vol;
> int fd = -1;
> - char scsiid[100];
> - char *dev = groups[4];
> + unsigned int channel;
> + char lunid[100];
> int opentries = 0;
> char *devpath = NULL;
> + char *session = (char *) data;
This cast seems unnecessary (at least for C -- but
I don't think anyone is trying to compile libvirt with C++).
> + char sysfs_path[PATH_MAX];
> + char *dev = NULL;
> + DIR *sysdir;
> + struct dirent *block_dirent;
> + struct stat sbuf;
> + int len;
> +
> + channel = strtoul(groups[1],NULL,10);
That's fine if groups[1] is already known to represent
a syntactically valid integer that's in [0..UINT_MAX].
Otherwise, consider using one of the conversion functions in util.c.
Maybe virStrToLong_ui, with a <= UINT_MAX test.
> + snprintf(sysfs_path, PATH_MAX, "/sys/class/iscsi_session/session%s/device/target%s:%.1d:%s/%s:%.1d:%s:%s/block",session,groups[0],channel,groups[2],groups[0],channel,groups[2],groups[3]);
With shorter lines, e.g., like this,
I find this a lot easier to read:
snprintf(sysfs_path, PATH_MAX,
"/sys/class/iscsi_session/session%s/device/"
"target%s:%.1d:%s/%s:%.1d:%s:%s/block",
session, groups[0], channel, groups[2], groups[0],
channel, groups[2], groups[3]);
More information about the libvir-list
mailing list