diff -r 80ea5f59f09a -r b421f396097a src/dev/storage/disk_image.hh --- a/src/dev/storage/disk_image.hh Thu Nov 26 10:03:43 2015 +0000 +++ b/src/dev/storage/disk_image.hh Thu Nov 26 10:11:52 2015 +0000 @@ -82,6 +82,8 @@ RawDiskImage(const Params *p); ~RawDiskImage(); + void notifyFork() override; + void close(); void open(const std::string &filename, bool rd_only = false); @@ -123,6 +125,8 @@ CowDiskImage(const Params *p); ~CowDiskImage(); + void notifyFork() override; + void initSectorTable(int hash_size); bool open(const std::string &file); void save() const; diff -r 80ea5f59f09a -r b421f396097a src/dev/storage/disk_image.cc --- a/src/dev/storage/disk_image.cc Thu Nov 26 10:03:43 2015 +0000 +++ b/src/dev/storage/disk_image.cc Thu Nov 26 10:11:52 2015 +0000 @@ -65,6 +65,17 @@ { close(); } void +RawDiskImage::notifyFork() +{ + if (initialized && !readonly) + panic("Attempting to fork system with read-write raw disk image."); + + const Params *p(dynamic_cast(params())); + close(); + open(p->image_file, p->read_only); +} + +void RawDiskImage::open(const string &filename, bool rd_only) { if (!filename.empty()) { @@ -198,6 +209,16 @@ } void +CowDiskImage::notifyFork() +{ + if (!dynamic_cast(params())->read_only && + !filename.empty()) { + inform("Disabling saving of COW image in forked child process.\n"); + filename = ""; + } +} + +void SafeRead(ifstream &stream, void *data, int count) { stream.read((char *)data, count); @@ -311,8 +332,12 @@ void CowDiskImage::save() const { - save(filename); -} + // filename will be set to the empty string to disable saving of + // the COW image in a forked child process. Save will still be + // called because there is no easy way to unregister the exit + // callback. + if (!filename.empty()) + save(filename);} void CowDiskImage::save(const string &file) const