[libvirt] [PATCH] Access qemu backing_file with relative pool path
Jesse J Cook
jesse.cook at eads-na-security.com
Wed Mar 9 18:40:12 UTC 2011
On Wed, 2011-03-09 at 09:23 -0700, Eric Blake wrote:
> On 03/03/2011 08:06 PM, Jesse Cook wrote:
> > This patch enables the relative backing file path support provided by
> > qemu-img create.
> >
> > If the storage pool is not found with the specified path, check if the
> > file exists relative to the pool where the new image will be created by
> > prepending the storage pool path.
> > ---
> > src/storage/storage_backend.c | 32 ++++++++++++++++++++++++++++----
> > 1 files changed, 28 insertions(+), 4 deletions(-)
> >
> > @@ -687,10 +687,34 @@ virStorageBackendCreateQemuImg(virConnectPtr conn,
> > return -1;
> > }
> > if (access(vol->backingStore.path, R_OK) != 0) {
> > - virReportSystemError(errno,
> > - _("inaccessible backing store volume %s"),
> > - vol->backingStore.path);
> > - return -1;
> > + /* If the backing store image is not found with the specified path,
> > + * check for the file relative to the pool path. */
> > + int accessRetCode = -1;
> > +
> > + char *absolutePath = NULL;
> > +
> > + virBuffer absPathBuf = VIR_BUFFER_INITIALIZER;
> > +
> > + virBufferVSprintf(&absPathBuf,
> > + "%s/%s",
> > + pool->def->target.path,
> > + vol->backingStore.path);
>
> I agree that we need to handle relative paths, but are they relative to
> the directory that owns the original qcow2 image, or are they relative
> to the cwd of the qemu process (not necessarily the same directory)? We
> need to make sure that we have the same interpretation of relative paths
> as qemu.
Backing store paths are relative to the directory that owns the original
qcow2 image. This could be a problem if storage pools support
subdirectories in the future because the storage pool path is being used
for the directory path.
> Meanwhile, shouldn't you only be computing an alternate name if
> vol->backingStore.path is relative? If it's absolute, then you would be
> generating /path/to/pool//path/to/backing, which is the wrong file
> compared to what qemu would be using.
Correct. I should be checking for leading '/'.
> For that matter, isn't access(vol->backingStore.path, R_OK) wrong for a
> relative path, unless you are executing in the same current working
> directory as qemu will be when it opens the relative path?
>
> In other words, I think you need to refactor the logic into:
>
> if (relative) compute absolute
> if (access fails) return -1
>
> instead of your:
>
> if (access fails) {
> blindly compute absolute
> if (access fails) return -1
> }
>
> and only do access() once.
Correct. I should compute the path prior to checking.
I can make the updates and submit a new patch.
--
Jesse Cook
Research Scientist
EADS NA Defense Security & Systems Solutions, Inc. (DS3)
Email: jesse.cook at eads-na-security.com
More information about the libvir-list
mailing list