@@ -120,9 +120,15 @@ transfer_single_new_db(pageCnvCtx *pageConverter,
120120int numFiles = 0 ;
121121int mapnum ;
122122int fileno ;
123-
123+ bool vm_crashsafe_change = false;
124+
124125old_dir [0 ]= '\0' ;
125126
127+ /* Do not copy non-crashsafe vm files for binaries that assume crashsafety */
128+ if (old_cluster .controldata .cat_ver < VISIBILITY_MAP_CRASHSAFE_CAT_VER &&
129+ new_cluster .controldata .cat_ver >=VISIBILITY_MAP_CRASHSAFE_CAT_VER )
130+ vm_crashsafe_change = true;
131+
126132for (mapnum = 0 ;mapnum < size ;mapnum ++ )
127133{
128134char old_file [MAXPGPATH ];
@@ -168,8 +174,16 @@ transfer_single_new_db(pageCnvCtx *pageConverter,
168174
169175for (fileno = 0 ;fileno < numFiles ;fileno ++ )
170176{
177+ char * vm_offset = strstr (namelist [fileno ]-> d_name ,"_vm" );
178+ bool is_vm_file = false;
179+
180+ /* Is a visibility map file? (name ends with _vm) */
181+ if (vm_offset && strlen (vm_offset )== strlen ("_vm" ))
182+ is_vm_file = true;
183+
171184if (strncmp (namelist [fileno ]-> d_name ,scandir_file_pattern ,
172- strlen (scandir_file_pattern ))== 0 )
185+ strlen (scandir_file_pattern ))== 0 &&
186+ (!is_vm_file || !vm_crashsafe_change ))
173187{
174188snprintf (old_file ,sizeof (old_file ),"%s/%s" ,maps [mapnum ].old_dir ,
175189namelist [fileno ]-> d_name );