Merge remote branch 'kwolf/for-anthony' into staging
authorAnthony Liguori <aliguori@us.ibm.com>
Tue, 6 Jul 2010 15:48:01 +0000 (10:48 -0500)
committerAnthony Liguori <aliguori@us.ibm.com>
Tue, 6 Jul 2010 15:48:01 +0000 (10:48 -0500)
1  2 
block-migration.c
hw/ide/macio.c
hw/ide/microdrive.c
hw/qdev.c
hw/virtio-blk.c

diff --combined block-migration.c
@@@ -236,7 -236,7 +236,7 @@@ static void init_blk_migration_it(void 
      BlkMigDevState *bmds;
      int64_t sectors;
  
-     if (bs->type == BDRV_TYPE_HD) {
+     if (!bdrv_is_read_only(bs)) {
          sectors = bdrv_getlength(bs) >> BDRV_SECTOR_BITS;
          if (sectors == 0) {
              return;
@@@ -638,6 -638,6 +638,6 @@@ void blk_mig_init(void
      QSIMPLEQ_INIT(&block_mig_state.bmds_list);
      QSIMPLEQ_INIT(&block_mig_state.blk_list);
  
 -    register_savevm_live("block", 0, 1, block_set_params, block_save_live,
 -                         NULL, block_load, &block_mig_state);
 +    register_savevm_live(NULL, "block", 0, 1, block_set_params,
 +                         block_save_live, NULL, block_load, &block_mig_state);
  }
diff --combined hw/ide/macio.c
@@@ -162,7 -162,7 +162,7 @@@ static void pmac_ide_transfer(DBDMA_io 
      IDEState *s = idebus_active_if(&m->bus);
  
      s->io_buffer_size = 0;
-     if (s->is_cdrom) {
+     if (s->drive_kind == IDE_CD) {
          pmac_ide_atapi_transfer_cb(io, 0);
          return;
      }
@@@ -321,7 -321,7 +321,7 @@@ int pmac_ide_init (DriveInfo **hd_table
  
      pmac_ide_memory = cpu_register_io_memory(pmac_ide_read,
                                               pmac_ide_write, d);
 -    vmstate_register(0, &vmstate_pmac, d);
 +    vmstate_register(NULL, 0, &vmstate_pmac, d);
      qemu_register_reset(pmac_ide_reset, d);
  
      return pmac_ide_memory;
diff --combined hw/ide/microdrive.c
@@@ -541,11 -541,11 +541,11 @@@ PCMCIACardState *dscm1xxxx_init(DriveIn
  
      ide_init2_with_non_qdev_drives(&md->bus, bdrv, NULL,
                                     qemu_allocate_irqs(md_set_irq, md, 1)[0]);
-     md->bus.ifs[0].is_cf = 1;
+     md->bus.ifs[0].drive_kind = IDE_CFATA;
      md->bus.ifs[0].mdata_size = METADATA_SIZE;
      md->bus.ifs[0].mdata_storage = (uint8_t *) qemu_mallocz(METADATA_SIZE);
  
 -    vmstate_register(-1, &vmstate_microdrive, md);
 +    vmstate_register(NULL, -1, &vmstate_microdrive, md);
  
      return &md->card;
  }
diff --combined hw/qdev.c
+++ b/hw/qdev.c
@@@ -280,7 -280,7 +280,7 @@@ int qdev_init(DeviceState *dev
      }
      qemu_register_reset(qdev_reset, dev);
      if (dev->info->vmsd) {
 -        vmstate_register_with_alias_id(-1, dev->info->vmsd, dev,
 +        vmstate_register_with_alias_id(dev, -1, dev->info->vmsd, dev,
                                         dev->instance_id_alias,
                                         dev->alias_required_for_version);
      }
@@@ -326,8 -326,10 +326,10 @@@ void qdev_init_nofail(DeviceState *dev
  {
      DeviceInfo *info = dev->info;
  
-     if (qdev_init(dev) < 0)
-         hw_error("Initialization of device %s failed\n", info->name);
+     if (qdev_init(dev) < 0) {
+         error_report("Initialization of device %s failed\n", info->name);
+         exit(1);
+     }
  }
  
  /* Unlink device from bus and free the structure.  */
@@@ -342,7 -344,7 +344,7 @@@ void qdev_free(DeviceState *dev
              qbus_free(bus);
          }
          if (dev->info->vmsd)
 -            vmstate_unregister(dev->info->vmsd, dev);
 +            vmstate_unregister(dev, dev->info->vmsd, dev);
          if (dev->info->exit)
              dev->info->exit(dev);
          if (dev->opts)
diff --combined hw/virtio-blk.c
@@@ -26,6 -26,7 +26,7 @@@ typedef struct VirtIOBloc
      QEMUBH *bh;
      BlockConf *conf;
      unsigned short sector_mask;
+     char sn[BLOCK_SERIAL_STRLEN];
  } VirtIOBlock;
  
  static VirtIOBlock *to_virtio_blk(VirtIODevice *vdev)
@@@ -324,6 -325,12 +325,12 @@@ static void virtio_blk_handle_request(V
          virtio_blk_handle_flush(req, mrb);
      } else if (req->out->type & VIRTIO_BLK_T_SCSI_CMD) {
          virtio_blk_handle_scsi(req);
+     } else if (req->out->type & VIRTIO_BLK_T_GET_ID) {
+         VirtIOBlock *s = req->dev;
+         memcpy(req->elem.in_sg[0].iov_base, s->sn,
+                MIN(req->elem.in_sg[0].iov_len, sizeof(s->sn)));
+         virtio_blk_req_complete(req, VIRTIO_BLK_S_OK);
      } else if (req->out->type & VIRTIO_BLK_T_OUT) {
          qemu_iovec_init_external(&req->qiov, &req->elem.out_sg[1],
                                   req->elem.out_num - 1);
@@@ -481,6 -488,7 +488,7 @@@ VirtIODevice *virtio_blk_init(DeviceSta
      VirtIOBlock *s;
      int cylinders, heads, secs;
      static int virtio_blk_id;
+     DriveInfo *dinfo;
  
      s = (VirtIOBlock *)virtio_common_init("virtio-blk", VIRTIO_ID_BLOCK,
                                            sizeof(struct virtio_blk_config),
      s->sector_mask = (s->conf->logical_block_size / BDRV_SECTOR_SIZE) - 1;
      bdrv_guess_geometry(s->bs, &cylinders, &heads, &secs);
  
+     /* NB: per existing s/n string convention the string is terminated
+      * by '\0' only when less than sizeof (s->sn)
+      */
+     dinfo = drive_get_by_blockdev(s->bs);
+     strncpy(s->sn, dinfo->serial, sizeof (s->sn));
      s->vq = virtio_add_queue(&s->vdev, 128, virtio_blk_handle_output);
  
      qemu_add_vm_change_state_handler(virtio_blk_dma_restart_cb, s);
 -    register_savevm("virtio-blk", virtio_blk_id++, 2,
 +    register_savevm(dev, "virtio-blk", virtio_blk_id++, 2,
                      virtio_blk_save, virtio_blk_load, s);
      bdrv_set_removable(s->bs, 0);