Btrfs: Invalidate dcache entry after creating snapshot and
[linux-2.6-block.git] / fs / btrfs / transaction.c
index 57746c11eae35c251806c28990b8428e9a2e13f8..f04684f7fea33aa4a6227afe74f3cb6ce34e515a 100644 (file)
@@ -56,7 +56,6 @@ static noinline int join_transaction(struct btrfs_root *root)
                total_trans++;
                BUG_ON(!cur_trans);
                root->fs_info->generation++;
-               root->fs_info->running_transaction = cur_trans;
                root->fs_info->last_alloc = 0;
                root->fs_info->last_data_alloc = 0;
                cur_trans->num_writers = 1;
@@ -74,6 +73,9 @@ static noinline int join_transaction(struct btrfs_root *root)
                extent_io_tree_init(&cur_trans->dirty_pages,
                                     root->fs_info->btree_inode->i_mapping,
                                     GFP_NOFS);
+               spin_lock(&root->fs_info->new_trans_lock);
+               root->fs_info->running_transaction = cur_trans;
+               spin_unlock(&root->fs_info->new_trans_lock);
        } else {
                cur_trans->num_writers++;
                cur_trans->num_joined++;
@@ -558,6 +560,7 @@ static noinline int create_pending_snapshot(struct btrfs_trans_handle *trans,
        struct btrfs_root *root = pending->root;
        struct extent_buffer *tmp;
        int ret;
+       int namelen;
        u64 objectid;
 
        new_root_item = kmalloc(sizeof(*new_root_item), GFP_NOFS);
@@ -593,8 +596,9 @@ static noinline int create_pending_snapshot(struct btrfs_trans_handle *trans,
         * insert the directory item
         */
        key.offset = (u64)-1;
+       namelen = strlen(pending->name);
        ret = btrfs_insert_dir_item(trans, root->fs_info->tree_root,
-                                   pending->name, strlen(pending->name),
+                                   pending->name, namelen,
                                    root->fs_info->sb->s_root->d_inode->i_ino,
                                    &key, BTRFS_FT_DIR);
 
@@ -604,6 +608,10 @@ static noinline int create_pending_snapshot(struct btrfs_trans_handle *trans,
        ret = btrfs_insert_inode_ref(trans, root->fs_info->tree_root,
                             pending->name, strlen(pending->name), objectid,
                             root->fs_info->sb->s_root->d_inode->i_ino);
+
+       /* Invalidate existing dcache entry for new snapshot. */
+       btrfs_invalidate_dcache_root(root, pending->name, namelen);
+
 fail:
        kfree(new_root_item);
        return ret;