@@ -72,6 +72,8 @@ backup_data_file(const char *from_root, const char *to_root,
7272 size_t read_len = 0 ;
7373 pg_crc32 crc ;
7474 off_t offset ;
75+ char write_buffer [sizeof (header )+ BLCKSZ ];
76+ size_t write_buffer_real_size ;
7577
7678 INIT_CRC32C (crc );
7779
@@ -212,10 +214,15 @@ backup_data_file(const char *from_root, const char *to_root,
212214 upper_offset = header .hole_offset + header .hole_length ;
213215 upper_length = BLCKSZ - upper_offset ;
214216
217+ write_buffer_real_size = sizeof (header )+ header .hole_offset + upper_length ;
218+ memcpy (write_buffer , & header , sizeof (header ));
219+ if (header .hole_offset )
220+ memcpy (write_buffer + sizeof (header ), page .data , header .hole_offset );
221+ if (upper_length )
222+ memcpy (write_buffer + sizeof (header )+ header .hole_offset , page .data + upper_offset , upper_length );
223+
215224 /* write data page excluding hole */
216- if (fwrite (& header , 1 , sizeof (header ), out ) != sizeof (header ) ||
217- fwrite (page .data , 1 , header .hole_offset , out ) != header .hole_offset ||
218- fwrite (page .data + upper_offset , 1 , upper_length , out ) != upper_length )
225+ if (fwrite (write_buffer , 1 , write_buffer_real_size , out ) != write_buffer_real_size )
219226 {
220227 int errno_tmp = errno ;
221228 /* oops */
@@ -331,10 +338,15 @@ backup_data_file(const char *from_root, const char *to_root,
331338 upper_offset = header .hole_offset + header .hole_length ;
332339 upper_length = BLCKSZ - upper_offset ;
333340
341+ write_buffer_real_size = sizeof (header )+ header .hole_offset + upper_length ;
342+ memcpy (write_buffer , & header , sizeof (header ));
343+ if (header .hole_offset )
344+ memcpy (write_buffer + sizeof (header ), page .data , header .hole_offset );
345+ if (upper_length )
346+ memcpy (write_buffer + sizeof (header )+ header .hole_offset , page .data + upper_offset , upper_length );
347+
334348 /* write data page excluding hole */
335- if (fwrite (& header , 1 , sizeof (header ), out ) != sizeof (header ) ||
336- fwrite (page .data , 1 , header .hole_offset , out ) != header .hole_offset ||
337- fwrite (page .data + upper_offset , 1 , upper_length , out ) != upper_length )
349+ if (fwrite (write_buffer , 1 , write_buffer_real_size , out ) != write_buffer_real_size )
338350 {
339351 int errno_tmp = errno ;
340352 /* oops */
0 commit comments