History

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable: btrfs: fix inconsonant inode information Btrfs: make sure to update total_bitmaps when freeing cache V3 Btrfs: fix type mismatch in find_free_extent() Btrfs: make sure to record the transid in new inodes

Linus Torvalds committed 15 years ago

Commit af4087e2 parents 4699d44 2f7e33d5 files · +100 −31Browse files

Unified · Split

5 files
  1. fs/btrfs/delayed-inode.c +80 −24
  2. fs/btrfs/delayed-inode.h +1 −0
  3. fs/btrfs/extent-tree.c +2 −2
  4. fs/btrfs/free-space-cache.c +6 −3
  5. fs/btrfs/inode.c +11 −2
fs/btrfs/delayed-inode.c+80−24
@@ -82,19 +82,16 @@ static inline struct btrfs_delayed_root *btrfs_get_delayed_root( · 81 unmodified lines
82 return root->fs_info->delayed_root;82 return root->fs_info->delayed_root;
83}83}
84 84
85static struct btrfs_delayed_node *btrfs_get_or_create_delayed_node(85static struct btrfs_delayed_node *btrfs_get_delayed_node(struct inode *inode)
86 struct inode *inode)
87{86{
88 struct btrfs_delayed_node *node;
89 struct btrfs_inode *btrfs_inode = BTRFS_I(inode);87 struct btrfs_inode *btrfs_inode = BTRFS_I(inode);
90 struct btrfs_root *root = btrfs_inode->root;88 struct btrfs_root *root = btrfs_inode->root;
91 u64 ino = btrfs_ino(inode);89 u64 ino = btrfs_ino(inode);
92 int ret;90 struct btrfs_delayed_node *node;
93 91
94again:
95 node = ACCESS_ONCE(btrfs_inode->delayed_node);92 node = ACCESS_ONCE(btrfs_inode->delayed_node);
96 if (node) {93 if (node) {
97 atomic_inc(&node->refs); /* can be accessed */94 atomic_inc(&node->refs);
98 return node;95 return node;
99 }96 }
100 97
@@ -102,8 +99,10 @@ again: · 1 unmodified line
102 node = radix_tree_lookup(&root->delayed_nodes_tree, ino);99 node = radix_tree_lookup(&root->delayed_nodes_tree, ino);
103 if (node) {100 if (node) {
104 if (btrfs_inode->delayed_node) {101 if (btrfs_inode->delayed_node) {
102 atomic_inc(&node->refs); /* can be accessed */
103 BUG_ON(btrfs_inode->delayed_node != node);
105 spin_unlock(&root->inode_lock);104 spin_unlock(&root->inode_lock);
106 goto again;105 return node;
107 }106 }
108 btrfs_inode->delayed_node = node;107 btrfs_inode->delayed_node = node;
109 atomic_inc(&node->refs); /* can be accessed */108 atomic_inc(&node->refs); /* can be accessed */
@@ -113,6 +112,23 @@ again: · 3 unmodified lines
113 }112 }
114 spin_unlock(&root->inode_lock);113 spin_unlock(&root->inode_lock);
115 114
115 return NULL;
116}
117
118static struct btrfs_delayed_node *btrfs_get_or_create_delayed_node(
119 struct inode *inode)
120{
121 struct btrfs_delayed_node *node;
122 struct btrfs_inode *btrfs_inode = BTRFS_I(inode);
123 struct btrfs_root *root = btrfs_inode->root;
124 u64 ino = btrfs_ino(inode);
125 int ret;
126
127again:
128 node = btrfs_get_delayed_node(inode);
129 if (node)
130 return node;
131
116 node = kmem_cache_alloc(delayed_node_cache, GFP_NOFS);132 node = kmem_cache_alloc(delayed_node_cache, GFP_NOFS);
117 if (!node)133 if (!node)
118 return ERR_PTR(-ENOMEM);134 return ERR_PTR(-ENOMEM);
@@ -548,19 +564,6 @@ struct btrfs_delayed_item *__btrfs_next_delayed_item( · 429 unmodified lines
548 return next;564 return next;
549}565}
550 566
551static inline struct btrfs_delayed_node *btrfs_get_delayed_node(
552 struct inode *inode)
553{
554 struct btrfs_inode *btrfs_inode = BTRFS_I(inode);
555 struct btrfs_delayed_node *delayed_node;
556
557 delayed_node = btrfs_inode->delayed_node;
558 if (delayed_node)
559 atomic_inc(&delayed_node->refs);
560
561 return delayed_node;
562}
563
564static inline struct btrfs_root *btrfs_get_fs_root(struct btrfs_root *root,567static inline struct btrfs_root *btrfs_get_fs_root(struct btrfs_root *root,
565 u64 root_id)568 u64 root_id)
566{569{
@@ -1404,8 +1407,7 @@ end: · 837 unmodified lines
1404 1407
1405int btrfs_inode_delayed_dir_index_count(struct inode *inode)1408int btrfs_inode_delayed_dir_index_count(struct inode *inode)
1406{1409{
1407 struct btrfs_delayed_node *delayed_node = BTRFS_I(inode)->delayed_node;1410 struct btrfs_delayed_node *delayed_node = btrfs_get_delayed_node(inode);
1408 int ret = 0;
1409 1411
1410 if (!delayed_node)1412 if (!delayed_node)
1411 return -ENOENT;1413 return -ENOENT;
@@ -1415,11 +1417,14 @@ int btrfs_inode_delayed_dir_index_count(struct inode *inode) · 3 unmodified lines
1415 * a new directory index is added into the delayed node and index_cnt1417 * a new directory index is added into the delayed node and index_cnt
1416 * is updated now. So we needn't lock the delayed node.1418 * is updated now. So we needn't lock the delayed node.
1417 */1419 */
1418 if (!delayed_node->index_cnt)1420 if (!delayed_node->index_cnt) {
1421 btrfs_release_delayed_node(delayed_node);
1419 return -EINVAL;1422 return -EINVAL;
1423 }
1420 1424
1421 BTRFS_I(inode)->index_cnt = delayed_node->index_cnt;1425 BTRFS_I(inode)->index_cnt = delayed_node->index_cnt;
1422 return ret;1426 btrfs_release_delayed_node(delayed_node);
1427 return 0;
1423}1428}
1424 1429
1425void btrfs_get_delayed_items(struct inode *inode, struct list_head *ins_list,1430void btrfs_get_delayed_items(struct inode *inode, struct list_head *ins_list,
@@ -1613,6 +1618,57 @@ static void fill_stack_inode_item(struct btrfs_trans_handle *trans, · 187 unmodified lines
1613 inode->i_ctime.tv_nsec);1618 inode->i_ctime.tv_nsec);
1614}1619}
1615 1620
1621int btrfs_fill_inode(struct inode *inode, u32 *rdev)
1622{
1623 struct btrfs_delayed_node *delayed_node;
1624 struct btrfs_inode_item *inode_item;
1625 struct btrfs_timespec *tspec;
1626
1627 delayed_node = btrfs_get_delayed_node(inode);
1628 if (!delayed_node)
1629 return -ENOENT;
1630
1631 mutex_lock(&delayed_node->mutex);
1632 if (!delayed_node->inode_dirty) {
1633 mutex_unlock(&delayed_node->mutex);
1634 btrfs_release_delayed_node(delayed_node);
1635 return -ENOENT;
1636 }
1637
1638 inode_item = &delayed_node->inode_item;
1639
1640 inode->i_uid = btrfs_stack_inode_uid(inode_item);
1641 inode->i_gid = btrfs_stack_inode_gid(inode_item);
1642 btrfs_i_size_write(inode, btrfs_stack_inode_size(inode_item));
1643 inode->i_mode = btrfs_stack_inode_mode(inode_item);
1644 inode->i_nlink = btrfs_stack_inode_nlink(inode_item);
1645 inode_set_bytes(inode, btrfs_stack_inode_nbytes(inode_item));
1646 BTRFS_I(inode)->generation = btrfs_stack_inode_generation(inode_item);
1647 BTRFS_I(inode)->sequence = btrfs_stack_inode_sequence(inode_item);
1648 inode->i_rdev = 0;
1649 *rdev = btrfs_stack_inode_rdev(inode_item);
1650 BTRFS_I(inode)->flags = btrfs_stack_inode_flags(inode_item);
1651
1652 tspec = btrfs_inode_atime(inode_item);
1653 inode->i_atime.tv_sec = btrfs_stack_timespec_sec(tspec);
1654 inode->i_atime.tv_nsec = btrfs_stack_timespec_nsec(tspec);
1655
1656 tspec = btrfs_inode_mtime(inode_item);
1657 inode->i_mtime.tv_sec = btrfs_stack_timespec_sec(tspec);
1658 inode->i_mtime.tv_nsec = btrfs_stack_timespec_nsec(tspec);
1659
1660 tspec = btrfs_inode_ctime(inode_item);
1661 inode->i_ctime.tv_sec = btrfs_stack_timespec_sec(tspec);
1662 inode->i_ctime.tv_nsec = btrfs_stack_timespec_nsec(tspec);
1663
1664 inode->i_generation = BTRFS_I(inode)->generation;
1665 BTRFS_I(inode)->index_cnt = (u64)-1;
1666
1667 mutex_unlock(&delayed_node->mutex);
1668 btrfs_release_delayed_node(delayed_node);
1669 return 0;
1670}
1671
1616int btrfs_delayed_update_inode(struct btrfs_trans_handle *trans,1672int btrfs_delayed_update_inode(struct btrfs_trans_handle *trans,
1617 struct btrfs_root *root, struct inode *inode)1673 struct btrfs_root *root, struct inode *inode)
1618{1674{
fs/btrfs/delayed-inode.h+1−0
@@ -119,6 +119,7 @@ void btrfs_kill_delayed_inode_items(struct inode *inode); · 118 unmodified lines
119 119
120int btrfs_delayed_update_inode(struct btrfs_trans_handle *trans,120int btrfs_delayed_update_inode(struct btrfs_trans_handle *trans,
121 struct btrfs_root *root, struct inode *inode);121 struct btrfs_root *root, struct inode *inode);
122int btrfs_fill_inode(struct inode *inode, u32 *rdev);
122 123
123/* Used for drop dead root */124/* Used for drop dead root */
124void btrfs_kill_all_delayed_nodes(struct btrfs_root *root);125void btrfs_kill_all_delayed_nodes(struct btrfs_root *root);
fs/btrfs/extent-tree.c+2−2
@@ -4842,7 +4842,7 @@ static noinline int find_free_extent(struct btrfs_trans_handle *trans, · 4841 unmodified lines
4842 u64 num_bytes, u64 empty_size,4842 u64 num_bytes, u64 empty_size,
4843 u64 search_start, u64 search_end,4843 u64 search_start, u64 search_end,
4844 u64 hint_byte, struct btrfs_key *ins,4844 u64 hint_byte, struct btrfs_key *ins,
4845 int data)4845 u64 data)
4846{4846{
4847 int ret = 0;4847 int ret = 0;
4848 struct btrfs_root *root = orig_root->fs_info->extent_root;4848 struct btrfs_root *root = orig_root->fs_info->extent_root;
@@ -4869,7 +4869,7 @@ static noinline int find_free_extent(struct btrfs_trans_handle *trans, · 20 unmodified lines
4869 4869
4870 space_info = __find_space_info(root->fs_info, data);4870 space_info = __find_space_info(root->fs_info, data);
4871 if (!space_info) {4871 if (!space_info) {
4872 printk(KERN_ERR "No space info for %d\n", data);4872 printk(KERN_ERR "No space info for %llu\n", data);
4873 return -ENOSPC;4873 return -ENOSPC;
4874 }4874 }
4875 4875
fs/btrfs/free-space-cache.c+6−3
@@ -1893,9 +1893,12 @@ void __btrfs_remove_free_space_cache_locked(struct btrfs_free_space_ctl *ctl) · 1892 unmodified lines
1893 1893
1894 while ((node = rb_last(&ctl->free_space_offset)) != NULL) {1894 while ((node = rb_last(&ctl->free_space_offset)) != NULL) {
1895 info = rb_entry(node, struct btrfs_free_space, offset_index);1895 info = rb_entry(node, struct btrfs_free_space, offset_index);
1896 unlink_free_space(ctl, info);1896 if (!info->bitmap) {
1897 kfree(info->bitmap);1897 unlink_free_space(ctl, info);
1898 kmem_cache_free(btrfs_free_space_cachep, info);1898 kmem_cache_free(btrfs_free_space_cachep, info);
1899 } else {
1900 free_bitmap(ctl, info);
1901 }
1899 if (need_resched()) {1902 if (need_resched()) {
1900 spin_unlock(&ctl->tree_lock);1903 spin_unlock(&ctl->tree_lock);
1901 cond_resched();1904 cond_resched();
fs/btrfs/inode.c+11−2
@@ -2509,6 +2509,11 @@ static void btrfs_read_locked_inode(struct inode *inode) · 2508 unmodified lines
2509 int maybe_acls;2509 int maybe_acls;
2510 u32 rdev;2510 u32 rdev;
2511 int ret;2511 int ret;
2512 bool filled = false;
2513
2514 ret = btrfs_fill_inode(inode, &rdev);
2515 if (!ret)
2516 filled = true;
2512 2517
2513 path = btrfs_alloc_path();2518 path = btrfs_alloc_path();
2514 BUG_ON(!path);2519 BUG_ON(!path);
@@ -2520,6 +2525,10 @@ static void btrfs_read_locked_inode(struct inode *inode) · 5 unmodified lines
2520 goto make_bad;2525 goto make_bad;
2521 2526
2522 leaf = path->nodes[0];2527 leaf = path->nodes[0];
2528
2529 if (filled)
2530 goto cache_acl;
2531
2523 inode_item = btrfs_item_ptr(leaf, path->slots[0],2532 inode_item = btrfs_item_ptr(leaf, path->slots[0],
2524 struct btrfs_inode_item);2533 struct btrfs_inode_item);
2525 if (!leaf->map_token)2534 if (!leaf->map_token)
@@ -2556,7 +2565,7 @@ static void btrfs_read_locked_inode(struct inode *inode) · 30 unmodified lines
2556 2565
2557 BTRFS_I(inode)->index_cnt = (u64)-1;2566 BTRFS_I(inode)->index_cnt = (u64)-1;
2558 BTRFS_I(inode)->flags = btrfs_inode_flags(leaf, inode_item);2567 BTRFS_I(inode)->flags = btrfs_inode_flags(leaf, inode_item);
2559 2568cache_acl:
2560 /*2569 /*
2561 * try to precache a NULL acl entry for files that don't have2570 * try to precache a NULL acl entry for files that don't have
2562 * any xattrs or acls2571 * any xattrs or acls
@@ -2572,7 +2581,6 @@ static void btrfs_read_locked_inode(struct inode *inode) · 9 unmodified lines
2572 }2581 }
2573 2582
2574 btrfs_free_path(path);2583 btrfs_free_path(path);
2575 inode_item = NULL;
2576 2584
2577 switch (inode->i_mode & S_IFMT) {2585 switch (inode->i_mode & S_IFMT) {
2578 case S_IFREG:2586 case S_IFREG:
@@ -4520,6 +4528,7 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, · 1941 unmodified lines
4520 inode_tree_add(inode);4528 inode_tree_add(inode);
4521 4529
4522 trace_btrfs_inode_new(inode);4530 trace_btrfs_inode_new(inode);
4531 btrfs_set_inode_last_trans(trans, inode);
4523 4532
4524 return inode;4533 return inode;
4525fail:4534fail: