Index: /trunk/src/VBox/Main/ConsoleImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/ConsoleImpl.cpp	(revision 30288)
+++ /trunk/src/VBox/Main/ConsoleImpl.cpp	(revision 30289)
@@ -475,4 +475,5 @@
     , mVMPoweredOff(false)
     , mVMIsAlreadyPoweringOff(false)
+    , mfSnapshotFolderWarningShown(false)
     , mVMMDev(NULL)
     , mAudioSniffer(NULL)
Index: /trunk/src/VBox/Main/ConsoleImpl2.cpp
===================================================================
--- /trunk/src/VBox/Main/ConsoleImpl2.cpp	(revision 30288)
+++ /trunk/src/VBox/Main/ConsoleImpl2.cpp	(revision 30289)
@@ -2402,16 +2402,4 @@
     ComPtr<IMedium> pMedium;
     hrc = pMediumAtt->COMGETTER(Medium)(pMedium.asOutParam());                          H();
-    BOOL fPassthrough;
-    hrc = pMediumAtt->COMGETTER(Passthrough)(&fPassthrough);                            H();
-    rc = configMedium(pLunL0,
-                      !!fPassthrough,
-                      lType,
-                      fUseHostIOCache,
-                      fSetupMerge,
-                      uMergeSource,
-                      uMergeTarget,
-                      pMedium,
-                      aMachineState,
-                      phrc);                                                            RC_CHECK();
 
     if (lType == DeviceType_HardDisk)
@@ -2448,9 +2436,12 @@
                     const char *pszUnit;
                     uint64_t u64Print = formatDiskSize(u64Size, &pszUnit);
-                    return VMSetError(pVM, VERR_FILE_TOO_BIG, RT_SRC_POS,
-                                      N_("The medium '%ls' has a logical size of %RU64%s "
-                                         "but the file system the medium is located on seems "
-                                         "to be FAT(32) which cannot handle files bigger than 4GB"),
-                                      strFile.raw(), u64Print, pszUnit);
+                    setVMRuntimeErrorCallbackF(pVM, this, 0,
+                            "FatPartitionDetected",
+                            N_("The medium '%ls' has a logical size of %RU64%s "
+                               "but the file system the medium is located on seems "
+                               "to be FAT(32) which cannot handle files bigger than 4GB.\n"
+                               "We strongly recommend to put all your virtual disk images and "
+                               "the snapshot folder onto an NTFS partition"),
+                           strFile.raw(), u64Print, pszUnit);
                 }
 #else /* !RT_OS_WINDOWS */
@@ -2477,54 +2468,91 @@
                             uint64_t u64PrintSiz = formatDiskSize(u64Size, &pszUnitSiz);
                             uint64_t u64PrintMax = formatDiskSize(maxSize, &pszUnitMax);
-                            return VMSetError(pVM, VERR_FILE_TOO_BIG, RT_SRC_POS,
-                                              N_("The medium '%ls' has a logical size of %RU64%s "
-                                                 "but the file system the medium is located on can "
-                                                 "only handle files up to %RU64%s in theory"),
-                                              strFile.raw(), u64PrintSiz, pszUnitSiz, u64PrintMax, pszUnitMax);
+                            setVMRuntimeErrorCallbackF(pVM, this, 0,
+                                    "FatPartitionDetected", /* <= not exact but ... */
+                                    N_("The medium '%ls' has a logical size of %RU64%s "
+                                       "but the file system the medium is located on can "
+                                       "only handle files up to %RU64%s in theory.\n"
+                                       "We strongly recommend to put all your virtual disk "
+                                       "images and the snapshot folder onto a proper "
+                                       "file system (e.g. ext3)"),
+                                    strFile.raw(), u64PrintSiz, pszUnitSiz, u64PrintMax, pszUnitMax);
                         }
                     }
                 }
 #endif /* !RT_OS_WINDOWS */
-            }
-            /*
-             * Snapshot folder:
-             * Here we test only for a FAT partition as we had to create a dummy file otherwise
-             */
-            if (   typeSnap == RTFS_FS_TYPE_FAT
-                && u64Size >= _4G)
-            {
-                const char *pszUnit;
-                uint64_t u64Print = formatDiskSize(u64Size, &pszUnit);
-                return VMSetError(pVM, VERR_FILE_TOO_BIG, RT_SRC_POS,
-                                  N_("The snapshot folder of this VM '%ls' seems to be located on "
-                                     "a FAT(32) file system. The logical size of the medium '%ls' "
-                                     "(%RU64%s) is bigger than the maximum file size this file "
-                                     "system can handle (4GB)"),
-                                  strSnap.raw(), strFile.raw(), u64Print, pszUnit);
-            }
+
+                /*
+                 * Snapshot folder:
+                 * Here we test only for a FAT partition as we had to create a dummy file otherwise
+                 */
+                if (   typeSnap == RTFS_FS_TYPE_FAT
+                    && u64Size >= _4G
+                    && !mfSnapshotFolderWarningShown)
+                {
+                    const char *pszUnit;
+                    uint64_t u64Print = formatDiskSize(u64Size, &pszUnit);
+                    setVMRuntimeErrorCallbackF(pVM, this, 0,
+                            "FatPartitionDetected",
+#ifdef RT_OS_WINDOWS
+                            N_("The snapshot folder of this VM '%ls' seems to be located on "
+                               "a FAT(32) file system. The logical size of the medium '%ls' "
+                               "(%RU64%s) is bigger than the maximum file size this file "
+                               "system can handle (4GB).\n"
+                               "We strongly recommend to put all your virtual disk images and "
+                               "the snapshot folder onto an NTFS partition"),
+#else
+                            N_("The snapshot folder of this VM '%ls' seems to be located on "
+                               "a FAT(32) file system. The logical size of the medium '%ls' "
+                               "(%RU64%s) is bigger than the maximum file size this file "
+                               "system can handle (4GB).\n"
+                               "We strongly recommend to put all your virtual disk images and "
+                               "the snapshot folder onto a proper file system (e.g. ext3)"),
+#endif
+                            strSnap.raw(), strFile.raw(), u64Print, pszUnit);
+                    /* Show this particular warning only once */
+                    mfSnapshotFolderWarningShown = true;
+                }
+
 #ifdef RT_OS_LINUX
-            /*
-             * Ext4 bug: Check if the host I/O cache is disabled and the disk image is located
-             *           on an ext4 partition. Later we have to check the Linux kernel version!
-             */
-            if (   (uCaps & MediumFormatCapabilities_Asynchronous)
-                && !fUseHostIOCache
-                && (   typeFile == RTFS_FS_TYPE_EXT4
-                    || typeSnap == RTFS_FS_TYPE_EXT4))
-            {
-                return VMSetError(pVM, VERR_GENERAL_FAILURE /*XXX*/, RT_SRC_POS,
-                                  N_("The host I/O cache for at least one controller is disabled "
-                                     "but the medium '%ls' or the snapshot folder for this VM "
-                                     "is located on an ext4 partition. There is a known Linux "
-                                     "kernel bug "
-                                     "which can lead to the corruption of the virtual disk image "
-                                     "under these conditions.\n"
-                                     "Either enable the host I/O cache or put the disk image and "
-                                     "the snapshot folder onto a different file system"),
-                                  strFile.raw());
-            }
+                /*
+                 * Ext4 bug: Check if the host I/O cache is disabled and the disk image is located
+                 *           on an ext4 partition. Later we have to check the Linux kernel version!
+                 */
+                if (   (uCaps & MediumFormatCapabilities_Asynchronous)
+                    && !fUseHostIOCache
+                    && (   typeFile == RTFS_FS_TYPE_EXT4
+                        || typeSnap == RTFS_FS_TYPE_EXT4))
+                {
+                    setVMRuntimeErrorCallbackF(pVM, this, 0,
+                            "Ext4PartitionDetected",
+                            N_("The host I/O cache for at least one controller is disabled "
+                               "but the medium '%ls' or the snapshot folder for this VM "
+                               "is located on an ext4 partition. There is a known Linux "
+                               "kernel bug which can lead to the corruption of the virtual "
+                               "disk image under these conditions.\n"
+                               "Either enable the host I/O cache permanently in the VM "
+                               "settings or put the disk image and the snapshot folder "
+                               "onto a different file system.\n"
+                               "The host I/O cache will now be enabled for this medium"),
+                            strFile.raw());
+                    fUseHostIOCache = true;
+                }
 #endif
-        }
-    }
+            }
+        }
+    }
+
+    BOOL fPassthrough;
+    hrc = pMediumAtt->COMGETTER(Passthrough)(&fPassthrough);                            H();
+    rc = configMedium(pLunL0,
+                      !!fPassthrough,
+                      lType,
+                      fUseHostIOCache,
+                      fSetupMerge,
+                      uMergeSource,
+                      uMergeTarget,
+                      pMedium,
+                      aMachineState,
+                      phrc);                                                            RC_CHECK();
 
     if (fAttachDetach)
Index: /trunk/src/VBox/Main/include/ConsoleImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/ConsoleImpl.h	(revision 30288)
+++ /trunk/src/VBox/Main/include/ConsoleImpl.h	(revision 30289)
@@ -630,4 +630,6 @@
     /** true when vmstateChangeCallback shouldn't initiate a power down.  */
     bool mVMIsAlreadyPoweringOff : 1;
+    /** true if we already showed the snapshot folder warning. */
+    bool mfSnapshotFolderWarningShown : 1;
 
     /** The current network attachment type in the VM.
