[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [libvirt] [PATCH] qemu: endjob returns a bool



On Mon, Sep 9, 2013 at 2:12 PM, Eric Blake <eblake redhat com> wrote:
> Osier Yang pointed out that ever since commit 31cb030, the
> signature of qemuDomainObjEndJob was changed to return a bool.
> While comparison against 0 or > 0 still gives the right results,
> it looks fishy; we also had one place that was comparing < 0
> which is effectively dead code.
>
> * src/qemu/qemu_migration.c (qemuMigrationPrepareAny): Fix dead
> code bug.
> (qemuMigrationBegin): Use more canonical form of bool check.
> * src/qemu/qemu_driver.c (qemuAutostartDomain)
> (qemuDomainCreateXML, qemuDomainSuspend, qemuDomainResume)
> (qemuDomainShutdownFlags, qemuDomainReboot, qemuDomainReset)
> (qemuDomainDestroyFlags, qemuDomainSetMemoryFlags)
> (qemuDomainSetMemoryStatsPeriod, qemuDomainInjectNMI)
> (qemuDomainSendKey, qemuDomainGetInfo, qemuDomainScreenshot)
> (qemuDomainSetVcpusFlags, qemuDomainGetVcpusFlags)
> (qemuDomainRestoreFlags, qemuDomainGetXMLDesc)
> (qemuDomainCreateWithFlags, qemuDomainAttachDeviceFlags)
> (qemuDomainUpdateDeviceFlags, qemuDomainDetachDeviceFlags)
> (qemuDomainBlockResize, qemuDomainBlockStats)
> (qemuDomainBlockStatsFlags, qemuDomainMemoryStats)
> (qemuDomainMemoryPeek, qemuDomainGetBlockInfo)
> (qemuDomainAbortJob, qemuDomainMigrateSetMaxDowntime)
> (qemuDomainMigrateGetCompressionCache)
> (qemuDomainMigrateSetCompressionCache)
> (qemuDomainMigrateSetMaxSpeed)
> (qemuDomainSnapshotCreateActiveInternal)
> (qemuDomainRevertToSnapshot, qemuDomainSnapshotDelete)
> (qemuDomainQemuMonitorCommand, qemuDomainQemuAttach)
> (qemuDomainBlockJobImpl, qemuDomainBlockCopy)
> (qemuDomainBlockCommit, qemuDomainOpenGraphics)
> (qemuDomainGetBlockIoTune, qemuDomainGetDiskErrors)
> (qemuDomainPMSuspendForDuration, qemuDomainPMWakeup)
> (qemuDomainQemuAgentCommand, qemuDomainFSTrim): Likewise.
>
> Signed-off-by: Eric Blake <eblake redhat com>
> ---
>
> Most of this is mechanical, but the change to qemuMigrationPrepareAny
> requires special care to ensure that checking for 0 instead of negative
> isn't introducing a bug on failure to start incoming migration.
>
>  src/qemu/qemu_driver.c    | 115 +++++++++++++++++++++-------------------------
>  src/qemu/qemu_migration.c |   4 +-
>  2 files changed, 55 insertions(+), 64 deletions(-)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 9b5d126..bbf2d23 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -293,7 +293,7 @@ qemuAutostartDomain(virDomainObjPtr vm,
>                        err ? err->message : _("unknown error"));
>          }
>
> -        if (qemuDomainObjEndJob(data->driver, vm) == 0)
> +        if (!qemuDomainObjEndJob(data->driver, vm))
>              vm = NULL;
>      }
>
> @@ -1612,7 +1612,7 @@ static virDomainPtr qemuDomainCreateXML(virConnectPtr conn,
>                           VIR_NETDEV_VPORT_PROFILE_OP_CREATE,
>                           start_flags) < 0) {
>          virDomainAuditStart(vm, "booted", false);
> -        if (qemuDomainObjEndJob(driver, vm) > 0)
> +        if (qemuDomainObjEndJob(driver, vm))
>              qemuDomainRemoveInactive(driver, vm);
>          vm = NULL;
>          goto cleanup;
> @@ -1637,7 +1637,7 @@ static virDomainPtr qemuDomainCreateXML(virConnectPtr conn,
>      if (dom)
>          dom->id = vm->def->id;
>
> -    if (qemuDomainObjEndJob(driver, vm) == 0)
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
>
>  cleanup:
> @@ -1722,7 +1722,7 @@ static int qemuDomainSuspend(virDomainPtr dom) {
>      ret = 0;
>
>  endjob:
> -    if (qemuDomainObjEndJob(driver, vm) == 0)
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
>
>  cleanup:
> @@ -1787,7 +1787,7 @@ static int qemuDomainResume(virDomainPtr dom) {
>      ret = 0;
>
>  endjob:
> -    if (qemuDomainObjEndJob(driver, vm) == 0)
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
>
>  cleanup:
> @@ -1882,7 +1882,7 @@ static int qemuDomainShutdownFlags(virDomainPtr dom, unsigned int flags) {
>      }
>
>  endjob:
> -    if (qemuDomainObjEndJob(driver, vm) == 0)
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
>
>  cleanup:
> @@ -1992,7 +1992,7 @@ qemuDomainReboot(virDomainPtr dom, unsigned int flags)
>      }
>
>  endjob:
> -    if (qemuDomainObjEndJob(driver, vm) == 0)
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
>
>  cleanup:
> @@ -2035,7 +2035,7 @@ qemuDomainReset(virDomainPtr dom, unsigned int flags)
>      priv->fakeReboot = false;
>
>  endjob:
> -    if (qemuDomainObjEndJob(driver, vm) == 0)
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
>
>  cleanup:
> @@ -2121,15 +2121,14 @@ qemuDomainDestroyFlags(virDomainPtr dom,
>      virDomainAuditStop(vm, "destroyed");
>
>      if (!vm->persistent) {
> -        if (qemuDomainObjEndJob(driver, vm) > 0)
> +        if (qemuDomainObjEndJob(driver, vm))
>              qemuDomainRemoveInactive(driver, vm);
>          vm = NULL;
>      }
>      ret = 0;
>
>  endjob:
> -    if (vm &&
> -        qemuDomainObjEndJob(driver, vm) == 0)
> +    if (vm && !qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
>
>  cleanup:
> @@ -2274,7 +2273,7 @@ static int qemuDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem,
>
>      ret = 0;
>  endjob:
> -    if (qemuDomainObjEndJob(driver, vm) == 0)
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
>
>  cleanup:
> @@ -2348,7 +2347,7 @@ static int qemuDomainSetMemoryStatsPeriod(virDomainPtr dom, int period,
>
>      ret = 0;
>  endjob:
> -    if (qemuDomainObjEndJob(driver, vm) == 0)
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
>
>  cleanup:
> @@ -2396,10 +2395,8 @@ static int qemuDomainInjectNMI(virDomainPtr domain, unsigned int flags)
>      qemuDomainObjExitMonitor(driver, vm);
>
>  endjob:
> -    if (qemuDomainObjEndJob(driver, vm) == 0) {
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
> -        goto cleanup;
> -    }
>
>  cleanup:
>      if (vm)
> @@ -2462,7 +2459,7 @@ static int qemuDomainSendKey(virDomainPtr domain,
>      qemuDomainObjExitMonitor(driver, vm);
>
>  endjob:
> -    if (qemuDomainObjEndJob(driver, vm) == 0)
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
>
>  cleanup:
> @@ -2518,7 +2515,7 @@ static int qemuDomainGetInfo(virDomainPtr dom,
>                  err = qemuMonitorGetBalloonInfo(priv->mon, &balloon);
>                  qemuDomainObjExitMonitor(driver, vm);
>              }
> -            if (qemuDomainObjEndJob(driver, vm) == 0) {
> +            if (!qemuDomainObjEndJob(driver, vm)) {
>                  vm = NULL;
>                  goto cleanup;
>              }
> @@ -3670,7 +3667,7 @@ endjob:
>          unlink(tmp);
>      VIR_FREE(tmp);
>
> -    if (qemuDomainObjEndJob(driver, vm) == 0)
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
>
>  cleanup:
> @@ -4225,7 +4222,7 @@ qemuDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
>      ret = 0;
>
>  endjob:
> -    if (qemuDomainObjEndJob(driver, vm) == 0)
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
>
>  cleanup:
> @@ -4919,7 +4916,7 @@ qemuDomainGetVcpusFlags(virDomainPtr dom, unsigned int flags)
>          qemuDomainObjExitAgent(vm);
>
>  endjob:
> -        if (qemuDomainObjEndJob(driver, vm) == 0)
> +        if (!qemuDomainObjEndJob(driver, vm))
>              vm = NULL;
>
>          if (ncpuinfo < 0)
> @@ -5446,7 +5443,7 @@ qemuDomainRestoreFlags(virConnectPtr conn,
>      if (virFileWrapperFdClose(wrapperFd) < 0)
>          VIR_WARN("Failed to close %s", path);
>
> -    if (qemuDomainObjEndJob(driver, vm) == 0)
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
>      else if (ret < 0 && !vm->persistent) {
>          qemuDomainRemoveInactive(driver, vm);
> @@ -5666,7 +5663,7 @@ static char *qemuDomainGetXMLDesc(virDomainPtr dom,
>              qemuDomainObjExitMonitor(driver, vm);
>
>  endjob:
> -            if (qemuDomainObjEndJob(driver, vm) == 0) {
> +            if (!qemuDomainObjEndJob(driver, vm)) {
>                  vm = NULL;
>                  goto cleanup;
>              }
> @@ -6065,7 +6062,7 @@ qemuDomainCreateWithFlags(virDomainPtr dom, unsigned int flags)
>      ret = 0;
>
>  endjob:
> -    if (qemuDomainObjEndJob(driver, vm) == 0)
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
>
>  cleanup:
> @@ -6937,7 +6934,7 @@ static int qemuDomainAttachDeviceFlags(virDomainPtr dom, const char *xml,
>      }
>
>  endjob:
> -    if (qemuDomainObjEndJob(driver, vm) == 0)
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
>
>  cleanup:
> @@ -7081,7 +7078,7 @@ static int qemuDomainUpdateDeviceFlags(virDomainPtr dom,
>      }
>
>  endjob:
> -    if (qemuDomainObjEndJob(driver, vm) == 0)
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
>
>  cleanup:
> @@ -7219,7 +7216,7 @@ static int qemuDomainDetachDeviceFlags(virDomainPtr dom, const char *xml,
>      }
>
>  endjob:
> -    if (qemuDomainObjEndJob(driver, vm) == 0)
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
>
>  cleanup:
> @@ -8917,7 +8914,7 @@ qemuDomainBlockResize(virDomainPtr dom,
>      ret = 0;
>
>  endjob:
> -    if (qemuDomainObjEndJob(driver, vm) == 0)
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
>
>  cleanup:
> @@ -8993,7 +8990,7 @@ qemuDomainBlockStats(virDomainPtr dom,
>      qemuDomainObjExitMonitor(driver, vm);
>
>  endjob:
> -    if (qemuDomainObjEndJob(driver, vm) == 0)
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
>
>  cleanup:
> @@ -9161,7 +9158,7 @@ qemuDomainBlockStatsFlags(virDomainPtr dom,
>      *nparams = tmp;
>
>  endjob:
> -    if (qemuDomainObjEndJob(driver, vm) == 0)
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
>
>  cleanup:
> @@ -9556,7 +9553,7 @@ qemuDomainMemoryStats(virDomainPtr dom,
>          }
>      }
>
> -    if (qemuDomainObjEndJob(driver, vm) == 0)
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
>
>  cleanup:
> @@ -9699,7 +9696,7 @@ qemuDomainMemoryPeek(virDomainPtr dom,
>      ret = 0;
>
>  endjob:
> -    if (qemuDomainObjEndJob(driver, vm) == 0)
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
>
>  cleanup:
> @@ -9848,7 +9845,7 @@ static int qemuDomainGetBlockInfo(virDomainPtr dom,
>              ret = 0;
>          }
>
> -        if (qemuDomainObjEndJob(driver, vm) == 0)
> +        if (!qemuDomainObjEndJob(driver, vm))
>              vm = NULL;
>      } else {
>          ret = 0;
> @@ -11145,7 +11142,7 @@ static int qemuDomainAbortJob(virDomainPtr dom) {
>      qemuDomainObjExitMonitor(driver, vm);
>
>  endjob:
> -    if (qemuDomainObjEndJob(driver, vm) == 0)
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
>
>  cleanup:
> @@ -11196,7 +11193,7 @@ qemuDomainMigrateSetMaxDowntime(virDomainPtr dom,
>      qemuDomainObjExitMonitor(driver, vm);
>
>  endjob:
> -    if (qemuDomainObjEndJob(driver, vm) == 0)
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
>
>  cleanup:
> @@ -11251,7 +11248,7 @@ qemuDomainMigrateGetCompressionCache(virDomainPtr dom,
>      qemuDomainObjExitMonitor(driver, vm);
>
>  endjob:
> -    if (qemuDomainObjEndJob(driver, vm) == 0)
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
>
>  cleanup:
> @@ -11307,7 +11304,7 @@ qemuDomainMigrateSetCompressionCache(virDomainPtr dom,
>      qemuDomainObjExitMonitor(driver, vm);
>
>  endjob:
> -    if (qemuDomainObjEndJob(driver, vm) == 0)
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
>
>  cleanup:
> @@ -11355,7 +11352,7 @@ qemuDomainMigrateSetMaxSpeed(virDomainPtr dom,
>              priv->migMaxBandwidth = bandwidth;
>
>  endjob:
> -        if (qemuDomainObjEndJob(driver, vm) == 0)
> +        if (!qemuDomainObjEndJob(driver, vm))
>              vm = NULL;
>      } else {
>          priv->migMaxBandwidth = bandwidth;
> @@ -11708,7 +11705,7 @@ cleanup:
>      }
>
>  endjob:
> -    if (vm && qemuDomainObjEndJob(driver, vm) == 0) {
> +    if (vm && !qemuDomainObjEndJob(driver, vm)) {
>          /* Only possible if a transient vm quit while our locks were down,
>           * in which case we don't want to save snapshot metadata.  */
>          *vmptr = NULL;
> @@ -13290,7 +13287,7 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
>
>          if (qemuDomainSnapshotRevertInactive(driver, vm, snap) < 0) {
>              if (!vm->persistent) {
> -                if (qemuDomainObjEndJob(driver, vm) > 0)
> +                if (qemuDomainObjEndJob(driver, vm))
>                      qemuDomainRemoveInactive(driver, vm);
>                  vm = NULL;
>                  goto cleanup;
> @@ -13317,7 +13314,7 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
>              virDomainAuditStart(vm, "from-snapshot", rc >= 0);
>              if (rc < 0) {
>                  if (!vm->persistent) {
> -                    if (qemuDomainObjEndJob(driver, vm) > 0)
> +                    if (qemuDomainObjEndJob(driver, vm))
>                          qemuDomainRemoveInactive(driver, vm);
>                      vm = NULL;
>                      goto cleanup;
> @@ -13340,7 +13337,7 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
>      ret = 0;
>
>  endjob:
> -    if (vm && qemuDomainObjEndJob(driver, vm) == 0)
> +    if (vm && !qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
>
>  cleanup:
> @@ -13506,7 +13503,7 @@ static int qemuDomainSnapshotDelete(virDomainSnapshotPtr snapshot,
>      }
>
>  endjob:
> -    if (qemuDomainObjEndJob(driver, vm) == 0)
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
>
>  cleanup:
> @@ -13559,7 +13556,7 @@ static int qemuDomainQemuMonitorCommand(virDomainPtr domain, const char *cmd,
>      qemuDomainObjExitMonitor(driver, vm);
>
>  endjob:
> -    if (qemuDomainObjEndJob(driver, vm) == 0) {
> +    if (!qemuDomainObjEndJob(driver, vm)) {
>          vm = NULL;
>      }
>
> @@ -13641,7 +13638,7 @@ static virDomainPtr qemuDomainQemuAttach(virConnectPtr conn,
>
>      if (qemuProcessAttach(conn, driver, vm, pid,
>                            pidfile, monConfig, monJSON) < 0) {
> -        if (qemuDomainObjEndJob(driver, vm) > 0)
> +        if (qemuDomainObjEndJob(driver, vm))
>              qemuDomainRemoveInactive(driver, vm);
>          vm = NULL;
>          monConfig = NULL;
> @@ -13654,7 +13651,7 @@ static virDomainPtr qemuDomainQemuAttach(virConnectPtr conn,
>      if (dom)
>          dom->id = vm->def->id;
>
> -    if (qemuDomainObjEndJob(driver, vm) == 0)
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
>
>  cleanup:
> @@ -14149,7 +14146,7 @@ qemuDomainBlockJobImpl(virDomainObjPtr vm,
>      }
>
>  endjob:
> -    if (qemuDomainObjEndJob(driver, vm) == 0) {
> +    if (!qemuDomainObjEndJob(driver, vm)) {
>          vm = NULL;
>          goto cleanup;
>      }
> @@ -14380,10 +14377,8 @@ endjob:
>      if (ret < 0)
>          disk->mirrorFormat = VIR_STORAGE_FILE_NONE;
>      VIR_FREE(mirror);
> -    if (qemuDomainObjEndJob(driver, vm) == 0) {
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
> -        goto cleanup;
> -    }
>
>  cleanup:
>      VIR_FREE(device);
> @@ -14572,10 +14567,8 @@ endjob:
>                                                top_parent,
>                                                VIR_DISK_CHAIN_READ_ONLY);
>      }
> -    if (qemuDomainObjEndJob(driver, vm) == 0) {
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
> -        goto cleanup;
> -    }
>
>  cleanup:
>      VIR_FREE(device);
> @@ -14641,10 +14634,8 @@ qemuDomainOpenGraphics(virDomainPtr dom,
>      ret = qemuMonitorOpenGraphics(priv->mon, protocol, fd, "graphicsfd",
>                                    (flags & VIR_DOMAIN_OPEN_GRAPHICS_SKIPAUTH) != 0);
>      qemuDomainObjExitMonitor(driver, vm);
> -    if (qemuDomainObjEndJob(driver, vm) == 0) {
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
> -        goto cleanup;
> -    }
>
>  cleanup:
>      if (vm)
> @@ -14956,7 +14947,7 @@ qemuDomainGetBlockIoTune(virDomainPtr dom,
>      ret = 0;
>
>  endjob:
> -    if (qemuDomainObjEndJob(driver, vm) == 0)
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
>
>  cleanup:
> @@ -15030,7 +15021,7 @@ qemuDomainGetDiskErrors(virDomainPtr dom,
>      ret = n;
>
>  endjob:
> -    if (qemuDomainObjEndJob(driver, vm) == 0)
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
>
>  cleanup:
> @@ -15561,7 +15552,7 @@ qemuDomainPMSuspendForDuration(virDomainPtr dom,
>      qemuDomainObjExitAgent(vm);
>
>  endjob:
> -    if (qemuDomainObjEndJob(driver, vm) == 0)
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
>
>  cleanup:
> @@ -15610,7 +15601,7 @@ qemuDomainPMWakeup(virDomainPtr dom,
>      qemuDomainObjExitMonitor(driver, vm);
>
>  endjob:
> -    if (qemuDomainObjEndJob(driver, vm) == 0)
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
>
>  cleanup:
> @@ -15696,7 +15687,7 @@ qemuDomainQemuAgentCommand(virDomainPtr domain,
>          VIR_FREE(result);
>
>  endjob:
> -    if (qemuDomainObjEndJob(driver, vm) == 0)
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
>
>  cleanup:
> @@ -15766,7 +15757,7 @@ qemuDomainFSTrim(virDomainPtr dom,
>      qemuDomainObjExitAgent(vm);
>
>  endjob:
> -    if (qemuDomainObjEndJob(driver, vm) == 0)
> +    if (!qemuDomainObjEndJob(driver, vm))
>          vm = NULL;
>
>  cleanup:
> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> index 3177756..69a9013 100644
> --- a/src/qemu/qemu_migration.c
> +++ b/src/qemu/qemu_migration.c
> @@ -2125,7 +2125,7 @@ endjob:
>          if (qemuMigrationJobFinish(driver, vm) == 0)
>              vm = NULL;
>      } else {
> -        if (qemuDomainObjEndJob(driver, vm) == 0)
> +        if (!qemuDomainObjEndJob(driver, vm))
>              vm = NULL;
>      }
>      goto cleanup;
> @@ -2334,7 +2334,7 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver,
>                           VIR_QEMU_PROCESS_START_PAUSED |
>                           VIR_QEMU_PROCESS_START_AUTODESTROY) < 0) {
>          virDomainAuditStart(vm, "migrated", false);
> -        if (qemuDomainObjEndJob(driver, vm) < 0)
> +        if (!qemuDomainObjEndJob(driver, vm))
>              vm = NULL;
>          goto endjob;
>      }
> --
> 1.8.3.1

ACK. Looked fairly mechanical. Only thing I had to check was the goto
cleanup going away in a few places and it was all correct.

-- 
Doug Goldstein


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]