@@ -1161,23 +1161,34 @@ static bool cfs_gc_file(char* map_path, GC_CALL_KIND background)
11611161
11621162if (cfs_gc_verify_file )
11631163{
1164+ off_t soff = -1 ;
11641165fd = open (file_bck_path ,O_RDONLY |PG_BINARY ,0 );
11651166Assert (fd >=0 );
11661167
11671168for (i = 0 ;i < n_pages ;i ++ )
11681169{
1169- inode_t inode = newMap -> inodes [i ];
1170+ inodes [i ]= & newMap -> inodes [i ];
1171+ }
1172+ qsort (inodes ,n_pages ,sizeof (inode_t * ),cfs_cmp_page_offs );
1173+
1174+ for (i = 0 ;i < n_pages ;i ++ )
1175+ {
1176+ inode_t inode = * inodes [i ];
11701177int size = CFS_INODE_SIZE (inode );
11711178if (size != 0 && size < BLCKSZ )
11721179{
11731180char block [BLCKSZ ];
11741181char decomressedBlock [BLCKSZ ];
11751182off_t res PG_USED_FOR_ASSERTS_ONLY ;
11761183bool rc PG_USED_FOR_ASSERTS_ONLY ;
1177- res = lseek (fd ,CFS_INODE_OFFS (inode ),SEEK_SET );
1178- Assert (res == (off_t )CFS_INODE_OFFS (inode ));
1184+ if (soff != CFS_INODE_OFFS (inode ))
1185+ {
1186+ soff = lseek (fd ,CFS_INODE_OFFS (inode ),SEEK_SET );
1187+ Assert (soff == (off_t )CFS_INODE_OFFS (inode ));
1188+ }
11791189rc = cfs_read_file (fd ,block ,size );
11801190Assert (rc );
1191+ soff += size ;
11811192cfs_decrypt (file_bck_path ,block , (off_t )i * BLCKSZ ,size );
11821193res = cfs_decompress (decomressedBlock ,BLCKSZ ,block ,size );
11831194
@@ -1480,21 +1491,18 @@ void cfs_gc_start_bgworkers()
14801491/* Disable garbage collection. */
14811492void cfs_control_gc_lock (void )
14821493{
1483- uint32 was_disabled = pg_atomic_fetch_add_u32 (& cfs_state -> gc_disabled ,1 );
1484- if (!was_disabled )
1494+ pg_atomic_fetch_add_u32 (& cfs_state -> gc_disabled ,1 );
1495+ /* Wait until there are no active GC workers */
1496+ while (pg_atomic_read_u32 (& cfs_state -> n_active_gc )!= 0 )
14851497{
1486- /* Wait until there are no active GC workers */
1487- while (pg_atomic_read_u32 (& cfs_state -> n_active_gc )!= 0 )
1488- {
1489- int rc = WaitLatch (MyLatch ,
1490- WL_LATCH_SET |WL_TIMEOUT |WL_POSTMASTER_DEATH ,
1491- CFS_DISABLE_TIMEOUT /* ms */ );
1492- if (rc & WL_POSTMASTER_DEATH )
1493- exit (1 );
1498+ int rc = WaitLatch (MyLatch ,
1499+ WL_LATCH_SET |WL_TIMEOUT |WL_POSTMASTER_DEATH ,
1500+ CFS_DISABLE_TIMEOUT /* ms */ );
1501+ if (rc & WL_POSTMASTER_DEATH )
1502+ exit (1 );
14941503
1495- ResetLatch (MyLatch );
1496- CHECK_FOR_INTERRUPTS ();
1497- }
1504+ ResetLatch (MyLatch );
1505+ CHECK_FOR_INTERRUPTS ();
14981506}
14991507}
15001508