[Libvir] PATCH: 12/16: logical volume backend
Daniel P. Berrange
berrange at redhat.com
Tue Feb 19 12:46:28 UTC 2008
On Tue, Feb 19, 2008 at 03:43:11AM -0500, Daniel Veillard wrote:
> > diff -r 31abfd8687b3 qemud/qemud.c
> > --- a/qemud/qemud.c Thu Feb 07 13:44:25 2008 -0500
> > +++ b/qemud/qemud.c Thu Feb 07 14:17:16 2008 -0500
> > @@ -2089,7 +2089,9 @@ int main(int argc, char **argv) {
> >
> > if (pipe(sigpipe) < 0 ||
> > qemudSetNonBlock(sigpipe[0]) < 0 ||
> > - qemudSetNonBlock(sigpipe[1]) < 0) {
> > + qemudSetNonBlock(sigpipe[1]) < 0 ||
> > + qemudSetCloseExec(sigpipe[0]) < 0 ||
> > + qemudSetCloseExec(sigpipe[1]) < 0) {
> > qemudLog(QEMUD_ERR, _("Failed to create pipe: %s"),
> > strerror(errno));
> > goto error1;
>
> That can be commited completely independantly, its a bug fix
Yes, I found this because the LVM tools will print out a warning
message if they're passed any file descriptor > 2 !
> Seems some of the code tries to be generic, what other kind of
> logical volume do you have in mind ?
Solaris has ZFS which provides parity with LVM volume manegement
so I intend that they'd have a ZFS impl of 'logical' pool type
> [...]
> > +
> > + /* Finally fill in extents information */
> > + if ((tmp = realloc(vol->source.extents, sizeof(*tmp) * (vol->source.nextent + 1))) == NULL) {
> > + virStorageReportError(conn, VIR_ERR_NO_MEMORY, "extents");
> > + return -1;
> > + }
> > + vol->source.extents = tmp;
> > +
> > + if ((vol->source.extents[vol->source.nextent].path =
> > + strdup(groups[2])) == NULL) {
> > + virStorageReportError(conn, VIR_ERR_NO_MEMORY, "extents");
> > + return -1;
> > + }
> > +
> > + if (xstrtol_ull(groups[3], NULL, 10, &offset) < 0)
> > + return -1;
> > + if (xstrtol_ull(groups[4], NULL, 10, &length) < 0)
> > + return -1;
> > + if (xstrtol_ull(groups[5], NULL, 10, &size) < 0)
> > + return -1;
>
> Can we really just return -1 here for error handling at that point ?
> vol->source had had some of its fields filled, but incompletely initialized
> this looks dangerous.
The caller will free the entire object & shutdown the pool if this fails.
I should however, report the error message before returning.
> [...]
> > + for (i = 0 ; i < pool->def->source.ndevice ; i++) {
> > + int fd;
> > + char zeros[512];
> > + memset(zeros, 0, sizeof(zeros));
>
> those 2 can probably be moved out of the loop
Yep.
> > +
> > + /*
> > + * LVM requires that the first 512 bytes are blanked if using
> > + * a whole disk as a PV. So we just blank them out regardless
> > + * rather than trying to figure out if we're a disk or partition
> > + */
>
> is it really 512 or the block size on the device used ? But 512 is
> probably sufficient for LVM to consider it cleared, just wondering ...
The 'pvcreate' man page explicitly says the first sector
<quote>
For whole disk devices only the partition table must be erased,
which will effectively destroy all data on that disk. This can
be done by zeroing the first sector with:
dd if=/dev/zero of=PhysicalVolume bs=512 count=1
</quote>
So 512 is fine for MSDOS partition tables at least.
Dan.
--
|=- Red Hat, Engineering, Emerging Technologies, Boston. +1 978 392 2496 -=|
|=- Perl modules: http://search.cpan.org/~danberr/ -=|
|=- Projects: http://freshmeat.net/~danielpb/ -=|
|=- GnuPG: 7D3B9505 F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 -=|
More information about the libvir-list
mailing list