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
8282 return root->fs_info->delayed_root;
8383 }
8484
85−static struct btrfs_delayed_node *btrfs_get_or_create_delayed_node(
86− struct inode *inode)
85+static struct btrfs_delayed_node *btrfs_get_delayed_node(struct inode *inode)
8786 {
88− struct btrfs_delayed_node *node;
8987 struct btrfs_inode *btrfs_inode = BTRFS_I(inode);
9088 struct btrfs_root *root = btrfs_inode->root;
9189 u64 ino = btrfs_ino(inode);
92− int ret;
90+ struct btrfs_delayed_node *node;
9391
94−again:
9592 node = ACCESS_ONCE(btrfs_inode->delayed_node);
9693 if (node) {
97− atomic_inc(&node->refs); /* can be accessed */
94+ atomic_inc(&node->refs);
9895 return node;
9996 }
10097
@@ -102,8 +99,10 @@ again: · 1 unmodified line
10299 node = radix_tree_lookup(&root->delayed_nodes_tree, ino);
103100 if (node) {
104101 if (btrfs_inode->delayed_node) {
102+ atomic_inc(&node->refs); /* can be accessed */
103+ BUG_ON(btrfs_inode->delayed_node != node);
105104 spin_unlock(&root->inode_lock);
106− goto again;
105+ return node;
107106 }
108107 btrfs_inode->delayed_node = node;
109108 atomic_inc(&node->refs); /* can be accessed */
@@ -113,6 +112,23 @@ again: · 3 unmodified lines
113112 }
114113 spin_unlock(&root->inode_lock);
115114
115+ return NULL;
116+}
117+
118+static 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+
127+again:
128+ node = btrfs_get_delayed_node(inode);
129+ if (node)
130+ return node;
131+
116132 node = kmem_cache_alloc(delayed_node_cache, GFP_NOFS);
117133 if (!node)
118134 return ERR_PTR(-ENOMEM);
@@ -548,19 +564,6 @@ struct btrfs_delayed_item *__btrfs_next_delayed_item( · 429 unmodified lines
548564 return next;
549565 }
550566
551−static 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−
564567 static inline struct btrfs_root *btrfs_get_fs_root(struct btrfs_root *root,
565568 u64 root_id)
566569 {
@@ -1404,8 +1407,7 @@ end: · 837 unmodified lines
14041407
14051408 int btrfs_inode_delayed_dir_index_count(struct inode *inode)
14061409 {
1407− struct btrfs_delayed_node *delayed_node = BTRFS_I(inode)->delayed_node;
1408− int ret = 0;
1410+ struct btrfs_delayed_node *delayed_node = btrfs_get_delayed_node(inode);
14091411
14101412 if (!delayed_node)
14111413 return -ENOENT;
@@ -1415,11 +1417,14 @@ int btrfs_inode_delayed_dir_index_count(struct inode *inode) · 3 unmodified lines
14151417 * a new directory index is added into the delayed node and index_cnt
14161418 * is updated now. So we needn't lock the delayed node.
14171419 */
1418− if (!delayed_node->index_cnt)
1420+ if (!delayed_node->index_cnt) {
1421+ btrfs_release_delayed_node(delayed_node);
14191422 return -EINVAL;
1423+ }
14201424
14211425 BTRFS_I(inode)->index_cnt = delayed_node->index_cnt;
1422− return ret;
1426+ btrfs_release_delayed_node(delayed_node);
1427+ return 0;
14231428 }
14241429
14251430 void 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
16131618 inode->i_ctime.tv_nsec);
16141619 }
16151620
1621+int 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+
16161672 int btrfs_delayed_update_inode(struct btrfs_trans_handle *trans,
16171673 struct btrfs_root *root, struct inode *inode)
16181674 {
fs/btrfs/delayed-inode.h+1−0
@@ -119,6 +119,7 @@ void btrfs_kill_delayed_inode_items(struct inode *inode); · 118 unmodified lines
119119
120120 int btrfs_delayed_update_inode(struct btrfs_trans_handle *trans,
121121 struct btrfs_root *root, struct inode *inode);
122+int btrfs_fill_inode(struct inode *inode, u32 *rdev);
122123
123124 /* Used for drop dead root */
124125 void 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
48424842 u64 num_bytes, u64 empty_size,
48434843 u64 search_start, u64 search_end,
48444844 u64 hint_byte, struct btrfs_key *ins,
4845− int data)
4845+ u64 data)
48464846 {
48474847 int ret = 0;
48484848 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
48694869
48704870 space_info = __find_space_info(root->fs_info, data);
48714871 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);
48734873 return -ENOSPC;
48744874 }
48754875
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
18931893
18941894 while ((node = rb_last(&ctl->free_space_offset)) != NULL) {
18951895 info = rb_entry(node, struct btrfs_free_space, offset_index);
1896− unlink_free_space(ctl, info);
1897− kfree(info->bitmap);
1898− kmem_cache_free(btrfs_free_space_cachep, info);
1896+ if (!info->bitmap) {
1897+ unlink_free_space(ctl, info);
1898+ kmem_cache_free(btrfs_free_space_cachep, info);
1899+ } else {
1900+ free_bitmap(ctl, info);
1901+ }
18991902 if (need_resched()) {
19001903 spin_unlock(&ctl->tree_lock);
19011904 cond_resched();
fs/btrfs/inode.c+11−2
@@ -2509,6 +2509,11 @@ static void btrfs_read_locked_inode(struct inode *inode) · 2508 unmodified lines
25092509 int maybe_acls;
25102510 u32 rdev;
25112511 int ret;
2512+ bool filled = false;
2513+
2514+ ret = btrfs_fill_inode(inode, &rdev);
2515+ if (!ret)
2516+ filled = true;
25122517
25132518 path = btrfs_alloc_path();
25142519 BUG_ON(!path);
@@ -2520,6 +2525,10 @@ static void btrfs_read_locked_inode(struct inode *inode) · 5 unmodified lines
25202525 goto make_bad;
25212526
25222527 leaf = path->nodes[0];
2528+
2529+ if (filled)
2530+ goto cache_acl;
2531+
25232532 inode_item = btrfs_item_ptr(leaf, path->slots[0],
25242533 struct btrfs_inode_item);
25252534 if (!leaf->map_token)
@@ -2556,7 +2565,7 @@ static void btrfs_read_locked_inode(struct inode *inode) · 30 unmodified lines
25562565
25572566 BTRFS_I(inode)->index_cnt = (u64)-1;
25582567 BTRFS_I(inode)->flags = btrfs_inode_flags(leaf, inode_item);
2559−
2568+cache_acl:
25602569 /*
25612570 * try to precache a NULL acl entry for files that don't have
25622571 * any xattrs or acls
@@ -2572,7 +2581,6 @@ static void btrfs_read_locked_inode(struct inode *inode) · 9 unmodified lines
25722581 }
25732582
25742583 btrfs_free_path(path);
2575− inode_item = NULL;
25762584
25772585 switch (inode->i_mode & S_IFMT) {
25782586 case S_IFREG:
@@ -4520,6 +4528,7 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, · 1941 unmodified lines
45204528 inode_tree_add(inode);
45214529
45224530 trace_btrfs_inode_new(inode);
4531+ btrfs_set_inode_last_trans(trans, inode);
45234532
45244533 return inode;
45254534 fail: