hc
2024-05-10 9999e48639b3cecb08ffb37358bcba3b48161b29
kernel/fs/nilfs2/segment.c
....@@ -435,6 +435,23 @@
435435 return 0;
436436 }
437437
438
+/**
439
+ * nilfs_segctor_zeropad_segsum - zero pad the rest of the segment summary area
440
+ * @sci: segment constructor object
441
+ *
442
+ * nilfs_segctor_zeropad_segsum() zero-fills unallocated space at the end of
443
+ * the current segment summary block.
444
+ */
445
+static void nilfs_segctor_zeropad_segsum(struct nilfs_sc_info *sci)
446
+{
447
+ struct nilfs_segsum_pointer *ssp;
448
+
449
+ ssp = sci->sc_blk_cnt > 0 ? &sci->sc_binfo_ptr : &sci->sc_finfo_ptr;
450
+ if (ssp->offset < ssp->bh->b_size)
451
+ memset(ssp->bh->b_data + ssp->offset, 0,
452
+ ssp->bh->b_size - ssp->offset);
453
+}
454
+
438455 static int nilfs_segctor_feed_segment(struct nilfs_sc_info *sci)
439456 {
440457 sci->sc_nblk_this_inc += sci->sc_curseg->sb_sum.nblocks;
....@@ -443,6 +460,7 @@
443460 * The current segment is filled up
444461 * (internal code)
445462 */
463
+ nilfs_segctor_zeropad_segsum(sci);
446464 sci->sc_curseg = NILFS_NEXT_SEGBUF(sci->sc_curseg);
447465 return nilfs_segctor_reset_segment_buffer(sci);
448466 }
....@@ -547,6 +565,7 @@
547565 goto retry;
548566 }
549567 if (unlikely(required)) {
568
+ nilfs_segctor_zeropad_segsum(sci);
550569 err = nilfs_segbuf_extend_segsum(segbuf);
551570 if (unlikely(err))
552571 goto failed;
....@@ -711,6 +730,11 @@
711730 struct page *page = pvec.pages[i];
712731
713732 lock_page(page);
733
+ if (unlikely(page->mapping != mapping)) {
734
+ /* Exclude pages removed from the address space */
735
+ unlock_page(page);
736
+ continue;
737
+ }
714738 if (!page_has_buffers(page))
715739 create_empty_buffers(page, i_blocksize(inode), 0);
716740 unlock_page(page);
....@@ -965,10 +989,13 @@
965989 unsigned int isz, srsz;
966990
967991 bh_sr = NILFS_LAST_SEGBUF(&sci->sc_segbufs)->sb_super_root;
992
+
993
+ lock_buffer(bh_sr);
968994 raw_sr = (struct nilfs_super_root *)bh_sr->b_data;
969995 isz = nilfs->ns_inode_size;
970996 srsz = NILFS_SR_BYTES(isz);
971997
998
+ raw_sr->sr_sum = 0; /* Ensure initialization within this update */
972999 raw_sr->sr_bytes = cpu_to_le16(srsz);
9731000 raw_sr->sr_nongc_ctime
9741001 = cpu_to_le64(nilfs_doing_gc() ?
....@@ -982,6 +1009,8 @@
9821009 nilfs_write_inode_common(nilfs->ns_sufile, (void *)raw_sr +
9831010 NILFS_SR_SUFILE_OFFSET(isz), 1);
9841011 memset((void *)raw_sr + srsz, 0, nilfs->ns_blocksize - srsz);
1012
+ set_buffer_uptodate(bh_sr);
1013
+ unlock_buffer(bh_sr);
9851014 }
9861015
9871016 static void nilfs_redirty_inodes(struct list_head *head)
....@@ -1536,6 +1565,7 @@
15361565 nadd = min_t(int, nadd << 1, SC_MAX_SEGDELTA);
15371566 sci->sc_stage = prev_stage;
15381567 }
1568
+ nilfs_segctor_zeropad_segsum(sci);
15391569 nilfs_segctor_truncate_segments(sci, sci->sc_curseg, nilfs->ns_sufile);
15401570 return 0;
15411571
....@@ -1763,6 +1793,7 @@
17631793 list_for_each_entry(segbuf, logs, sb_list) {
17641794 list_for_each_entry(bh, &segbuf->sb_segsum_buffers,
17651795 b_assoc_buffers) {
1796
+ clear_buffer_uptodate(bh);
17661797 if (bh->b_page != bd_page) {
17671798 if (bd_page)
17681799 end_page_writeback(bd_page);
....@@ -1774,6 +1805,7 @@
17741805 b_assoc_buffers) {
17751806 clear_buffer_async_write(bh);
17761807 if (bh == segbuf->sb_super_root) {
1808
+ clear_buffer_uptodate(bh);
17771809 if (bh->b_page != bd_page) {
17781810 end_page_writeback(bd_page);
17791811 bd_page = bh->b_page;
....@@ -2023,6 +2055,9 @@
20232055 {
20242056 struct the_nilfs *nilfs = sci->sc_super->s_fs_info;
20252057 int err;
2058
+
2059
+ if (sb_rdonly(sci->sc_super))
2060
+ return -EROFS;
20262061
20272062 nilfs_sc_cstage_set(sci, NILFS_ST_INIT);
20282063 sci->sc_cno = nilfs->ns_cno;
....@@ -2614,11 +2649,10 @@
26142649 goto loop;
26152650
26162651 end_thread:
2617
- spin_unlock(&sci->sc_state_lock);
2618
-
26192652 /* end sync. */
26202653 sci->sc_task = NULL;
26212654 wake_up(&sci->sc_wait_task); /* for nilfs_segctor_kill_thread() */
2655
+ spin_unlock(&sci->sc_state_lock);
26222656 return 0;
26232657 }
26242658
....@@ -2710,7 +2744,7 @@
27102744
27112745 flush_work(&sci->sc_iput_work);
27122746
2713
- } while (ret && retrycount-- > 0);
2747
+ } while (ret && ret != -EROFS && retrycount-- > 0);
27142748 }
27152749
27162750 /**
....@@ -2821,6 +2855,7 @@
28212855 nilfs_segctor_destroy(nilfs->ns_writer);
28222856 nilfs->ns_writer = NULL;
28232857 }
2858
+ set_nilfs_purging(nilfs);
28242859
28252860 /* Force to free the list of dirty files */
28262861 spin_lock(&nilfs->ns_inode_lock);
....@@ -2833,4 +2868,5 @@
28332868 up_write(&nilfs->ns_segctor_sem);
28342869
28352870 nilfs_dispose_list(nilfs, &garbage_list, 1);
2871
+ clear_nilfs_purging(nilfs);
28362872 }