@@ -430,6 +430,23 @@ static int nilfs_segctor_reset_segment_buffer(struct nilfs_sc_info *sci)
430
430
return 0 ;
431
431
}
432
432
433
+ /**
434
+ * nilfs_segctor_zeropad_segsum - zero pad the rest of the segment summary area
435
+ * @sci: segment constructor object
436
+ *
437
+ * nilfs_segctor_zeropad_segsum() zero-fills unallocated space at the end of
438
+ * the current segment summary block.
439
+ */
440
+ static void nilfs_segctor_zeropad_segsum (struct nilfs_sc_info * sci )
441
+ {
442
+ struct nilfs_segsum_pointer * ssp ;
443
+
444
+ ssp = sci -> sc_blk_cnt > 0 ? & sci -> sc_binfo_ptr : & sci -> sc_finfo_ptr ;
445
+ if (ssp -> offset < ssp -> bh -> b_size )
446
+ memset (ssp -> bh -> b_data + ssp -> offset , 0 ,
447
+ ssp -> bh -> b_size - ssp -> offset );
448
+ }
449
+
433
450
static int nilfs_segctor_feed_segment (struct nilfs_sc_info * sci )
434
451
{
435
452
sci -> sc_nblk_this_inc += sci -> sc_curseg -> sb_sum .nblocks ;
@@ -438,6 +455,7 @@ static int nilfs_segctor_feed_segment(struct nilfs_sc_info *sci)
438
455
* The current segment is filled up
439
456
* (internal code)
440
457
*/
458
+ nilfs_segctor_zeropad_segsum (sci );
441
459
sci -> sc_curseg = NILFS_NEXT_SEGBUF (sci -> sc_curseg );
442
460
return nilfs_segctor_reset_segment_buffer (sci );
443
461
}
@@ -542,6 +560,7 @@ static int nilfs_segctor_add_file_block(struct nilfs_sc_info *sci,
542
560
goto retry ;
543
561
}
544
562
if (unlikely (required )) {
563
+ nilfs_segctor_zeropad_segsum (sci );
545
564
err = nilfs_segbuf_extend_segsum (segbuf );
546
565
if (unlikely (err ))
547
566
goto failed ;
@@ -1533,6 +1552,7 @@ static int nilfs_segctor_collect(struct nilfs_sc_info *sci,
1533
1552
nadd = min_t (int , nadd << 1 , SC_MAX_SEGDELTA );
1534
1553
sci -> sc_stage = prev_stage ;
1535
1554
}
1555
+ nilfs_segctor_zeropad_segsum (sci );
1536
1556
nilfs_segctor_truncate_segments (sci , sci -> sc_curseg , nilfs -> ns_sufile );
1537
1557
return 0 ;
1538
1558
0 commit comments