.. | .. |
---|
158 | 158 | * it is saved and will be restored on |
---|
159 | 159 | * nilfs_transaction_commit(). |
---|
160 | 160 | */ |
---|
161 | | - nilfs_msg(sb, KERN_WARNING, "journal info from a different FS"); |
---|
| 161 | + nilfs_warn(sb, "journal info from a different FS"); |
---|
162 | 162 | save = current->journal_info; |
---|
163 | 163 | } |
---|
164 | 164 | if (!ti) { |
---|
.. | .. |
---|
322 | 322 | struct the_nilfs *nilfs = sb->s_fs_info; |
---|
323 | 323 | struct nilfs_sc_info *sci = nilfs->ns_writer; |
---|
324 | 324 | |
---|
325 | | - if (!sci || !sci->sc_flush_request) |
---|
| 325 | + if (sb_rdonly(sb) || unlikely(!sci) || !sci->sc_flush_request) |
---|
326 | 326 | return; |
---|
327 | 327 | |
---|
328 | 328 | set_bit(NILFS_SC_PRIOR_FLUSH, &sci->sc_flags); |
---|
.. | .. |
---|
435 | 435 | return 0; |
---|
436 | 436 | } |
---|
437 | 437 | |
---|
| 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 | + |
---|
438 | 455 | static int nilfs_segctor_feed_segment(struct nilfs_sc_info *sci) |
---|
439 | 456 | { |
---|
440 | 457 | sci->sc_nblk_this_inc += sci->sc_curseg->sb_sum.nblocks; |
---|
.. | .. |
---|
443 | 460 | * The current segment is filled up |
---|
444 | 461 | * (internal code) |
---|
445 | 462 | */ |
---|
| 463 | + nilfs_segctor_zeropad_segsum(sci); |
---|
446 | 464 | sci->sc_curseg = NILFS_NEXT_SEGBUF(sci->sc_curseg); |
---|
447 | 465 | return nilfs_segctor_reset_segment_buffer(sci); |
---|
448 | 466 | } |
---|
.. | .. |
---|
547 | 565 | goto retry; |
---|
548 | 566 | } |
---|
549 | 567 | if (unlikely(required)) { |
---|
| 568 | + nilfs_segctor_zeropad_segsum(sci); |
---|
550 | 569 | err = nilfs_segbuf_extend_segsum(segbuf); |
---|
551 | 570 | if (unlikely(err)) |
---|
552 | 571 | goto failed; |
---|
.. | .. |
---|
711 | 730 | struct page *page = pvec.pages[i]; |
---|
712 | 731 | |
---|
713 | 732 | lock_page(page); |
---|
| 733 | + if (unlikely(page->mapping != mapping)) { |
---|
| 734 | + /* Exclude pages removed from the address space */ |
---|
| 735 | + unlock_page(page); |
---|
| 736 | + continue; |
---|
| 737 | + } |
---|
714 | 738 | if (!page_has_buffers(page)) |
---|
715 | 739 | create_empty_buffers(page, i_blocksize(inode), 0); |
---|
716 | 740 | unlock_page(page); |
---|
.. | .. |
---|
738 | 762 | struct list_head *listp) |
---|
739 | 763 | { |
---|
740 | 764 | struct nilfs_inode_info *ii = NILFS_I(inode); |
---|
741 | | - struct address_space *mapping = &ii->i_btnode_cache; |
---|
| 765 | + struct inode *btnc_inode = ii->i_assoc_inode; |
---|
742 | 766 | struct pagevec pvec; |
---|
743 | 767 | struct buffer_head *bh, *head; |
---|
744 | 768 | unsigned int i; |
---|
745 | 769 | pgoff_t index = 0; |
---|
746 | 770 | |
---|
| 771 | + if (!btnc_inode) |
---|
| 772 | + return; |
---|
| 773 | + |
---|
747 | 774 | pagevec_init(&pvec); |
---|
748 | 775 | |
---|
749 | | - while (pagevec_lookup_tag(&pvec, mapping, &index, |
---|
| 776 | + while (pagevec_lookup_tag(&pvec, btnc_inode->i_mapping, &index, |
---|
750 | 777 | PAGECACHE_TAG_DIRTY)) { |
---|
751 | 778 | for (i = 0; i < pagevec_count(&pvec); i++) { |
---|
752 | 779 | bh = head = page_buffers(pvec.pages[i]); |
---|
.. | .. |
---|
877 | 904 | nilfs_mdt_mark_dirty(nilfs->ns_cpfile); |
---|
878 | 905 | nilfs_cpfile_put_checkpoint( |
---|
879 | 906 | nilfs->ns_cpfile, nilfs->ns_cno, bh_cp); |
---|
880 | | - } else |
---|
881 | | - WARN_ON(err == -EINVAL || err == -ENOENT); |
---|
882 | | - |
---|
| 907 | + } else if (err == -EINVAL || err == -ENOENT) { |
---|
| 908 | + nilfs_error(sci->sc_super, |
---|
| 909 | + "checkpoint creation failed due to metadata corruption."); |
---|
| 910 | + err = -EIO; |
---|
| 911 | + } |
---|
883 | 912 | return err; |
---|
884 | 913 | } |
---|
885 | 914 | |
---|
.. | .. |
---|
893 | 922 | err = nilfs_cpfile_get_checkpoint(nilfs->ns_cpfile, nilfs->ns_cno, 0, |
---|
894 | 923 | &raw_cp, &bh_cp); |
---|
895 | 924 | if (unlikely(err)) { |
---|
896 | | - WARN_ON(err == -EINVAL || err == -ENOENT); |
---|
| 925 | + if (err == -EINVAL || err == -ENOENT) { |
---|
| 926 | + nilfs_error(sci->sc_super, |
---|
| 927 | + "checkpoint finalization failed due to metadata corruption."); |
---|
| 928 | + err = -EIO; |
---|
| 929 | + } |
---|
897 | 930 | goto failed_ibh; |
---|
898 | 931 | } |
---|
899 | 932 | raw_cp->cp_snapshot_list.ssl_next = 0; |
---|
.. | .. |
---|
956 | 989 | unsigned int isz, srsz; |
---|
957 | 990 | |
---|
958 | 991 | bh_sr = NILFS_LAST_SEGBUF(&sci->sc_segbufs)->sb_super_root; |
---|
| 992 | + |
---|
| 993 | + lock_buffer(bh_sr); |
---|
959 | 994 | raw_sr = (struct nilfs_super_root *)bh_sr->b_data; |
---|
960 | 995 | isz = nilfs->ns_inode_size; |
---|
961 | 996 | srsz = NILFS_SR_BYTES(isz); |
---|
962 | 997 | |
---|
| 998 | + raw_sr->sr_sum = 0; /* Ensure initialization within this update */ |
---|
963 | 999 | raw_sr->sr_bytes = cpu_to_le16(srsz); |
---|
964 | 1000 | raw_sr->sr_nongc_ctime |
---|
965 | 1001 | = cpu_to_le64(nilfs_doing_gc() ? |
---|
.. | .. |
---|
973 | 1009 | nilfs_write_inode_common(nilfs->ns_sufile, (void *)raw_sr + |
---|
974 | 1010 | NILFS_SR_SUFILE_OFFSET(isz), 1); |
---|
975 | 1011 | memset((void *)raw_sr + srsz, 0, nilfs->ns_blocksize - srsz); |
---|
| 1012 | + set_buffer_uptodate(bh_sr); |
---|
| 1013 | + unlock_buffer(bh_sr); |
---|
976 | 1014 | } |
---|
977 | 1015 | |
---|
978 | 1016 | static void nilfs_redirty_inodes(struct list_head *head) |
---|
.. | .. |
---|
1138 | 1176 | nilfs_sc_cstage_set(sci, NILFS_ST_DAT); |
---|
1139 | 1177 | goto dat_stage; |
---|
1140 | 1178 | } |
---|
1141 | | - nilfs_sc_cstage_inc(sci); /* Fall through */ |
---|
| 1179 | + nilfs_sc_cstage_inc(sci); |
---|
| 1180 | + fallthrough; |
---|
1142 | 1181 | case NILFS_ST_GC: |
---|
1143 | 1182 | if (nilfs_doing_gc()) { |
---|
1144 | 1183 | head = &sci->sc_gc_inodes; |
---|
.. | .. |
---|
1159 | 1198 | } |
---|
1160 | 1199 | sci->sc_stage.gc_inode_ptr = NULL; |
---|
1161 | 1200 | } |
---|
1162 | | - nilfs_sc_cstage_inc(sci); /* Fall through */ |
---|
| 1201 | + nilfs_sc_cstage_inc(sci); |
---|
| 1202 | + fallthrough; |
---|
1163 | 1203 | case NILFS_ST_FILE: |
---|
1164 | 1204 | head = &sci->sc_dirty_files; |
---|
1165 | 1205 | ii = list_prepare_entry(sci->sc_stage.dirty_file_ptr, head, |
---|
.. | .. |
---|
1186 | 1226 | } |
---|
1187 | 1227 | nilfs_sc_cstage_inc(sci); |
---|
1188 | 1228 | sci->sc_stage.flags |= NILFS_CF_IFILE_STARTED; |
---|
1189 | | - /* Fall through */ |
---|
| 1229 | + fallthrough; |
---|
1190 | 1230 | case NILFS_ST_IFILE: |
---|
1191 | 1231 | err = nilfs_segctor_scan_file(sci, sci->sc_root->ifile, |
---|
1192 | 1232 | &nilfs_sc_file_ops); |
---|
.. | .. |
---|
1197 | 1237 | err = nilfs_segctor_create_checkpoint(sci); |
---|
1198 | 1238 | if (unlikely(err)) |
---|
1199 | 1239 | break; |
---|
1200 | | - /* Fall through */ |
---|
| 1240 | + fallthrough; |
---|
1201 | 1241 | case NILFS_ST_CPFILE: |
---|
1202 | 1242 | err = nilfs_segctor_scan_file(sci, nilfs->ns_cpfile, |
---|
1203 | 1243 | &nilfs_sc_file_ops); |
---|
1204 | 1244 | if (unlikely(err)) |
---|
1205 | 1245 | break; |
---|
1206 | | - nilfs_sc_cstage_inc(sci); /* Fall through */ |
---|
| 1246 | + nilfs_sc_cstage_inc(sci); |
---|
| 1247 | + fallthrough; |
---|
1207 | 1248 | case NILFS_ST_SUFILE: |
---|
1208 | 1249 | err = nilfs_sufile_freev(nilfs->ns_sufile, sci->sc_freesegs, |
---|
1209 | 1250 | sci->sc_nfreesegs, &ndone); |
---|
.. | .. |
---|
1219 | 1260 | &nilfs_sc_file_ops); |
---|
1220 | 1261 | if (unlikely(err)) |
---|
1221 | 1262 | break; |
---|
1222 | | - nilfs_sc_cstage_inc(sci); /* Fall through */ |
---|
| 1263 | + nilfs_sc_cstage_inc(sci); |
---|
| 1264 | + fallthrough; |
---|
1223 | 1265 | case NILFS_ST_DAT: |
---|
1224 | 1266 | dat_stage: |
---|
1225 | 1267 | err = nilfs_segctor_scan_file(sci, nilfs->ns_dat, |
---|
.. | .. |
---|
1230 | 1272 | nilfs_sc_cstage_set(sci, NILFS_ST_DONE); |
---|
1231 | 1273 | return 0; |
---|
1232 | 1274 | } |
---|
1233 | | - nilfs_sc_cstage_inc(sci); /* Fall through */ |
---|
| 1275 | + nilfs_sc_cstage_inc(sci); |
---|
| 1276 | + fallthrough; |
---|
1234 | 1277 | case NILFS_ST_SR: |
---|
1235 | 1278 | if (mode == SC_LSEG_SR) { |
---|
1236 | 1279 | /* Appending a super root */ |
---|
.. | .. |
---|
1522 | 1565 | nadd = min_t(int, nadd << 1, SC_MAX_SEGDELTA); |
---|
1523 | 1566 | sci->sc_stage = prev_stage; |
---|
1524 | 1567 | } |
---|
| 1568 | + nilfs_segctor_zeropad_segsum(sci); |
---|
1525 | 1569 | nilfs_segctor_truncate_segments(sci, sci->sc_curseg, nilfs->ns_sufile); |
---|
1526 | 1570 | return 0; |
---|
1527 | 1571 | |
---|
.. | .. |
---|
1749 | 1793 | list_for_each_entry(segbuf, logs, sb_list) { |
---|
1750 | 1794 | list_for_each_entry(bh, &segbuf->sb_segsum_buffers, |
---|
1751 | 1795 | b_assoc_buffers) { |
---|
| 1796 | + clear_buffer_uptodate(bh); |
---|
1752 | 1797 | if (bh->b_page != bd_page) { |
---|
1753 | 1798 | if (bd_page) |
---|
1754 | 1799 | end_page_writeback(bd_page); |
---|
.. | .. |
---|
1760 | 1805 | b_assoc_buffers) { |
---|
1761 | 1806 | clear_buffer_async_write(bh); |
---|
1762 | 1807 | if (bh == segbuf->sb_super_root) { |
---|
| 1808 | + clear_buffer_uptodate(bh); |
---|
1763 | 1809 | if (bh->b_page != bd_page) { |
---|
1764 | 1810 | end_page_writeback(bd_page); |
---|
1765 | 1811 | bd_page = bh->b_page; |
---|
.. | .. |
---|
1940 | 1986 | err = nilfs_ifile_get_inode_block( |
---|
1941 | 1987 | ifile, ii->vfs_inode.i_ino, &ibh); |
---|
1942 | 1988 | if (unlikely(err)) { |
---|
1943 | | - nilfs_msg(sci->sc_super, KERN_WARNING, |
---|
1944 | | - "log writer: error %d getting inode block (ino=%lu)", |
---|
1945 | | - err, ii->vfs_inode.i_ino); |
---|
| 1989 | + nilfs_warn(sci->sc_super, |
---|
| 1990 | + "log writer: error %d getting inode block (ino=%lu)", |
---|
| 1991 | + err, ii->vfs_inode.i_ino); |
---|
1946 | 1992 | return err; |
---|
1947 | 1993 | } |
---|
1948 | 1994 | spin_lock(&nilfs->ns_inode_lock); |
---|
.. | .. |
---|
2009 | 2055 | { |
---|
2010 | 2056 | struct the_nilfs *nilfs = sci->sc_super->s_fs_info; |
---|
2011 | 2057 | int err; |
---|
| 2058 | + |
---|
| 2059 | + if (sb_rdonly(sci->sc_super)) |
---|
| 2060 | + return -EROFS; |
---|
2012 | 2061 | |
---|
2013 | 2062 | nilfs_sc_cstage_set(sci, NILFS_ST_INIT); |
---|
2014 | 2063 | sci->sc_cno = nilfs->ns_cno; |
---|
.. | .. |
---|
2234 | 2283 | struct nilfs_transaction_info *ti; |
---|
2235 | 2284 | int err; |
---|
2236 | 2285 | |
---|
2237 | | - if (!sci) |
---|
| 2286 | + if (sb_rdonly(sb) || unlikely(!sci)) |
---|
2238 | 2287 | return -EROFS; |
---|
2239 | 2288 | |
---|
2240 | 2289 | /* A call inside transactions causes a deadlock. */ |
---|
.. | .. |
---|
2273 | 2322 | struct nilfs_transaction_info ti; |
---|
2274 | 2323 | int err = 0; |
---|
2275 | 2324 | |
---|
2276 | | - if (!sci) |
---|
| 2325 | + if (sb_rdonly(sb) || unlikely(!sci)) |
---|
2277 | 2326 | return -EROFS; |
---|
2278 | 2327 | |
---|
2279 | 2328 | nilfs_transaction_lock(sb, &ti, 0); |
---|
.. | .. |
---|
2410 | 2459 | continue; |
---|
2411 | 2460 | list_del_init(&ii->i_dirty); |
---|
2412 | 2461 | truncate_inode_pages(&ii->vfs_inode.i_data, 0); |
---|
2413 | | - nilfs_btnode_cache_clear(&ii->i_btnode_cache); |
---|
| 2462 | + nilfs_btnode_cache_clear(ii->i_assoc_inode->i_mapping); |
---|
2414 | 2463 | iput(&ii->vfs_inode); |
---|
2415 | 2464 | } |
---|
2416 | 2465 | } |
---|
.. | .. |
---|
2449 | 2498 | if (likely(!err)) |
---|
2450 | 2499 | break; |
---|
2451 | 2500 | |
---|
2452 | | - nilfs_msg(sb, KERN_WARNING, "error %d cleaning segments", err); |
---|
| 2501 | + nilfs_warn(sb, "error %d cleaning segments", err); |
---|
2453 | 2502 | set_current_state(TASK_INTERRUPTIBLE); |
---|
2454 | 2503 | schedule_timeout(sci->sc_interval); |
---|
2455 | 2504 | } |
---|
.. | .. |
---|
2457 | 2506 | int ret = nilfs_discard_segments(nilfs, sci->sc_freesegs, |
---|
2458 | 2507 | sci->sc_nfreesegs); |
---|
2459 | 2508 | if (ret) { |
---|
2460 | | - nilfs_msg(sb, KERN_WARNING, |
---|
2461 | | - "error %d on discard request, turning discards off for the device", |
---|
2462 | | - ret); |
---|
| 2509 | + nilfs_warn(sb, |
---|
| 2510 | + "error %d on discard request, turning discards off for the device", |
---|
| 2511 | + ret); |
---|
2463 | 2512 | nilfs_clear_opt(nilfs, DISCARD); |
---|
2464 | 2513 | } |
---|
2465 | 2514 | } |
---|
.. | .. |
---|
2540 | 2589 | /* start sync. */ |
---|
2541 | 2590 | sci->sc_task = current; |
---|
2542 | 2591 | wake_up(&sci->sc_wait_task); /* for nilfs_segctor_start_thread() */ |
---|
2543 | | - nilfs_msg(sci->sc_super, KERN_INFO, |
---|
2544 | | - "segctord starting. Construction interval = %lu seconds, CP frequency < %lu seconds", |
---|
2545 | | - sci->sc_interval / HZ, sci->sc_mjcp_freq / HZ); |
---|
| 2592 | + nilfs_info(sci->sc_super, |
---|
| 2593 | + "segctord starting. Construction interval = %lu seconds, CP frequency < %lu seconds", |
---|
| 2594 | + sci->sc_interval / HZ, sci->sc_mjcp_freq / HZ); |
---|
2546 | 2595 | |
---|
2547 | 2596 | spin_lock(&sci->sc_state_lock); |
---|
2548 | 2597 | loop: |
---|
.. | .. |
---|
2600 | 2649 | goto loop; |
---|
2601 | 2650 | |
---|
2602 | 2651 | end_thread: |
---|
2603 | | - spin_unlock(&sci->sc_state_lock); |
---|
2604 | | - |
---|
2605 | 2652 | /* end sync. */ |
---|
2606 | 2653 | sci->sc_task = NULL; |
---|
2607 | 2654 | wake_up(&sci->sc_wait_task); /* for nilfs_segctor_kill_thread() */ |
---|
| 2655 | + spin_unlock(&sci->sc_state_lock); |
---|
2608 | 2656 | return 0; |
---|
2609 | 2657 | } |
---|
2610 | 2658 | |
---|
.. | .. |
---|
2616 | 2664 | if (IS_ERR(t)) { |
---|
2617 | 2665 | int err = PTR_ERR(t); |
---|
2618 | 2666 | |
---|
2619 | | - nilfs_msg(sci->sc_super, KERN_ERR, |
---|
2620 | | - "error %d creating segctord thread", err); |
---|
| 2667 | + nilfs_err(sci->sc_super, "error %d creating segctord thread", |
---|
| 2668 | + err); |
---|
2621 | 2669 | return err; |
---|
2622 | 2670 | } |
---|
2623 | 2671 | wait_event(sci->sc_wait_task, sci->sc_task != NULL); |
---|
.. | .. |
---|
2696 | 2744 | |
---|
2697 | 2745 | flush_work(&sci->sc_iput_work); |
---|
2698 | 2746 | |
---|
2699 | | - } while (ret && retrycount-- > 0); |
---|
| 2747 | + } while (ret && ret != -EROFS && retrycount-- > 0); |
---|
2700 | 2748 | } |
---|
2701 | 2749 | |
---|
2702 | 2750 | /** |
---|
.. | .. |
---|
2727 | 2775 | nilfs_segctor_write_out(sci); |
---|
2728 | 2776 | |
---|
2729 | 2777 | if (!list_empty(&sci->sc_dirty_files)) { |
---|
2730 | | - nilfs_msg(sci->sc_super, KERN_WARNING, |
---|
2731 | | - "disposed unprocessed dirty file(s) when stopping log writer"); |
---|
| 2778 | + nilfs_warn(sci->sc_super, |
---|
| 2779 | + "disposed unprocessed dirty file(s) when stopping log writer"); |
---|
2732 | 2780 | nilfs_dispose_list(nilfs, &sci->sc_dirty_files, 1); |
---|
2733 | 2781 | } |
---|
2734 | 2782 | |
---|
2735 | 2783 | if (!list_empty(&sci->sc_iput_queue)) { |
---|
2736 | | - nilfs_msg(sci->sc_super, KERN_WARNING, |
---|
2737 | | - "disposed unprocessed inode(s) in iput queue when stopping log writer"); |
---|
| 2784 | + nilfs_warn(sci->sc_super, |
---|
| 2785 | + "disposed unprocessed inode(s) in iput queue when stopping log writer"); |
---|
2738 | 2786 | nilfs_dispose_list(nilfs, &sci->sc_iput_queue, 1); |
---|
2739 | 2787 | } |
---|
2740 | 2788 | |
---|
.. | .. |
---|
2769 | 2817 | |
---|
2770 | 2818 | if (nilfs->ns_writer) { |
---|
2771 | 2819 | /* |
---|
2772 | | - * This happens if the filesystem was remounted |
---|
2773 | | - * read/write after nilfs_error degenerated it into a |
---|
2774 | | - * read-only mount. |
---|
| 2820 | + * This happens if the filesystem is made read-only by |
---|
| 2821 | + * __nilfs_error or nilfs_remount and then remounted |
---|
| 2822 | + * read/write. In these cases, reuse the existing |
---|
| 2823 | + * writer. |
---|
2775 | 2824 | */ |
---|
2776 | | - nilfs_detach_log_writer(sb); |
---|
| 2825 | + return 0; |
---|
2777 | 2826 | } |
---|
2778 | 2827 | |
---|
2779 | 2828 | nilfs->ns_writer = nilfs_segctor_new(sb, root); |
---|
.. | .. |
---|
2783 | 2832 | inode_attach_wb(nilfs->ns_bdev->bd_inode, NULL); |
---|
2784 | 2833 | |
---|
2785 | 2834 | err = nilfs_segctor_start_thread(nilfs->ns_writer); |
---|
2786 | | - if (err) { |
---|
2787 | | - kfree(nilfs->ns_writer); |
---|
2788 | | - nilfs->ns_writer = NULL; |
---|
2789 | | - } |
---|
| 2835 | + if (unlikely(err)) |
---|
| 2836 | + nilfs_detach_log_writer(sb); |
---|
| 2837 | + |
---|
2790 | 2838 | return err; |
---|
2791 | 2839 | } |
---|
2792 | 2840 | |
---|
.. | .. |
---|
2807 | 2855 | nilfs_segctor_destroy(nilfs->ns_writer); |
---|
2808 | 2856 | nilfs->ns_writer = NULL; |
---|
2809 | 2857 | } |
---|
| 2858 | + set_nilfs_purging(nilfs); |
---|
2810 | 2859 | |
---|
2811 | 2860 | /* Force to free the list of dirty files */ |
---|
2812 | 2861 | spin_lock(&nilfs->ns_inode_lock); |
---|
2813 | 2862 | if (!list_empty(&nilfs->ns_dirty_files)) { |
---|
2814 | 2863 | list_splice_init(&nilfs->ns_dirty_files, &garbage_list); |
---|
2815 | | - nilfs_msg(sb, KERN_WARNING, |
---|
2816 | | - "disposed unprocessed dirty file(s) when detaching log writer"); |
---|
| 2864 | + nilfs_warn(sb, |
---|
| 2865 | + "disposed unprocessed dirty file(s) when detaching log writer"); |
---|
2817 | 2866 | } |
---|
2818 | 2867 | spin_unlock(&nilfs->ns_inode_lock); |
---|
2819 | 2868 | up_write(&nilfs->ns_segctor_sem); |
---|
2820 | 2869 | |
---|
2821 | 2870 | nilfs_dispose_list(nilfs, &garbage_list, 1); |
---|
| 2871 | + clear_nilfs_purging(nilfs); |
---|
2822 | 2872 | } |
---|