checkpoint.c (a3479c7fc096a1a7a2dccbfbdc6fcf86b805711a) | checkpoint.c (af697c0f5c5b8798832e651baf23460d588393de) |
---|---|
1/* 2 * fs/f2fs/checkpoint.c 3 * 4 * Copyright (c) 2012 Samsung Electronics Co., Ltd. 5 * http://www.samsung.com/ 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License version 2 as --- 228 unchanged lines hidden (view full) --- 237static int __f2fs_write_meta_page(struct page *page, 238 struct writeback_control *wbc, 239 enum iostat_type io_type) 240{ 241 struct f2fs_sb_info *sbi = F2FS_P_SB(page); 242 243 trace_f2fs_writepage(page, META); 244 | 1/* 2 * fs/f2fs/checkpoint.c 3 * 4 * Copyright (c) 2012 Samsung Electronics Co., Ltd. 5 * http://www.samsung.com/ 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License version 2 as --- 228 unchanged lines hidden (view full) --- 237static int __f2fs_write_meta_page(struct page *page, 238 struct writeback_control *wbc, 239 enum iostat_type io_type) 240{ 241 struct f2fs_sb_info *sbi = F2FS_P_SB(page); 242 243 trace_f2fs_writepage(page, META); 244 |
245 if (unlikely(f2fs_cp_error(sbi))) { 246 dec_page_count(sbi, F2FS_DIRTY_META); 247 unlock_page(page); 248 return 0; 249 } | 245 if (unlikely(f2fs_cp_error(sbi))) 246 goto redirty_out; |
250 if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING))) 251 goto redirty_out; 252 if (wbc->for_reclaim && page->index < GET_SUM_BLOCK(sbi, 0)) 253 goto redirty_out; 254 255 f2fs_do_write_meta_page(sbi, page, io_type); 256 dec_page_count(sbi, F2FS_DIRTY_META); 257 --- 866 unchanged lines hidden (view full) --- 1124 DEFINE_WAIT(wait); 1125 1126 for (;;) { 1127 prepare_to_wait(&sbi->cp_wait, &wait, TASK_UNINTERRUPTIBLE); 1128 1129 if (!get_pages(sbi, F2FS_WB_CP_DATA)) 1130 break; 1131 | 247 if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING))) 248 goto redirty_out; 249 if (wbc->for_reclaim && page->index < GET_SUM_BLOCK(sbi, 0)) 250 goto redirty_out; 251 252 f2fs_do_write_meta_page(sbi, page, io_type); 253 dec_page_count(sbi, F2FS_DIRTY_META); 254 --- 866 unchanged lines hidden (view full) --- 1121 DEFINE_WAIT(wait); 1122 1123 for (;;) { 1124 prepare_to_wait(&sbi->cp_wait, &wait, TASK_UNINTERRUPTIBLE); 1125 1126 if (!get_pages(sbi, F2FS_WB_CP_DATA)) 1127 break; 1128 |
1129 if (unlikely(f2fs_cp_error(sbi))) 1130 break; 1131 |
|
1132 io_schedule_timeout(5*HZ); 1133 } 1134 finish_wait(&sbi->cp_wait, &wait); 1135} 1136 1137static void update_ckpt_flags(struct f2fs_sb_info *sbi, struct cp_control *cpc) 1138{ 1139 unsigned long orphan_num = sbi->im[ORPHAN_INO].ino_num; --- 57 unchanged lines hidden (view full) --- 1197 1198 f2fs_wait_on_page_writeback(page, META, true); 1199 f2fs_bug_on(sbi, PageWriteback(page)); 1200 if (unlikely(!clear_page_dirty_for_io(page))) 1201 f2fs_bug_on(sbi, 1); 1202 1203 /* writeout cp pack 2 page */ 1204 err = __f2fs_write_meta_page(page, &wbc, FS_CP_META_IO); | 1132 io_schedule_timeout(5*HZ); 1133 } 1134 finish_wait(&sbi->cp_wait, &wait); 1135} 1136 1137static void update_ckpt_flags(struct f2fs_sb_info *sbi, struct cp_control *cpc) 1138{ 1139 unsigned long orphan_num = sbi->im[ORPHAN_INO].ino_num; --- 57 unchanged lines hidden (view full) --- 1197 1198 f2fs_wait_on_page_writeback(page, META, true); 1199 f2fs_bug_on(sbi, PageWriteback(page)); 1200 if (unlikely(!clear_page_dirty_for_io(page))) 1201 f2fs_bug_on(sbi, 1); 1202 1203 /* writeout cp pack 2 page */ 1204 err = __f2fs_write_meta_page(page, &wbc, FS_CP_META_IO); |
1205 f2fs_bug_on(sbi, err); | 1205 if (unlikely(err && f2fs_cp_error(sbi))) { 1206 f2fs_put_page(page, 1); 1207 return; 1208 } |
1206 | 1209 |
1210 f2fs_bug_on(sbi, err); |
|
1207 f2fs_put_page(page, 0); 1208 1209 /* submit checkpoint (with barrier if NOBARRIER is not set) */ 1210 f2fs_submit_merged_write(sbi, META_FLUSH); 1211} 1212 1213static int do_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc) 1214{ --- 9 unchanged lines hidden (view full) --- 1224 struct curseg_info *seg_i = CURSEG_I(sbi, CURSEG_HOT_NODE); 1225 u64 kbytes_written; 1226 int err; 1227 1228 /* Flush all the NAT/SIT pages */ 1229 while (get_pages(sbi, F2FS_DIRTY_META)) { 1230 f2fs_sync_meta_pages(sbi, META, LONG_MAX, FS_CP_META_IO); 1231 if (unlikely(f2fs_cp_error(sbi))) | 1211 f2fs_put_page(page, 0); 1212 1213 /* submit checkpoint (with barrier if NOBARRIER is not set) */ 1214 f2fs_submit_merged_write(sbi, META_FLUSH); 1215} 1216 1217static int do_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc) 1218{ --- 9 unchanged lines hidden (view full) --- 1228 struct curseg_info *seg_i = CURSEG_I(sbi, CURSEG_HOT_NODE); 1229 u64 kbytes_written; 1230 int err; 1231 1232 /* Flush all the NAT/SIT pages */ 1233 while (get_pages(sbi, F2FS_DIRTY_META)) { 1234 f2fs_sync_meta_pages(sbi, META, LONG_MAX, FS_CP_META_IO); 1235 if (unlikely(f2fs_cp_error(sbi))) |
1232 return -EIO; | 1236 break; |
1233 } 1234 1235 /* 1236 * modify checkpoint 1237 * version number is already updated 1238 */ 1239 ckpt->elapsed_time = cpu_to_le64(get_mtime(sbi, true)); 1240 ckpt->free_segment_count = cpu_to_le32(free_segments(sbi)); --- 63 unchanged lines hidden (view full) --- 1304 f2fs_update_meta_page(sbi, nm_i->nat_bits + 1305 (i << F2FS_BLKSIZE_BITS), blk + i); 1306 1307 /* Flush all the NAT BITS pages */ 1308 while (get_pages(sbi, F2FS_DIRTY_META)) { 1309 f2fs_sync_meta_pages(sbi, META, LONG_MAX, 1310 FS_CP_META_IO); 1311 if (unlikely(f2fs_cp_error(sbi))) | 1237 } 1238 1239 /* 1240 * modify checkpoint 1241 * version number is already updated 1242 */ 1243 ckpt->elapsed_time = cpu_to_le64(get_mtime(sbi, true)); 1244 ckpt->free_segment_count = cpu_to_le32(free_segments(sbi)); --- 63 unchanged lines hidden (view full) --- 1308 f2fs_update_meta_page(sbi, nm_i->nat_bits + 1309 (i << F2FS_BLKSIZE_BITS), blk + i); 1310 1311 /* Flush all the NAT BITS pages */ 1312 while (get_pages(sbi, F2FS_DIRTY_META)) { 1313 f2fs_sync_meta_pages(sbi, META, LONG_MAX, 1314 FS_CP_META_IO); 1315 if (unlikely(f2fs_cp_error(sbi))) |
1312 return -EIO; | 1316 break; |
1313 } 1314 } 1315 1316 /* write out checkpoint buffer at block 0 */ 1317 f2fs_update_meta_page(sbi, ckpt, start_blk++); 1318 1319 for (i = 1; i < 1 + cp_payload_blks; i++) 1320 f2fs_update_meta_page(sbi, (char *)ckpt + i * F2FS_BLKSIZE, --- 24 unchanged lines hidden (view full) --- 1345 percpu_counter_set(&sbi->alloc_valid_block_count, 0); 1346 1347 /* Here, we have one bio having CP pack except cp pack 2 page */ 1348 f2fs_sync_meta_pages(sbi, META, LONG_MAX, FS_CP_META_IO); 1349 1350 /* wait for previous submitted meta pages writeback */ 1351 wait_on_all_pages_writeback(sbi); 1352 | 1317 } 1318 } 1319 1320 /* write out checkpoint buffer at block 0 */ 1321 f2fs_update_meta_page(sbi, ckpt, start_blk++); 1322 1323 for (i = 1; i < 1 + cp_payload_blks; i++) 1324 f2fs_update_meta_page(sbi, (char *)ckpt + i * F2FS_BLKSIZE, --- 24 unchanged lines hidden (view full) --- 1349 percpu_counter_set(&sbi->alloc_valid_block_count, 0); 1350 1351 /* Here, we have one bio having CP pack except cp pack 2 page */ 1352 f2fs_sync_meta_pages(sbi, META, LONG_MAX, FS_CP_META_IO); 1353 1354 /* wait for previous submitted meta pages writeback */ 1355 wait_on_all_pages_writeback(sbi); 1356 |
1353 if (unlikely(f2fs_cp_error(sbi))) 1354 return -EIO; 1355 | |
1356 /* flush all device cache */ 1357 err = f2fs_flush_device_cache(sbi); 1358 if (err) 1359 return err; 1360 1361 /* barrier and flush checkpoint cp pack 2 page if it can */ 1362 commit_checkpoint(sbi, ckpt, start_blk); 1363 wait_on_all_pages_writeback(sbi); 1364 1365 f2fs_release_ino_entry(sbi, false); 1366 | 1357 /* flush all device cache */ 1358 err = f2fs_flush_device_cache(sbi); 1359 if (err) 1360 return err; 1361 1362 /* barrier and flush checkpoint cp pack 2 page if it can */ 1363 commit_checkpoint(sbi, ckpt, start_blk); 1364 wait_on_all_pages_writeback(sbi); 1365 1366 f2fs_release_ino_entry(sbi, false); 1367 |
1367 if (unlikely(f2fs_cp_error(sbi))) 1368 return -EIO; 1369 | |
1370 clear_sbi_flag(sbi, SBI_IS_DIRTY); 1371 clear_sbi_flag(sbi, SBI_NEED_CP); 1372 __set_cp_next_pack(sbi); 1373 1374 /* 1375 * redirty superblock if metadata like node page or inode cache is 1376 * updated during writing checkpoint. 1377 */ 1378 if (get_pages(sbi, F2FS_DIRTY_NODES) || 1379 get_pages(sbi, F2FS_DIRTY_IMETA)) 1380 set_sbi_flag(sbi, SBI_IS_DIRTY); 1381 1382 f2fs_bug_on(sbi, get_pages(sbi, F2FS_DIRTY_DENTS)); 1383 | 1368 clear_sbi_flag(sbi, SBI_IS_DIRTY); 1369 clear_sbi_flag(sbi, SBI_NEED_CP); 1370 __set_cp_next_pack(sbi); 1371 1372 /* 1373 * redirty superblock if metadata like node page or inode cache is 1374 * updated during writing checkpoint. 1375 */ 1376 if (get_pages(sbi, F2FS_DIRTY_NODES) || 1377 get_pages(sbi, F2FS_DIRTY_IMETA)) 1378 set_sbi_flag(sbi, SBI_IS_DIRTY); 1379 1380 f2fs_bug_on(sbi, get_pages(sbi, F2FS_DIRTY_DENTS)); 1381 |
1384 return 0; | 1382 return unlikely(f2fs_cp_error(sbi)) ? -EIO : 0; |
1385} 1386 1387/* 1388 * We guarantee that this checkpoint procedure will not fail. 1389 */ 1390int f2fs_write_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc) 1391{ 1392 struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi); --- 117 unchanged lines hidden --- | 1383} 1384 1385/* 1386 * We guarantee that this checkpoint procedure will not fail. 1387 */ 1388int f2fs_write_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc) 1389{ 1390 struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi); --- 117 unchanged lines hidden --- |