Jason Wang <jasow...@redhat.com> wrote: > We need to keep DIR register unchanged across migration, but currently it > depends on the media_changed flags from block layer and we do not save/restore > it which could let the guest driver think the floppy have changed after > migration. To fix this, a new filed media_changed in FDrive strcutre was > introduced in order to save and restore the it from block layer through > pre_save/post_load callbacks. > > Signed-off-by: Jason Wang <jasow...@redhat.com> > --- > hw/fdc.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ > 1 files changed, 46 insertions(+), 0 deletions(-) > > diff --git a/hw/fdc.c b/hw/fdc.c > index 9fdbc75..8257d51 100644 > --- a/hw/fdc.c > +++ b/hw/fdc.c > @@ -36,6 +36,7 @@ > #include "qdev-addr.h" > #include "blockdev.h" > #include "sysemu.h" > +#include "block_int.h" > > /********************************************************/ > /* debug Floppy devices */ > @@ -82,6 +83,7 @@ typedef struct FDrive { > uint8_t max_track; /* Nb of tracks */ > uint16_t bps; /* Bytes per sector */ > uint8_t ro; /* Is read-only */ > + uint8_t media_changed; /* Is media changed */ > } FDrive; > > static void fd_init(FDrive *drv) > @@ -533,6 +535,42 @@ static CPUWriteMemoryFunc * const > fdctrl_mem_write_strict[3] = { > NULL, > }; > > +static void fdrive_media_changed_pre_save(void *opaque) > +{ > + FDrive *drive = opaque; > + > + drive->media_changed = drive->bs->media_changed; > +} > + > +static int fdrive_media_changed_post_load(void *opaque, int version_id) > +{ > + FDrive *drive = opaque; > + > + drive->bs->media_changed = drive->media_changed;
shouldn't this be something like: if (!drive->bs) return 1; drive->bs->media_changed = drive->media_changed. ??? Otherwise, we can can have troubles if floppy is not opened in the other side. Rest of code looks nice, thanks. Later, Juan.