diff options
Diffstat (limited to 'fs/f2fs/node.c')
-rw-r--r-- | fs/f2fs/node.c | 560 |
1 files changed, 436 insertions, 124 deletions
diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c index b9078fdb3743..94967171dee8 100644 --- a/fs/f2fs/node.c +++ b/fs/f2fs/node.c | |||
@@ -245,12 +245,24 @@ bool need_inode_block_update(struct f2fs_sb_info *sbi, nid_t ino) | |||
245 | return need_update; | 245 | return need_update; |
246 | } | 246 | } |
247 | 247 | ||
248 | static struct nat_entry *grab_nat_entry(struct f2fs_nm_info *nm_i, nid_t nid) | 248 | static struct nat_entry *grab_nat_entry(struct f2fs_nm_info *nm_i, nid_t nid, |
249 | bool no_fail) | ||
249 | { | 250 | { |
250 | struct nat_entry *new; | 251 | struct nat_entry *new; |
251 | 252 | ||
252 | new = f2fs_kmem_cache_alloc(nat_entry_slab, GFP_NOFS); | 253 | if (no_fail) { |
253 | f2fs_radix_tree_insert(&nm_i->nat_root, nid, new); | 254 | new = f2fs_kmem_cache_alloc(nat_entry_slab, GFP_NOFS); |
255 | f2fs_radix_tree_insert(&nm_i->nat_root, nid, new); | ||
256 | } else { | ||
257 | new = kmem_cache_alloc(nat_entry_slab, GFP_NOFS); | ||
258 | if (!new) | ||
259 | return NULL; | ||
260 | if (radix_tree_insert(&nm_i->nat_root, nid, new)) { | ||
261 | kmem_cache_free(nat_entry_slab, new); | ||
262 | return NULL; | ||
263 | } | ||
264 | } | ||
265 | |||
254 | memset(new, 0, sizeof(struct nat_entry)); | 266 | memset(new, 0, sizeof(struct nat_entry)); |
255 | nat_set_nid(new, nid); | 267 | nat_set_nid(new, nid); |
256 | nat_reset_flag(new); | 268 | nat_reset_flag(new); |
@@ -267,8 +279,9 @@ static void cache_nat_entry(struct f2fs_sb_info *sbi, nid_t nid, | |||
267 | 279 | ||
268 | e = __lookup_nat_cache(nm_i, nid); | 280 | e = __lookup_nat_cache(nm_i, nid); |
269 | if (!e) { | 281 | if (!e) { |
270 | e = grab_nat_entry(nm_i, nid); | 282 | e = grab_nat_entry(nm_i, nid, false); |
271 | node_info_from_raw_nat(&e->ni, ne); | 283 | if (e) |
284 | node_info_from_raw_nat(&e->ni, ne); | ||
272 | } else { | 285 | } else { |
273 | f2fs_bug_on(sbi, nat_get_ino(e) != le32_to_cpu(ne->ino) || | 286 | f2fs_bug_on(sbi, nat_get_ino(e) != le32_to_cpu(ne->ino) || |
274 | nat_get_blkaddr(e) != | 287 | nat_get_blkaddr(e) != |
@@ -286,7 +299,7 @@ static void set_node_addr(struct f2fs_sb_info *sbi, struct node_info *ni, | |||
286 | down_write(&nm_i->nat_tree_lock); | 299 | down_write(&nm_i->nat_tree_lock); |
287 | e = __lookup_nat_cache(nm_i, ni->nid); | 300 | e = __lookup_nat_cache(nm_i, ni->nid); |
288 | if (!e) { | 301 | if (!e) { |
289 | e = grab_nat_entry(nm_i, ni->nid); | 302 | e = grab_nat_entry(nm_i, ni->nid, true); |
290 | copy_node_info(&e->ni, ni); | 303 | copy_node_info(&e->ni, ni); |
291 | f2fs_bug_on(sbi, ni->blk_addr == NEW_ADDR); | 304 | f2fs_bug_on(sbi, ni->blk_addr == NEW_ADDR); |
292 | } else if (new_blkaddr == NEW_ADDR) { | 305 | } else if (new_blkaddr == NEW_ADDR) { |
@@ -325,6 +338,9 @@ static void set_node_addr(struct f2fs_sb_info *sbi, struct node_info *ni, | |||
325 | set_nat_flag(e, IS_CHECKPOINTED, false); | 338 | set_nat_flag(e, IS_CHECKPOINTED, false); |
326 | __set_nat_cache_dirty(nm_i, e); | 339 | __set_nat_cache_dirty(nm_i, e); |
327 | 340 | ||
341 | if (enabled_nat_bits(sbi, NULL) && new_blkaddr == NEW_ADDR) | ||
342 | clear_bit_le(NAT_BLOCK_OFFSET(ni->nid), nm_i->empty_nat_bits); | ||
343 | |||
328 | /* update fsync_mark if its inode nat entry is still alive */ | 344 | /* update fsync_mark if its inode nat entry is still alive */ |
329 | if (ni->nid != ni->ino) | 345 | if (ni->nid != ni->ino) |
330 | e = __lookup_nat_cache(nm_i, ni->ino); | 346 | e = __lookup_nat_cache(nm_i, ni->ino); |
@@ -958,9 +974,6 @@ int truncate_xattr_node(struct inode *inode, struct page *page) | |||
958 | 974 | ||
959 | f2fs_i_xnid_write(inode, 0); | 975 | f2fs_i_xnid_write(inode, 0); |
960 | 976 | ||
961 | /* need to do checkpoint during fsync */ | ||
962 | F2FS_I(inode)->xattr_ver = cur_cp_version(F2FS_CKPT(sbi)); | ||
963 | |||
964 | set_new_dnode(&dn, inode, page, npage, nid); | 977 | set_new_dnode(&dn, inode, page, npage, nid); |
965 | 978 | ||
966 | if (page) | 979 | if (page) |
@@ -1018,7 +1031,7 @@ struct page *new_node_page(struct dnode_of_data *dn, | |||
1018 | unsigned int ofs, struct page *ipage) | 1031 | unsigned int ofs, struct page *ipage) |
1019 | { | 1032 | { |
1020 | struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode); | 1033 | struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode); |
1021 | struct node_info old_ni, new_ni; | 1034 | struct node_info new_ni; |
1022 | struct page *page; | 1035 | struct page *page; |
1023 | int err; | 1036 | int err; |
1024 | 1037 | ||
@@ -1033,13 +1046,15 @@ struct page *new_node_page(struct dnode_of_data *dn, | |||
1033 | err = -ENOSPC; | 1046 | err = -ENOSPC; |
1034 | goto fail; | 1047 | goto fail; |
1035 | } | 1048 | } |
1036 | 1049 | #ifdef CONFIG_F2FS_CHECK_FS | |
1037 | get_node_info(sbi, dn->nid, &old_ni); | 1050 | get_node_info(sbi, dn->nid, &new_ni); |
1038 | 1051 | f2fs_bug_on(sbi, new_ni.blk_addr != NULL_ADDR); | |
1039 | /* Reinitialize old_ni with new node page */ | 1052 | #endif |
1040 | f2fs_bug_on(sbi, old_ni.blk_addr != NULL_ADDR); | 1053 | new_ni.nid = dn->nid; |
1041 | new_ni = old_ni; | ||
1042 | new_ni.ino = dn->inode->i_ino; | 1054 | new_ni.ino = dn->inode->i_ino; |
1055 | new_ni.blk_addr = NULL_ADDR; | ||
1056 | new_ni.flag = 0; | ||
1057 | new_ni.version = 0; | ||
1043 | set_node_addr(sbi, &new_ni, NEW_ADDR, false); | 1058 | set_node_addr(sbi, &new_ni, NEW_ADDR, false); |
1044 | 1059 | ||
1045 | f2fs_wait_on_page_writeback(page, NODE, true); | 1060 | f2fs_wait_on_page_writeback(page, NODE, true); |
@@ -1305,16 +1320,99 @@ continue_unlock: | |||
1305 | return last_page; | 1320 | return last_page; |
1306 | } | 1321 | } |
1307 | 1322 | ||
1323 | static int __write_node_page(struct page *page, bool atomic, bool *submitted, | ||
1324 | struct writeback_control *wbc) | ||
1325 | { | ||
1326 | struct f2fs_sb_info *sbi = F2FS_P_SB(page); | ||
1327 | nid_t nid; | ||
1328 | struct node_info ni; | ||
1329 | struct f2fs_io_info fio = { | ||
1330 | .sbi = sbi, | ||
1331 | .type = NODE, | ||
1332 | .op = REQ_OP_WRITE, | ||
1333 | .op_flags = wbc_to_write_flags(wbc), | ||
1334 | .page = page, | ||
1335 | .encrypted_page = NULL, | ||
1336 | .submitted = false, | ||
1337 | }; | ||
1338 | |||
1339 | trace_f2fs_writepage(page, NODE); | ||
1340 | |||
1341 | if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING))) | ||
1342 | goto redirty_out; | ||
1343 | if (unlikely(f2fs_cp_error(sbi))) | ||
1344 | goto redirty_out; | ||
1345 | |||
1346 | /* get old block addr of this node page */ | ||
1347 | nid = nid_of_node(page); | ||
1348 | f2fs_bug_on(sbi, page->index != nid); | ||
1349 | |||
1350 | if (wbc->for_reclaim) { | ||
1351 | if (!down_read_trylock(&sbi->node_write)) | ||
1352 | goto redirty_out; | ||
1353 | } else { | ||
1354 | down_read(&sbi->node_write); | ||
1355 | } | ||
1356 | |||
1357 | get_node_info(sbi, nid, &ni); | ||
1358 | |||
1359 | /* This page is already truncated */ | ||
1360 | if (unlikely(ni.blk_addr == NULL_ADDR)) { | ||
1361 | ClearPageUptodate(page); | ||
1362 | dec_page_count(sbi, F2FS_DIRTY_NODES); | ||
1363 | up_read(&sbi->node_write); | ||
1364 | unlock_page(page); | ||
1365 | return 0; | ||
1366 | } | ||
1367 | |||
1368 | if (atomic && !test_opt(sbi, NOBARRIER)) | ||
1369 | fio.op_flags |= REQ_PREFLUSH | REQ_FUA; | ||
1370 | |||
1371 | set_page_writeback(page); | ||
1372 | fio.old_blkaddr = ni.blk_addr; | ||
1373 | write_node_page(nid, &fio); | ||
1374 | set_node_addr(sbi, &ni, fio.new_blkaddr, is_fsync_dnode(page)); | ||
1375 | dec_page_count(sbi, F2FS_DIRTY_NODES); | ||
1376 | up_read(&sbi->node_write); | ||
1377 | |||
1378 | if (wbc->for_reclaim) { | ||
1379 | f2fs_submit_merged_bio_cond(sbi, page->mapping->host, 0, | ||
1380 | page->index, NODE, WRITE); | ||
1381 | submitted = NULL; | ||
1382 | } | ||
1383 | |||
1384 | unlock_page(page); | ||
1385 | |||
1386 | if (unlikely(f2fs_cp_error(sbi))) { | ||
1387 | f2fs_submit_merged_bio(sbi, NODE, WRITE); | ||
1388 | submitted = NULL; | ||
1389 | } | ||
1390 | if (submitted) | ||
1391 | *submitted = fio.submitted; | ||
1392 | |||
1393 | return 0; | ||
1394 | |||
1395 | redirty_out: | ||
1396 | redirty_page_for_writepage(wbc, page); | ||
1397 | return AOP_WRITEPAGE_ACTIVATE; | ||
1398 | } | ||
1399 | |||
1400 | static int f2fs_write_node_page(struct page *page, | ||
1401 | struct writeback_control *wbc) | ||
1402 | { | ||
1403 | return __write_node_page(page, false, NULL, wbc); | ||
1404 | } | ||
1405 | |||
1308 | int fsync_node_pages(struct f2fs_sb_info *sbi, struct inode *inode, | 1406 | int fsync_node_pages(struct f2fs_sb_info *sbi, struct inode *inode, |
1309 | struct writeback_control *wbc, bool atomic) | 1407 | struct writeback_control *wbc, bool atomic) |
1310 | { | 1408 | { |
1311 | pgoff_t index, end; | 1409 | pgoff_t index, end; |
1410 | pgoff_t last_idx = ULONG_MAX; | ||
1312 | struct pagevec pvec; | 1411 | struct pagevec pvec; |
1313 | int ret = 0; | 1412 | int ret = 0; |
1314 | struct page *last_page = NULL; | 1413 | struct page *last_page = NULL; |
1315 | bool marked = false; | 1414 | bool marked = false; |
1316 | nid_t ino = inode->i_ino; | 1415 | nid_t ino = inode->i_ino; |
1317 | int nwritten = 0; | ||
1318 | 1416 | ||
1319 | if (atomic) { | 1417 | if (atomic) { |
1320 | last_page = last_fsync_dnode(sbi, ino); | 1418 | last_page = last_fsync_dnode(sbi, ino); |
@@ -1336,6 +1434,7 @@ retry: | |||
1336 | 1434 | ||
1337 | for (i = 0; i < nr_pages; i++) { | 1435 | for (i = 0; i < nr_pages; i++) { |
1338 | struct page *page = pvec.pages[i]; | 1436 | struct page *page = pvec.pages[i]; |
1437 | bool submitted = false; | ||
1339 | 1438 | ||
1340 | if (unlikely(f2fs_cp_error(sbi))) { | 1439 | if (unlikely(f2fs_cp_error(sbi))) { |
1341 | f2fs_put_page(last_page, 0); | 1440 | f2fs_put_page(last_page, 0); |
@@ -1384,13 +1483,15 @@ continue_unlock: | |||
1384 | if (!clear_page_dirty_for_io(page)) | 1483 | if (!clear_page_dirty_for_io(page)) |
1385 | goto continue_unlock; | 1484 | goto continue_unlock; |
1386 | 1485 | ||
1387 | ret = NODE_MAPPING(sbi)->a_ops->writepage(page, wbc); | 1486 | ret = __write_node_page(page, atomic && |
1487 | page == last_page, | ||
1488 | &submitted, wbc); | ||
1388 | if (ret) { | 1489 | if (ret) { |
1389 | unlock_page(page); | 1490 | unlock_page(page); |
1390 | f2fs_put_page(last_page, 0); | 1491 | f2fs_put_page(last_page, 0); |
1391 | break; | 1492 | break; |
1392 | } else { | 1493 | } else if (submitted) { |
1393 | nwritten++; | 1494 | last_idx = page->index; |
1394 | } | 1495 | } |
1395 | 1496 | ||
1396 | if (page == last_page) { | 1497 | if (page == last_page) { |
@@ -1416,8 +1517,9 @@ continue_unlock: | |||
1416 | goto retry; | 1517 | goto retry; |
1417 | } | 1518 | } |
1418 | out: | 1519 | out: |
1419 | if (nwritten) | 1520 | if (last_idx != ULONG_MAX) |
1420 | f2fs_submit_merged_bio_cond(sbi, NULL, NULL, ino, NODE, WRITE); | 1521 | f2fs_submit_merged_bio_cond(sbi, NULL, ino, last_idx, |
1522 | NODE, WRITE); | ||
1421 | return ret ? -EIO: 0; | 1523 | return ret ? -EIO: 0; |
1422 | } | 1524 | } |
1423 | 1525 | ||
@@ -1445,6 +1547,7 @@ next_step: | |||
1445 | 1547 | ||
1446 | for (i = 0; i < nr_pages; i++) { | 1548 | for (i = 0; i < nr_pages; i++) { |
1447 | struct page *page = pvec.pages[i]; | 1549 | struct page *page = pvec.pages[i]; |
1550 | bool submitted = false; | ||
1448 | 1551 | ||
1449 | if (unlikely(f2fs_cp_error(sbi))) { | 1552 | if (unlikely(f2fs_cp_error(sbi))) { |
1450 | pagevec_release(&pvec); | 1553 | pagevec_release(&pvec); |
@@ -1498,9 +1601,10 @@ continue_unlock: | |||
1498 | set_fsync_mark(page, 0); | 1601 | set_fsync_mark(page, 0); |
1499 | set_dentry_mark(page, 0); | 1602 | set_dentry_mark(page, 0); |
1500 | 1603 | ||
1501 | if (NODE_MAPPING(sbi)->a_ops->writepage(page, wbc)) | 1604 | ret = __write_node_page(page, false, &submitted, wbc); |
1605 | if (ret) | ||
1502 | unlock_page(page); | 1606 | unlock_page(page); |
1503 | else | 1607 | else if (submitted) |
1504 | nwritten++; | 1608 | nwritten++; |
1505 | 1609 | ||
1506 | if (--wbc->nr_to_write == 0) | 1610 | if (--wbc->nr_to_write == 0) |
@@ -1564,72 +1668,6 @@ int wait_on_node_pages_writeback(struct f2fs_sb_info *sbi, nid_t ino) | |||
1564 | return ret; | 1668 | return ret; |
1565 | } | 1669 | } |
1566 | 1670 | ||
1567 | static int f2fs_write_node_page(struct page *page, | ||
1568 | struct writeback_control *wbc) | ||
1569 | { | ||
1570 | struct f2fs_sb_info *sbi = F2FS_P_SB(page); | ||
1571 | nid_t nid; | ||
1572 | struct node_info ni; | ||
1573 | struct f2fs_io_info fio = { | ||
1574 | .sbi = sbi, | ||
1575 | .type = NODE, | ||
1576 | .op = REQ_OP_WRITE, | ||
1577 | .op_flags = wbc_to_write_flags(wbc), | ||
1578 | .page = page, | ||
1579 | .encrypted_page = NULL, | ||
1580 | }; | ||
1581 | |||
1582 | trace_f2fs_writepage(page, NODE); | ||
1583 | |||
1584 | if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING))) | ||
1585 | goto redirty_out; | ||
1586 | if (unlikely(f2fs_cp_error(sbi))) | ||
1587 | goto redirty_out; | ||
1588 | |||
1589 | /* get old block addr of this node page */ | ||
1590 | nid = nid_of_node(page); | ||
1591 | f2fs_bug_on(sbi, page->index != nid); | ||
1592 | |||
1593 | if (wbc->for_reclaim) { | ||
1594 | if (!down_read_trylock(&sbi->node_write)) | ||
1595 | goto redirty_out; | ||
1596 | } else { | ||
1597 | down_read(&sbi->node_write); | ||
1598 | } | ||
1599 | |||
1600 | get_node_info(sbi, nid, &ni); | ||
1601 | |||
1602 | /* This page is already truncated */ | ||
1603 | if (unlikely(ni.blk_addr == NULL_ADDR)) { | ||
1604 | ClearPageUptodate(page); | ||
1605 | dec_page_count(sbi, F2FS_DIRTY_NODES); | ||
1606 | up_read(&sbi->node_write); | ||
1607 | unlock_page(page); | ||
1608 | return 0; | ||
1609 | } | ||
1610 | |||
1611 | set_page_writeback(page); | ||
1612 | fio.old_blkaddr = ni.blk_addr; | ||
1613 | write_node_page(nid, &fio); | ||
1614 | set_node_addr(sbi, &ni, fio.new_blkaddr, is_fsync_dnode(page)); | ||
1615 | dec_page_count(sbi, F2FS_DIRTY_NODES); | ||
1616 | up_read(&sbi->node_write); | ||
1617 | |||
1618 | if (wbc->for_reclaim) | ||
1619 | f2fs_submit_merged_bio_cond(sbi, NULL, page, 0, NODE, WRITE); | ||
1620 | |||
1621 | unlock_page(page); | ||
1622 | |||
1623 | if (unlikely(f2fs_cp_error(sbi))) | ||
1624 | f2fs_submit_merged_bio(sbi, NODE, WRITE); | ||
1625 | |||
1626 | return 0; | ||
1627 | |||
1628 | redirty_out: | ||
1629 | redirty_page_for_writepage(wbc, page); | ||
1630 | return AOP_WRITEPAGE_ACTIVATE; | ||
1631 | } | ||
1632 | |||
1633 | static int f2fs_write_node_pages(struct address_space *mapping, | 1671 | static int f2fs_write_node_pages(struct address_space *mapping, |
1634 | struct writeback_control *wbc) | 1672 | struct writeback_control *wbc) |
1635 | { | 1673 | { |
@@ -1727,7 +1765,8 @@ static void __remove_nid_from_list(struct f2fs_sb_info *sbi, | |||
1727 | radix_tree_delete(&nm_i->free_nid_root, i->nid); | 1765 | radix_tree_delete(&nm_i->free_nid_root, i->nid); |
1728 | } | 1766 | } |
1729 | 1767 | ||
1730 | static int add_free_nid(struct f2fs_sb_info *sbi, nid_t nid, bool build) | 1768 | /* return if the nid is recognized as free */ |
1769 | static bool add_free_nid(struct f2fs_sb_info *sbi, nid_t nid, bool build) | ||
1731 | { | 1770 | { |
1732 | struct f2fs_nm_info *nm_i = NM_I(sbi); | 1771 | struct f2fs_nm_info *nm_i = NM_I(sbi); |
1733 | struct free_nid *i; | 1772 | struct free_nid *i; |
@@ -1736,14 +1775,14 @@ static int add_free_nid(struct f2fs_sb_info *sbi, nid_t nid, bool build) | |||
1736 | 1775 | ||
1737 | /* 0 nid should not be used */ | 1776 | /* 0 nid should not be used */ |
1738 | if (unlikely(nid == 0)) | 1777 | if (unlikely(nid == 0)) |
1739 | return 0; | 1778 | return false; |
1740 | 1779 | ||
1741 | if (build) { | 1780 | if (build) { |
1742 | /* do not add allocated nids */ | 1781 | /* do not add allocated nids */ |
1743 | ne = __lookup_nat_cache(nm_i, nid); | 1782 | ne = __lookup_nat_cache(nm_i, nid); |
1744 | if (ne && (!get_nat_flag(ne, IS_CHECKPOINTED) || | 1783 | if (ne && (!get_nat_flag(ne, IS_CHECKPOINTED) || |
1745 | nat_get_blkaddr(ne) != NULL_ADDR)) | 1784 | nat_get_blkaddr(ne) != NULL_ADDR)) |
1746 | return 0; | 1785 | return false; |
1747 | } | 1786 | } |
1748 | 1787 | ||
1749 | i = f2fs_kmem_cache_alloc(free_nid_slab, GFP_NOFS); | 1788 | i = f2fs_kmem_cache_alloc(free_nid_slab, GFP_NOFS); |
@@ -1752,7 +1791,7 @@ static int add_free_nid(struct f2fs_sb_info *sbi, nid_t nid, bool build) | |||
1752 | 1791 | ||
1753 | if (radix_tree_preload(GFP_NOFS)) { | 1792 | if (radix_tree_preload(GFP_NOFS)) { |
1754 | kmem_cache_free(free_nid_slab, i); | 1793 | kmem_cache_free(free_nid_slab, i); |
1755 | return 0; | 1794 | return true; |
1756 | } | 1795 | } |
1757 | 1796 | ||
1758 | spin_lock(&nm_i->nid_list_lock); | 1797 | spin_lock(&nm_i->nid_list_lock); |
@@ -1761,9 +1800,9 @@ static int add_free_nid(struct f2fs_sb_info *sbi, nid_t nid, bool build) | |||
1761 | radix_tree_preload_end(); | 1800 | radix_tree_preload_end(); |
1762 | if (err) { | 1801 | if (err) { |
1763 | kmem_cache_free(free_nid_slab, i); | 1802 | kmem_cache_free(free_nid_slab, i); |
1764 | return 0; | 1803 | return true; |
1765 | } | 1804 | } |
1766 | return 1; | 1805 | return true; |
1767 | } | 1806 | } |
1768 | 1807 | ||
1769 | static void remove_free_nid(struct f2fs_sb_info *sbi, nid_t nid) | 1808 | static void remove_free_nid(struct f2fs_sb_info *sbi, nid_t nid) |
@@ -1784,17 +1823,36 @@ static void remove_free_nid(struct f2fs_sb_info *sbi, nid_t nid) | |||
1784 | kmem_cache_free(free_nid_slab, i); | 1823 | kmem_cache_free(free_nid_slab, i); |
1785 | } | 1824 | } |
1786 | 1825 | ||
1826 | void update_free_nid_bitmap(struct f2fs_sb_info *sbi, nid_t nid, bool set) | ||
1827 | { | ||
1828 | struct f2fs_nm_info *nm_i = NM_I(sbi); | ||
1829 | unsigned int nat_ofs = NAT_BLOCK_OFFSET(nid); | ||
1830 | unsigned int nid_ofs = nid - START_NID(nid); | ||
1831 | |||
1832 | if (!test_bit_le(nat_ofs, nm_i->nat_block_bitmap)) | ||
1833 | return; | ||
1834 | |||
1835 | if (set) | ||
1836 | set_bit_le(nid_ofs, nm_i->free_nid_bitmap[nat_ofs]); | ||
1837 | else | ||
1838 | clear_bit_le(nid_ofs, nm_i->free_nid_bitmap[nat_ofs]); | ||
1839 | } | ||
1840 | |||
1787 | static void scan_nat_page(struct f2fs_sb_info *sbi, | 1841 | static void scan_nat_page(struct f2fs_sb_info *sbi, |
1788 | struct page *nat_page, nid_t start_nid) | 1842 | struct page *nat_page, nid_t start_nid) |
1789 | { | 1843 | { |
1790 | struct f2fs_nm_info *nm_i = NM_I(sbi); | 1844 | struct f2fs_nm_info *nm_i = NM_I(sbi); |
1791 | struct f2fs_nat_block *nat_blk = page_address(nat_page); | 1845 | struct f2fs_nat_block *nat_blk = page_address(nat_page); |
1792 | block_t blk_addr; | 1846 | block_t blk_addr; |
1847 | unsigned int nat_ofs = NAT_BLOCK_OFFSET(start_nid); | ||
1793 | int i; | 1848 | int i; |
1794 | 1849 | ||
1850 | set_bit_le(nat_ofs, nm_i->nat_block_bitmap); | ||
1851 | |||
1795 | i = start_nid % NAT_ENTRY_PER_BLOCK; | 1852 | i = start_nid % NAT_ENTRY_PER_BLOCK; |
1796 | 1853 | ||
1797 | for (; i < NAT_ENTRY_PER_BLOCK; i++, start_nid++) { | 1854 | for (; i < NAT_ENTRY_PER_BLOCK; i++, start_nid++) { |
1855 | bool freed = false; | ||
1798 | 1856 | ||
1799 | if (unlikely(start_nid >= nm_i->max_nid)) | 1857 | if (unlikely(start_nid >= nm_i->max_nid)) |
1800 | break; | 1858 | break; |
@@ -1802,11 +1860,106 @@ static void scan_nat_page(struct f2fs_sb_info *sbi, | |||
1802 | blk_addr = le32_to_cpu(nat_blk->entries[i].block_addr); | 1860 | blk_addr = le32_to_cpu(nat_blk->entries[i].block_addr); |
1803 | f2fs_bug_on(sbi, blk_addr == NEW_ADDR); | 1861 | f2fs_bug_on(sbi, blk_addr == NEW_ADDR); |
1804 | if (blk_addr == NULL_ADDR) | 1862 | if (blk_addr == NULL_ADDR) |
1805 | add_free_nid(sbi, start_nid, true); | 1863 | freed = add_free_nid(sbi, start_nid, true); |
1864 | update_free_nid_bitmap(sbi, start_nid, freed); | ||
1865 | } | ||
1866 | } | ||
1867 | |||
1868 | static void scan_free_nid_bits(struct f2fs_sb_info *sbi) | ||
1869 | { | ||
1870 | struct f2fs_nm_info *nm_i = NM_I(sbi); | ||
1871 | struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA); | ||
1872 | struct f2fs_journal *journal = curseg->journal; | ||
1873 | unsigned int i, idx; | ||
1874 | |||
1875 | down_read(&nm_i->nat_tree_lock); | ||
1876 | |||
1877 | for (i = 0; i < nm_i->nat_blocks; i++) { | ||
1878 | if (!test_bit_le(i, nm_i->nat_block_bitmap)) | ||
1879 | continue; | ||
1880 | for (idx = 0; idx < NAT_ENTRY_PER_BLOCK; idx++) { | ||
1881 | nid_t nid; | ||
1882 | |||
1883 | if (!test_bit_le(idx, nm_i->free_nid_bitmap[i])) | ||
1884 | continue; | ||
1885 | |||
1886 | nid = i * NAT_ENTRY_PER_BLOCK + idx; | ||
1887 | add_free_nid(sbi, nid, true); | ||
1888 | |||
1889 | if (nm_i->nid_cnt[FREE_NID_LIST] >= MAX_FREE_NIDS) | ||
1890 | goto out; | ||
1891 | } | ||
1892 | } | ||
1893 | out: | ||
1894 | down_read(&curseg->journal_rwsem); | ||
1895 | for (i = 0; i < nats_in_cursum(journal); i++) { | ||
1896 | block_t addr; | ||
1897 | nid_t nid; | ||
1898 | |||
1899 | addr = le32_to_cpu(nat_in_journal(journal, i).block_addr); | ||
1900 | nid = le32_to_cpu(nid_in_journal(journal, i)); | ||
1901 | if (addr == NULL_ADDR) | ||
1902 | add_free_nid(sbi, nid, true); | ||
1903 | else | ||
1904 | remove_free_nid(sbi, nid); | ||
1806 | } | 1905 | } |
1906 | up_read(&curseg->journal_rwsem); | ||
1907 | up_read(&nm_i->nat_tree_lock); | ||
1807 | } | 1908 | } |
1808 | 1909 | ||
1809 | static void __build_free_nids(struct f2fs_sb_info *sbi, bool sync) | 1910 | static int scan_nat_bits(struct f2fs_sb_info *sbi) |
1911 | { | ||
1912 | struct f2fs_nm_info *nm_i = NM_I(sbi); | ||
1913 | struct page *page; | ||
1914 | unsigned int i = 0; | ||
1915 | nid_t nid; | ||
1916 | |||
1917 | if (!enabled_nat_bits(sbi, NULL)) | ||
1918 | return -EAGAIN; | ||
1919 | |||
1920 | down_read(&nm_i->nat_tree_lock); | ||
1921 | check_empty: | ||
1922 | i = find_next_bit_le(nm_i->empty_nat_bits, nm_i->nat_blocks, i); | ||
1923 | if (i >= nm_i->nat_blocks) { | ||
1924 | i = 0; | ||
1925 | goto check_partial; | ||
1926 | } | ||
1927 | |||
1928 | for (nid = i * NAT_ENTRY_PER_BLOCK; nid < (i + 1) * NAT_ENTRY_PER_BLOCK; | ||
1929 | nid++) { | ||
1930 | if (unlikely(nid >= nm_i->max_nid)) | ||
1931 | break; | ||
1932 | add_free_nid(sbi, nid, true); | ||
1933 | } | ||
1934 | |||
1935 | if (nm_i->nid_cnt[FREE_NID_LIST] >= MAX_FREE_NIDS) | ||
1936 | goto out; | ||
1937 | i++; | ||
1938 | goto check_empty; | ||
1939 | |||
1940 | check_partial: | ||
1941 | i = find_next_zero_bit_le(nm_i->full_nat_bits, nm_i->nat_blocks, i); | ||
1942 | if (i >= nm_i->nat_blocks) { | ||
1943 | disable_nat_bits(sbi, true); | ||
1944 | up_read(&nm_i->nat_tree_lock); | ||
1945 | return -EINVAL; | ||
1946 | } | ||
1947 | |||
1948 | nid = i * NAT_ENTRY_PER_BLOCK; | ||
1949 | page = get_current_nat_page(sbi, nid); | ||
1950 | scan_nat_page(sbi, page, nid); | ||
1951 | f2fs_put_page(page, 1); | ||
1952 | |||
1953 | if (nm_i->nid_cnt[FREE_NID_LIST] < MAX_FREE_NIDS) { | ||
1954 | i++; | ||
1955 | goto check_partial; | ||
1956 | } | ||
1957 | out: | ||
1958 | up_read(&nm_i->nat_tree_lock); | ||
1959 | return 0; | ||
1960 | } | ||
1961 | |||
1962 | static void __build_free_nids(struct f2fs_sb_info *sbi, bool sync, bool mount) | ||
1810 | { | 1963 | { |
1811 | struct f2fs_nm_info *nm_i = NM_I(sbi); | 1964 | struct f2fs_nm_info *nm_i = NM_I(sbi); |
1812 | struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA); | 1965 | struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA); |
@@ -1821,6 +1974,29 @@ static void __build_free_nids(struct f2fs_sb_info *sbi, bool sync) | |||
1821 | if (!sync && !available_free_memory(sbi, FREE_NIDS)) | 1974 | if (!sync && !available_free_memory(sbi, FREE_NIDS)) |
1822 | return; | 1975 | return; |
1823 | 1976 | ||
1977 | if (!mount) { | ||
1978 | /* try to find free nids in free_nid_bitmap */ | ||
1979 | scan_free_nid_bits(sbi); | ||
1980 | |||
1981 | if (nm_i->nid_cnt[FREE_NID_LIST]) | ||
1982 | return; | ||
1983 | |||
1984 | /* try to find free nids with nat_bits */ | ||
1985 | if (!scan_nat_bits(sbi) && nm_i->nid_cnt[FREE_NID_LIST]) | ||
1986 | return; | ||
1987 | } | ||
1988 | |||
1989 | /* find next valid candidate */ | ||
1990 | if (enabled_nat_bits(sbi, NULL)) { | ||
1991 | int idx = find_next_zero_bit_le(nm_i->full_nat_bits, | ||
1992 | nm_i->nat_blocks, 0); | ||
1993 | |||
1994 | if (idx >= nm_i->nat_blocks) | ||
1995 | set_sbi_flag(sbi, SBI_NEED_FSCK); | ||
1996 | else | ||
1997 | nid = idx * NAT_ENTRY_PER_BLOCK; | ||
1998 | } | ||
1999 | |||
1824 | /* readahead nat pages to be scanned */ | 2000 | /* readahead nat pages to be scanned */ |
1825 | ra_meta_pages(sbi, NAT_BLOCK_OFFSET(nid), FREE_NID_PAGES, | 2001 | ra_meta_pages(sbi, NAT_BLOCK_OFFSET(nid), FREE_NID_PAGES, |
1826 | META_NAT, true); | 2002 | META_NAT, true); |
@@ -1863,10 +2039,10 @@ static void __build_free_nids(struct f2fs_sb_info *sbi, bool sync) | |||
1863 | nm_i->ra_nid_pages, META_NAT, false); | 2039 | nm_i->ra_nid_pages, META_NAT, false); |
1864 | } | 2040 | } |
1865 | 2041 | ||
1866 | void build_free_nids(struct f2fs_sb_info *sbi, bool sync) | 2042 | void build_free_nids(struct f2fs_sb_info *sbi, bool sync, bool mount) |
1867 | { | 2043 | { |
1868 | mutex_lock(&NM_I(sbi)->build_lock); | 2044 | mutex_lock(&NM_I(sbi)->build_lock); |
1869 | __build_free_nids(sbi, sync); | 2045 | __build_free_nids(sbi, sync, mount); |
1870 | mutex_unlock(&NM_I(sbi)->build_lock); | 2046 | mutex_unlock(&NM_I(sbi)->build_lock); |
1871 | } | 2047 | } |
1872 | 2048 | ||
@@ -1881,8 +2057,10 @@ bool alloc_nid(struct f2fs_sb_info *sbi, nid_t *nid) | |||
1881 | struct free_nid *i = NULL; | 2057 | struct free_nid *i = NULL; |
1882 | retry: | 2058 | retry: |
1883 | #ifdef CONFIG_F2FS_FAULT_INJECTION | 2059 | #ifdef CONFIG_F2FS_FAULT_INJECTION |
1884 | if (time_to_inject(sbi, FAULT_ALLOC_NID)) | 2060 | if (time_to_inject(sbi, FAULT_ALLOC_NID)) { |
2061 | f2fs_show_injection_info(FAULT_ALLOC_NID); | ||
1885 | return false; | 2062 | return false; |
2063 | } | ||
1886 | #endif | 2064 | #endif |
1887 | spin_lock(&nm_i->nid_list_lock); | 2065 | spin_lock(&nm_i->nid_list_lock); |
1888 | 2066 | ||
@@ -1902,13 +2080,16 @@ retry: | |||
1902 | i->state = NID_ALLOC; | 2080 | i->state = NID_ALLOC; |
1903 | __insert_nid_to_list(sbi, i, ALLOC_NID_LIST, false); | 2081 | __insert_nid_to_list(sbi, i, ALLOC_NID_LIST, false); |
1904 | nm_i->available_nids--; | 2082 | nm_i->available_nids--; |
2083 | |||
2084 | update_free_nid_bitmap(sbi, *nid, false); | ||
2085 | |||
1905 | spin_unlock(&nm_i->nid_list_lock); | 2086 | spin_unlock(&nm_i->nid_list_lock); |
1906 | return true; | 2087 | return true; |
1907 | } | 2088 | } |
1908 | spin_unlock(&nm_i->nid_list_lock); | 2089 | spin_unlock(&nm_i->nid_list_lock); |
1909 | 2090 | ||
1910 | /* Let's scan nat pages and its caches to get free nids */ | 2091 | /* Let's scan nat pages and its caches to get free nids */ |
1911 | build_free_nids(sbi, true); | 2092 | build_free_nids(sbi, true, false); |
1912 | goto retry; | 2093 | goto retry; |
1913 | } | 2094 | } |
1914 | 2095 | ||
@@ -1956,6 +2137,8 @@ void alloc_nid_failed(struct f2fs_sb_info *sbi, nid_t nid) | |||
1956 | 2137 | ||
1957 | nm_i->available_nids++; | 2138 | nm_i->available_nids++; |
1958 | 2139 | ||
2140 | update_free_nid_bitmap(sbi, nid, true); | ||
2141 | |||
1959 | spin_unlock(&nm_i->nid_list_lock); | 2142 | spin_unlock(&nm_i->nid_list_lock); |
1960 | 2143 | ||
1961 | if (need_free) | 2144 | if (need_free) |
@@ -2018,18 +2201,18 @@ update_inode: | |||
2018 | f2fs_put_page(ipage, 1); | 2201 | f2fs_put_page(ipage, 1); |
2019 | } | 2202 | } |
2020 | 2203 | ||
2021 | void recover_xattr_data(struct inode *inode, struct page *page, block_t blkaddr) | 2204 | int recover_xattr_data(struct inode *inode, struct page *page, block_t blkaddr) |
2022 | { | 2205 | { |
2023 | struct f2fs_sb_info *sbi = F2FS_I_SB(inode); | 2206 | struct f2fs_sb_info *sbi = F2FS_I_SB(inode); |
2024 | nid_t prev_xnid = F2FS_I(inode)->i_xattr_nid; | 2207 | nid_t prev_xnid = F2FS_I(inode)->i_xattr_nid; |
2025 | nid_t new_xnid = nid_of_node(page); | 2208 | nid_t new_xnid = nid_of_node(page); |
2026 | struct node_info ni; | 2209 | struct node_info ni; |
2210 | struct page *xpage; | ||
2027 | 2211 | ||
2028 | /* 1: invalidate the previous xattr nid */ | ||
2029 | if (!prev_xnid) | 2212 | if (!prev_xnid) |
2030 | goto recover_xnid; | 2213 | goto recover_xnid; |
2031 | 2214 | ||
2032 | /* Deallocate node address */ | 2215 | /* 1: invalidate the previous xattr nid */ |
2033 | get_node_info(sbi, prev_xnid, &ni); | 2216 | get_node_info(sbi, prev_xnid, &ni); |
2034 | f2fs_bug_on(sbi, ni.blk_addr == NULL_ADDR); | 2217 | f2fs_bug_on(sbi, ni.blk_addr == NULL_ADDR); |
2035 | invalidate_blocks(sbi, ni.blk_addr); | 2218 | invalidate_blocks(sbi, ni.blk_addr); |
@@ -2037,19 +2220,27 @@ void recover_xattr_data(struct inode *inode, struct page *page, block_t blkaddr) | |||
2037 | set_node_addr(sbi, &ni, NULL_ADDR, false); | 2220 | set_node_addr(sbi, &ni, NULL_ADDR, false); |
2038 | 2221 | ||
2039 | recover_xnid: | 2222 | recover_xnid: |
2040 | /* 2: allocate new xattr nid */ | 2223 | /* 2: update xattr nid in inode */ |
2224 | remove_free_nid(sbi, new_xnid); | ||
2225 | f2fs_i_xnid_write(inode, new_xnid); | ||
2041 | if (unlikely(!inc_valid_node_count(sbi, inode))) | 2226 | if (unlikely(!inc_valid_node_count(sbi, inode))) |
2042 | f2fs_bug_on(sbi, 1); | 2227 | f2fs_bug_on(sbi, 1); |
2228 | update_inode_page(inode); | ||
2229 | |||
2230 | /* 3: update and set xattr node page dirty */ | ||
2231 | xpage = grab_cache_page(NODE_MAPPING(sbi), new_xnid); | ||
2232 | if (!xpage) | ||
2233 | return -ENOMEM; | ||
2234 | |||
2235 | memcpy(F2FS_NODE(xpage), F2FS_NODE(page), PAGE_SIZE); | ||
2043 | 2236 | ||
2044 | remove_free_nid(sbi, new_xnid); | ||
2045 | get_node_info(sbi, new_xnid, &ni); | 2237 | get_node_info(sbi, new_xnid, &ni); |
2046 | ni.ino = inode->i_ino; | 2238 | ni.ino = inode->i_ino; |
2047 | set_node_addr(sbi, &ni, NEW_ADDR, false); | 2239 | set_node_addr(sbi, &ni, NEW_ADDR, false); |
2048 | f2fs_i_xnid_write(inode, new_xnid); | 2240 | set_page_dirty(xpage); |
2241 | f2fs_put_page(xpage, 1); | ||
2049 | 2242 | ||
2050 | /* 3: update xattr blkaddr */ | 2243 | return 0; |
2051 | refresh_sit_entry(sbi, NEW_ADDR, blkaddr); | ||
2052 | set_node_addr(sbi, &ni, blkaddr, false); | ||
2053 | } | 2244 | } |
2054 | 2245 | ||
2055 | int recover_inode_page(struct f2fs_sb_info *sbi, struct page *page) | 2246 | int recover_inode_page(struct f2fs_sb_info *sbi, struct page *page) |
@@ -2152,7 +2343,7 @@ static void remove_nats_in_journal(struct f2fs_sb_info *sbi) | |||
2152 | 2343 | ||
2153 | ne = __lookup_nat_cache(nm_i, nid); | 2344 | ne = __lookup_nat_cache(nm_i, nid); |
2154 | if (!ne) { | 2345 | if (!ne) { |
2155 | ne = grab_nat_entry(nm_i, nid); | 2346 | ne = grab_nat_entry(nm_i, nid, true); |
2156 | node_info_from_raw_nat(&ne->ni, &raw_ne); | 2347 | node_info_from_raw_nat(&ne->ni, &raw_ne); |
2157 | } | 2348 | } |
2158 | 2349 | ||
@@ -2192,8 +2383,39 @@ add_out: | |||
2192 | list_add_tail(&nes->set_list, head); | 2383 | list_add_tail(&nes->set_list, head); |
2193 | } | 2384 | } |
2194 | 2385 | ||
2386 | void __update_nat_bits(struct f2fs_sb_info *sbi, nid_t start_nid, | ||
2387 | struct page *page) | ||
2388 | { | ||
2389 | struct f2fs_nm_info *nm_i = NM_I(sbi); | ||
2390 | unsigned int nat_index = start_nid / NAT_ENTRY_PER_BLOCK; | ||
2391 | struct f2fs_nat_block *nat_blk = page_address(page); | ||
2392 | int valid = 0; | ||
2393 | int i; | ||
2394 | |||
2395 | if (!enabled_nat_bits(sbi, NULL)) | ||
2396 | return; | ||
2397 | |||
2398 | for (i = 0; i < NAT_ENTRY_PER_BLOCK; i++) { | ||
2399 | if (start_nid == 0 && i == 0) | ||
2400 | valid++; | ||
2401 | if (nat_blk->entries[i].block_addr) | ||
2402 | valid++; | ||
2403 | } | ||
2404 | if (valid == 0) { | ||
2405 | set_bit_le(nat_index, nm_i->empty_nat_bits); | ||
2406 | clear_bit_le(nat_index, nm_i->full_nat_bits); | ||
2407 | return; | ||
2408 | } | ||
2409 | |||
2410 | clear_bit_le(nat_index, nm_i->empty_nat_bits); | ||
2411 | if (valid == NAT_ENTRY_PER_BLOCK) | ||
2412 | set_bit_le(nat_index, nm_i->full_nat_bits); | ||
2413 | else | ||
2414 | clear_bit_le(nat_index, nm_i->full_nat_bits); | ||
2415 | } | ||
2416 | |||
2195 | static void __flush_nat_entry_set(struct f2fs_sb_info *sbi, | 2417 | static void __flush_nat_entry_set(struct f2fs_sb_info *sbi, |
2196 | struct nat_entry_set *set) | 2418 | struct nat_entry_set *set, struct cp_control *cpc) |
2197 | { | 2419 | { |
2198 | struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA); | 2420 | struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA); |
2199 | struct f2fs_journal *journal = curseg->journal; | 2421 | struct f2fs_journal *journal = curseg->journal; |
@@ -2208,7 +2430,8 @@ static void __flush_nat_entry_set(struct f2fs_sb_info *sbi, | |||
2208 | * #1, flush nat entries to journal in current hot data summary block. | 2430 | * #1, flush nat entries to journal in current hot data summary block. |
2209 | * #2, flush nat entries to nat page. | 2431 | * #2, flush nat entries to nat page. |
2210 | */ | 2432 | */ |
2211 | if (!__has_cursum_space(journal, set->entry_cnt, NAT_JOURNAL)) | 2433 | if (enabled_nat_bits(sbi, cpc) || |
2434 | !__has_cursum_space(journal, set->entry_cnt, NAT_JOURNAL)) | ||
2212 | to_journal = false; | 2435 | to_journal = false; |
2213 | 2436 | ||
2214 | if (to_journal) { | 2437 | if (to_journal) { |
@@ -2244,14 +2467,21 @@ static void __flush_nat_entry_set(struct f2fs_sb_info *sbi, | |||
2244 | add_free_nid(sbi, nid, false); | 2467 | add_free_nid(sbi, nid, false); |
2245 | spin_lock(&NM_I(sbi)->nid_list_lock); | 2468 | spin_lock(&NM_I(sbi)->nid_list_lock); |
2246 | NM_I(sbi)->available_nids++; | 2469 | NM_I(sbi)->available_nids++; |
2470 | update_free_nid_bitmap(sbi, nid, true); | ||
2471 | spin_unlock(&NM_I(sbi)->nid_list_lock); | ||
2472 | } else { | ||
2473 | spin_lock(&NM_I(sbi)->nid_list_lock); | ||
2474 | update_free_nid_bitmap(sbi, nid, false); | ||
2247 | spin_unlock(&NM_I(sbi)->nid_list_lock); | 2475 | spin_unlock(&NM_I(sbi)->nid_list_lock); |
2248 | } | 2476 | } |
2249 | } | 2477 | } |
2250 | 2478 | ||
2251 | if (to_journal) | 2479 | if (to_journal) { |
2252 | up_write(&curseg->journal_rwsem); | 2480 | up_write(&curseg->journal_rwsem); |
2253 | else | 2481 | } else { |
2482 | __update_nat_bits(sbi, start_nid, page); | ||
2254 | f2fs_put_page(page, 1); | 2483 | f2fs_put_page(page, 1); |
2484 | } | ||
2255 | 2485 | ||
2256 | f2fs_bug_on(sbi, set->entry_cnt); | 2486 | f2fs_bug_on(sbi, set->entry_cnt); |
2257 | 2487 | ||
@@ -2262,7 +2492,7 @@ static void __flush_nat_entry_set(struct f2fs_sb_info *sbi, | |||
2262 | /* | 2492 | /* |
2263 | * This function is called during the checkpointing process. | 2493 | * This function is called during the checkpointing process. |
2264 | */ | 2494 | */ |
2265 | void flush_nat_entries(struct f2fs_sb_info *sbi) | 2495 | void flush_nat_entries(struct f2fs_sb_info *sbi, struct cp_control *cpc) |
2266 | { | 2496 | { |
2267 | struct f2fs_nm_info *nm_i = NM_I(sbi); | 2497 | struct f2fs_nm_info *nm_i = NM_I(sbi); |
2268 | struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA); | 2498 | struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA); |
@@ -2283,7 +2513,8 @@ void flush_nat_entries(struct f2fs_sb_info *sbi) | |||
2283 | * entries, remove all entries from journal and merge them | 2513 | * entries, remove all entries from journal and merge them |
2284 | * into nat entry set. | 2514 | * into nat entry set. |
2285 | */ | 2515 | */ |
2286 | if (!__has_cursum_space(journal, nm_i->dirty_nat_cnt, NAT_JOURNAL)) | 2516 | if (enabled_nat_bits(sbi, cpc) || |
2517 | !__has_cursum_space(journal, nm_i->dirty_nat_cnt, NAT_JOURNAL)) | ||
2287 | remove_nats_in_journal(sbi); | 2518 | remove_nats_in_journal(sbi); |
2288 | 2519 | ||
2289 | while ((found = __gang_lookup_nat_set(nm_i, | 2520 | while ((found = __gang_lookup_nat_set(nm_i, |
@@ -2297,27 +2528,69 @@ void flush_nat_entries(struct f2fs_sb_info *sbi) | |||
2297 | 2528 | ||
2298 | /* flush dirty nats in nat entry set */ | 2529 | /* flush dirty nats in nat entry set */ |
2299 | list_for_each_entry_safe(set, tmp, &sets, set_list) | 2530 | list_for_each_entry_safe(set, tmp, &sets, set_list) |
2300 | __flush_nat_entry_set(sbi, set); | 2531 | __flush_nat_entry_set(sbi, set, cpc); |
2301 | 2532 | ||
2302 | up_write(&nm_i->nat_tree_lock); | 2533 | up_write(&nm_i->nat_tree_lock); |
2303 | 2534 | ||
2304 | f2fs_bug_on(sbi, nm_i->dirty_nat_cnt); | 2535 | f2fs_bug_on(sbi, nm_i->dirty_nat_cnt); |
2305 | } | 2536 | } |
2306 | 2537 | ||
2538 | static int __get_nat_bitmaps(struct f2fs_sb_info *sbi) | ||
2539 | { | ||
2540 | struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi); | ||
2541 | struct f2fs_nm_info *nm_i = NM_I(sbi); | ||
2542 | unsigned int nat_bits_bytes = nm_i->nat_blocks / BITS_PER_BYTE; | ||
2543 | unsigned int i; | ||
2544 | __u64 cp_ver = cur_cp_version(ckpt); | ||
2545 | block_t nat_bits_addr; | ||
2546 | |||
2547 | if (!enabled_nat_bits(sbi, NULL)) | ||
2548 | return 0; | ||
2549 | |||
2550 | nm_i->nat_bits_blocks = F2FS_BYTES_TO_BLK((nat_bits_bytes << 1) + 8 + | ||
2551 | F2FS_BLKSIZE - 1); | ||
2552 | nm_i->nat_bits = kzalloc(nm_i->nat_bits_blocks << F2FS_BLKSIZE_BITS, | ||
2553 | GFP_KERNEL); | ||
2554 | if (!nm_i->nat_bits) | ||
2555 | return -ENOMEM; | ||
2556 | |||
2557 | nat_bits_addr = __start_cp_addr(sbi) + sbi->blocks_per_seg - | ||
2558 | nm_i->nat_bits_blocks; | ||
2559 | for (i = 0; i < nm_i->nat_bits_blocks; i++) { | ||
2560 | struct page *page = get_meta_page(sbi, nat_bits_addr++); | ||
2561 | |||
2562 | memcpy(nm_i->nat_bits + (i << F2FS_BLKSIZE_BITS), | ||
2563 | page_address(page), F2FS_BLKSIZE); | ||
2564 | f2fs_put_page(page, 1); | ||
2565 | } | ||
2566 | |||
2567 | cp_ver |= (cur_cp_crc(ckpt) << 32); | ||
2568 | if (cpu_to_le64(cp_ver) != *(__le64 *)nm_i->nat_bits) { | ||
2569 | disable_nat_bits(sbi, true); | ||
2570 | return 0; | ||
2571 | } | ||
2572 | |||
2573 | nm_i->full_nat_bits = nm_i->nat_bits + 8; | ||
2574 | nm_i->empty_nat_bits = nm_i->full_nat_bits + nat_bits_bytes; | ||
2575 | |||
2576 | f2fs_msg(sbi->sb, KERN_NOTICE, "Found nat_bits in checkpoint"); | ||
2577 | return 0; | ||
2578 | } | ||
2579 | |||
2307 | static int init_node_manager(struct f2fs_sb_info *sbi) | 2580 | static int init_node_manager(struct f2fs_sb_info *sbi) |
2308 | { | 2581 | { |
2309 | struct f2fs_super_block *sb_raw = F2FS_RAW_SUPER(sbi); | 2582 | struct f2fs_super_block *sb_raw = F2FS_RAW_SUPER(sbi); |
2310 | struct f2fs_nm_info *nm_i = NM_I(sbi); | 2583 | struct f2fs_nm_info *nm_i = NM_I(sbi); |
2311 | unsigned char *version_bitmap; | 2584 | unsigned char *version_bitmap; |
2312 | unsigned int nat_segs, nat_blocks; | 2585 | unsigned int nat_segs; |
2586 | int err; | ||
2313 | 2587 | ||
2314 | nm_i->nat_blkaddr = le32_to_cpu(sb_raw->nat_blkaddr); | 2588 | nm_i->nat_blkaddr = le32_to_cpu(sb_raw->nat_blkaddr); |
2315 | 2589 | ||
2316 | /* segment_count_nat includes pair segment so divide to 2. */ | 2590 | /* segment_count_nat includes pair segment so divide to 2. */ |
2317 | nat_segs = le32_to_cpu(sb_raw->segment_count_nat) >> 1; | 2591 | nat_segs = le32_to_cpu(sb_raw->segment_count_nat) >> 1; |
2318 | nat_blocks = nat_segs << le32_to_cpu(sb_raw->log_blocks_per_seg); | 2592 | nm_i->nat_blocks = nat_segs << le32_to_cpu(sb_raw->log_blocks_per_seg); |
2319 | 2593 | nm_i->max_nid = NAT_ENTRY_PER_BLOCK * nm_i->nat_blocks; | |
2320 | nm_i->max_nid = NAT_ENTRY_PER_BLOCK * nat_blocks; | ||
2321 | 2594 | ||
2322 | /* not used nids: 0, node, meta, (and root counted as valid node) */ | 2595 | /* not used nids: 0, node, meta, (and root counted as valid node) */ |
2323 | nm_i->available_nids = nm_i->max_nid - sbi->total_valid_node_count - | 2596 | nm_i->available_nids = nm_i->max_nid - sbi->total_valid_node_count - |
@@ -2350,6 +2623,34 @@ static int init_node_manager(struct f2fs_sb_info *sbi) | |||
2350 | GFP_KERNEL); | 2623 | GFP_KERNEL); |
2351 | if (!nm_i->nat_bitmap) | 2624 | if (!nm_i->nat_bitmap) |
2352 | return -ENOMEM; | 2625 | return -ENOMEM; |
2626 | |||
2627 | err = __get_nat_bitmaps(sbi); | ||
2628 | if (err) | ||
2629 | return err; | ||
2630 | |||
2631 | #ifdef CONFIG_F2FS_CHECK_FS | ||
2632 | nm_i->nat_bitmap_mir = kmemdup(version_bitmap, nm_i->bitmap_size, | ||
2633 | GFP_KERNEL); | ||
2634 | if (!nm_i->nat_bitmap_mir) | ||
2635 | return -ENOMEM; | ||
2636 | #endif | ||
2637 | |||
2638 | return 0; | ||
2639 | } | ||
2640 | |||
2641 | int init_free_nid_cache(struct f2fs_sb_info *sbi) | ||
2642 | { | ||
2643 | struct f2fs_nm_info *nm_i = NM_I(sbi); | ||
2644 | |||
2645 | nm_i->free_nid_bitmap = f2fs_kvzalloc(nm_i->nat_blocks * | ||
2646 | NAT_ENTRY_BITMAP_SIZE, GFP_KERNEL); | ||
2647 | if (!nm_i->free_nid_bitmap) | ||
2648 | return -ENOMEM; | ||
2649 | |||
2650 | nm_i->nat_block_bitmap = f2fs_kvzalloc(nm_i->nat_blocks / 8, | ||
2651 | GFP_KERNEL); | ||
2652 | if (!nm_i->nat_block_bitmap) | ||
2653 | return -ENOMEM; | ||
2353 | return 0; | 2654 | return 0; |
2354 | } | 2655 | } |
2355 | 2656 | ||
@@ -2365,7 +2666,11 @@ int build_node_manager(struct f2fs_sb_info *sbi) | |||
2365 | if (err) | 2666 | if (err) |
2366 | return err; | 2667 | return err; |
2367 | 2668 | ||
2368 | build_free_nids(sbi, true); | 2669 | err = init_free_nid_cache(sbi); |
2670 | if (err) | ||
2671 | return err; | ||
2672 | |||
2673 | build_free_nids(sbi, true, true); | ||
2369 | return 0; | 2674 | return 0; |
2370 | } | 2675 | } |
2371 | 2676 | ||
@@ -2423,7 +2728,14 @@ void destroy_node_manager(struct f2fs_sb_info *sbi) | |||
2423 | } | 2728 | } |
2424 | up_write(&nm_i->nat_tree_lock); | 2729 | up_write(&nm_i->nat_tree_lock); |
2425 | 2730 | ||
2731 | kvfree(nm_i->nat_block_bitmap); | ||
2732 | kvfree(nm_i->free_nid_bitmap); | ||
2733 | |||
2426 | kfree(nm_i->nat_bitmap); | 2734 | kfree(nm_i->nat_bitmap); |
2735 | kfree(nm_i->nat_bits); | ||
2736 | #ifdef CONFIG_F2FS_CHECK_FS | ||
2737 | kfree(nm_i->nat_bitmap_mir); | ||
2738 | #endif | ||
2427 | sbi->nm_info = NULL; | 2739 | sbi->nm_info = NULL; |
2428 | kfree(nm_i); | 2740 | kfree(nm_i); |
2429 | } | 2741 | } |