[libvirt] [PATCH 14/15] Move loop device setup code into virfile.{c, h}
Jiri Denemark
jdenemar at redhat.com
Wed Jul 4 13:37:07 UTC 2012
On Tue, Jul 03, 2012 at 16:58:53 +0100, Daniel P. Berrange wrote:
> From: "Daniel P. Berrange" <berrange at redhat.com>
>
> While it is not currently used elsewhere in libvirt, the code
> for finding a free loop device & associating a file with it
> is not LXC specific. Move it into the viffile.{c,h} file where
> potentially shared code is more commonly kept.
>
> Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
> ---
> src/libvirt_private.syms | 1 +
> src/lxc/lxc_controller.c | 112 ++-----------------------------------
> src/util/virfile.c | 138 ++++++++++++++++++++++++++++++++++++++++++++++
> src/util/virfile.h | 3 +
> 4 files changed, 147 insertions(+), 107 deletions(-)
>
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 2fe5068..6625fc6 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -1243,6 +1243,7 @@ virDomainListSnapshots;
>
>
> # virfile.h
> +virFileLoopDeviceAssociate;
> virFileClose;
> virFileDirectFdFlag;
> virFileWrapperFdClose;
> diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c
> index 05ca52a..27b51b4 100644
> --- a/src/lxc/lxc_controller.c
> +++ b/src/lxc/lxc_controller.c
> @@ -39,8 +39,6 @@
> #include <getopt.h>
> #include <sys/mount.h>
> #include <locale.h>
> -#include <linux/loop.h>
> -#include <dirent.h>
> #include <grp.h>
> #include <sys/stat.h>
> #include <time.h>
> @@ -337,108 +335,15 @@ static int virLXCControllerValidateConsoles(virLXCControllerPtr ctrl)
> }
>
>
> -static int lxcGetLoopFD(char **dev_name)
> -{
> - int fd = -1;
> - DIR *dh = NULL;
> - struct dirent *de;
> - char *looppath;
> - struct loop_info64 lo;
> -
> - VIR_DEBUG("Looking for loop devices in /dev");
> -
> - if (!(dh = opendir("/dev"))) {
> - virReportSystemError(errno, "%s",
> - _("Unable to read /dev"));
> - goto cleanup;
> - }
> -
> - while ((de = readdir(dh)) != NULL) {
> - if (!STRPREFIX(de->d_name, "loop"))
> - continue;
> -
> - if (virAsprintf(&looppath, "/dev/%s", de->d_name) < 0) {
> - virReportOOMError();
> - goto cleanup;
> - }
> -
> - VIR_DEBUG("Checking up on device %s", looppath);
> - if ((fd = open(looppath, O_RDWR)) < 0) {
> - virReportSystemError(errno,
> - _("Unable to open %s"), looppath);
> - goto cleanup;
> - }
> -
> - if (ioctl(fd, LOOP_GET_STATUS64, &lo) < 0) {
> - /* Got a free device, return the fd */
> - if (errno == ENXIO)
> - goto cleanup;
> -
> - VIR_FORCE_CLOSE(fd);
> - virReportSystemError(errno,
> - _("Unable to get loop status on %s"),
> - looppath);
> - goto cleanup;
> - }
> -
> - /* Oh well, try the next device */
> - VIR_FORCE_CLOSE(fd);
> - VIR_FREE(looppath);
> - }
> -
> - lxcError(VIR_ERR_INTERNAL_ERROR, "%s",
> - _("Unable to find a free loop device in /dev"));
> -
> -cleanup:
> - if (fd != -1) {
> - VIR_DEBUG("Got free loop device %s %d", looppath, fd);
> - *dev_name = looppath;
> - } else {
> - VIR_DEBUG("No free loop devices available");
> - VIR_FREE(looppath);
> - }
> - if (dh)
> - closedir(dh);
> - return fd;
> -}
> -
> -static int lxcSetupLoopDevice(virDomainFSDefPtr fs)
> +static int virLXCControllerSetupLoopDevice(virDomainFSDefPtr fs)
> {
> int lofd = -1;
This lofd = -1 initialization is no longer needed.
> - int fsfd = -1;
> - struct loop_info64 lo;
> char *loname = NULL;
> - int ret = -1;
>
> - if ((lofd = lxcGetLoopFD(&loname)) < 0)
> - return -1;
>
> - memset(&lo, 0, sizeof(lo));
> - lo.lo_flags = LO_FLAGS_AUTOCLEAR;
> -
> - if ((fsfd = open(fs->src, O_RDWR)) < 0) {
> - virReportSystemError(errno,
> - _("Unable to open %s"), fs->src);
> - goto cleanup;
> - }
> -
> - if (ioctl(lofd, LOOP_SET_FD, fsfd) < 0) {
> - virReportSystemError(errno,
> - _("Unable to attach %s to loop device"),
> - fs->src);
> - goto cleanup;
> - }
> -
> - if (ioctl(lofd, LOOP_SET_STATUS64, &lo) < 0) {
> - virReportSystemError(errno, "%s",
> - _("Unable to mark loop device as autoclear"));
> -
> - if (ioctl(lofd, LOOP_CLR_FD, 0) < 0)
> - VIR_WARN("Unable to detach %s from loop device", fs->src);
> - goto cleanup;
> - }
> + if ((lofd = virFileLoopDeviceAssociate(fs->src, &loname)) < 0)
> + return -1;
>
> - VIR_DEBUG("Attached loop device %s %d to %s", fs->src, lofd, loname);
> /*
> * We now change it into a block device type, so that
> * the rest of container setup 'just works'
> @@ -448,14 +353,7 @@ static int lxcSetupLoopDevice(virDomainFSDefPtr fs)
> fs->src = loname;
> loname = NULL;
>
> - ret = 0;
> -
> -cleanup:
> - VIR_FREE(loname);
> - VIR_FORCE_CLOSE(fsfd);
> - if (ret == -1)
> - VIR_FORCE_CLOSE(lofd);
> - return lofd;
> + return 0;
> }
Oops, you actually want to return lofd rather than zero.
>
>
> @@ -470,7 +368,7 @@ static int virLXCControllerSetupLoopDevices(virLXCControllerPtr ctrl)
...
ACK with the fix squashed in.
Jirka
More information about the libvir-list
mailing list