[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