]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - fs/btrfs/inode.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
[karo-tx-linux.git] / fs / btrfs / inode.c
index 1e861a063721e7c173a770cd68d0fea484cb75b3..2315039356529fac0315a57733a035d86a00b3b1 100644 (file)
@@ -71,6 +71,7 @@ struct btrfs_dio_data {
        u64 reserve;
        u64 unsubmitted_oe_range_start;
        u64 unsubmitted_oe_range_end;
+       int overwrite;
 };
 
 static const struct inode_operations btrfs_dir_inode_operations;
@@ -108,11 +109,11 @@ static noinline int cow_file_range(struct inode *inode,
                                   u64 start, u64 end, u64 delalloc_end,
                                   int *page_started, unsigned long *nr_written,
                                   int unlock, struct btrfs_dedupe_hash *hash);
-static struct extent_map *create_pinned_em(struct inode *inode, u64 start,
-                                          u64 len, u64 orig_start,
-                                          u64 block_start, u64 block_len,
-                                          u64 orig_block_len, u64 ram_bytes,
-                                          int type);
+static struct extent_map *create_io_em(struct inode *inode, u64 start, u64 len,
+                                      u64 orig_start, u64 block_start,
+                                      u64 block_len, u64 orig_block_len,
+                                      u64 ram_bytes, int compress_type,
+                                      int type);
 
 static int btrfs_dirty_inode(struct inode *inode);
 
@@ -166,7 +167,7 @@ static int insert_inline_extent(struct btrfs_trans_handle *trans,
                struct btrfs_key key;
                size_t datasize;
 
-               key.objectid = btrfs_ino(inode);
+               key.objectid = btrfs_ino(BTRFS_I(inode));
                key.offset = start;
                key.type = BTRFS_EXTENT_DATA_KEY;
 
@@ -315,8 +316,8 @@ static noinline int cow_file_range_inline(struct btrfs_root *root,
        }
 
        set_bit(BTRFS_INODE_NEEDS_FULL_SYNC, &BTRFS_I(inode)->runtime_flags);
-       btrfs_delalloc_release_metadata(inode, end + 1 - start);
-       btrfs_drop_extent_cache(inode, start, aligned_end - 1, 0);
+       btrfs_delalloc_release_metadata(BTRFS_I(inode), end + 1 - start);
+       btrfs_drop_extent_cache(BTRFS_I(inode), start, aligned_end - 1, 0);
 out:
        /*
         * Don't forget to free the reserved space, as for inlined extent
@@ -388,6 +389,15 @@ static inline int inode_need_compress(struct inode *inode)
        return 0;
 }
 
+static inline void inode_should_defrag(struct btrfs_inode *inode,
+               u64 start, u64 end, u64 num_bytes, u64 small_write)
+{
+       /* If this is a small write inside eof, kick off a defrag */
+       if (num_bytes < small_write &&
+           (start > 0 || end + 1 < inode->disk_i_size))
+               btrfs_add_inode_defrag(NULL, inode);
+}
+
 /*
  * we create compressed extents in two phases.  The first
  * phase compresses a range of pages that have already been
@@ -420,26 +430,23 @@ static noinline void compress_file_range(struct inode *inode,
        int ret = 0;
        struct page **pages = NULL;
        unsigned long nr_pages;
-       unsigned long nr_pages_ret = 0;
        unsigned long total_compressed = 0;
        unsigned long total_in = 0;
-       unsigned long max_compressed = SZ_128K;
-       unsigned long max_uncompressed = SZ_128K;
        int i;
        int will_compress;
        int compress_type = fs_info->compress_type;
        int redirty = 0;
 
-       /* if this is a small write inside eof, kick off a defrag */
-       if ((end - start + 1) < SZ_16K &&
-           (start > 0 || end + 1 < BTRFS_I(inode)->disk_i_size))
-               btrfs_add_inode_defrag(NULL, inode);
+       inode_should_defrag(BTRFS_I(inode), start, end, end - start + 1,
+                       SZ_16K);
 
        actual_end = min_t(u64, isize, end + 1);
 again:
        will_compress = 0;
        nr_pages = (end >> PAGE_SHIFT) - (start >> PAGE_SHIFT) + 1;
-       nr_pages = min_t(unsigned long, nr_pages, SZ_128K / PAGE_SIZE);
+       BUILD_BUG_ON((BTRFS_MAX_COMPRESSED % PAGE_SIZE) != 0);
+       nr_pages = min_t(unsigned long, nr_pages,
+                       BTRFS_MAX_COMPRESSED / PAGE_SIZE);
 
        /*
         * we don't want to send crud past the end of i_size through
@@ -464,17 +471,8 @@ again:
           (start > 0 || end + 1 < BTRFS_I(inode)->disk_i_size))
                goto cleanup_and_bail_uncompressed;
 
-       /* we want to make sure that amount of ram required to uncompress
-        * an extent is reasonable, so we limit the total size in ram
-        * of a compressed extent to 128k.  This is a crucial number
-        * because it also controls how easily we can spread reads across
-        * cpus for decompression.
-        *
-        * We also want to make sure the amount of IO required to do
-        * a random read is reasonably small, so we limit the size of
-        * a compressed extent to 128k.
-        */
-       total_compressed = min(total_compressed, max_uncompressed);
+       total_compressed = min_t(unsigned long, total_compressed,
+                       BTRFS_MAX_UNCOMPRESSED);
        num_bytes = ALIGN(end - start + 1, blocksize);
        num_bytes = max(blocksize,  num_bytes);
        total_in = 0;
@@ -509,16 +507,15 @@ again:
                redirty = 1;
                ret = btrfs_compress_pages(compress_type,
                                           inode->i_mapping, start,
-                                          total_compressed, pages,
-                                          nr_pages, &nr_pages_ret,
+                                          pages,
+                                          &nr_pages,
                                           &total_in,
-                                          &total_compressed,
-                                          max_compressed);
+                                          &total_compressed);
 
                if (!ret) {
                        unsigned long offset = total_compressed &
                                (PAGE_SIZE - 1);
-                       struct page *page = pages[nr_pages_ret - 1];
+                       struct page *page = pages[nr_pages - 1];
                        char *kaddr;
 
                        /* zero the tail end of the last page, we might be
@@ -541,7 +538,7 @@ cont:
                         * to make an uncompressed inline extent.
                         */
                        ret = cow_file_range_inline(root, inode, start, end,
-                                                   0, 0, NULL);
+                                           0, BTRFS_COMPRESS_NONE, NULL);
                } else {
                        /* try making a compressed inline extent */
                        ret = cow_file_range_inline(root, inode, start, end,
@@ -599,7 +596,7 @@ cont:
                         * will submit them to the elevator.
                         */
                        add_async_extent(async_cow, start, num_bytes,
-                                       total_compressed, pages, nr_pages_ret,
+                                       total_compressed, pages, nr_pages,
                                        compress_type);
 
                        if (start + num_bytes < end) {
@@ -616,14 +613,14 @@ cont:
                 * the compression code ran but failed to make things smaller,
                 * free any pages it allocated and our page pointer array
                 */
-               for (i = 0; i < nr_pages_ret; i++) {
+               for (i = 0; i < nr_pages; i++) {
                        WARN_ON(pages[i]->mapping);
                        put_page(pages[i]);
                }
                kfree(pages);
                pages = NULL;
                total_compressed = 0;
-               nr_pages_ret = 0;
+               nr_pages = 0;
 
                /* flag the file so we don't compress in the future */
                if (!btrfs_test_opt(fs_info, FORCE_COMPRESS) &&
@@ -652,7 +649,7 @@ cleanup_and_bail_uncompressed:
        return;
 
 free_pages_out:
-       for (i = 0; i < nr_pages_ret; i++) {
+       for (i = 0; i < nr_pages; i++) {
                WARN_ON(pages[i]->mapping);
                put_page(pages[i]);
        }
@@ -690,7 +687,6 @@ static noinline void submit_compressed_extents(struct inode *inode,
        struct btrfs_key ins;
        struct extent_map *em;
        struct btrfs_root *root = BTRFS_I(inode)->root;
-       struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree;
        struct extent_io_tree *io_tree;
        int ret = 0;
 
@@ -778,46 +774,19 @@ retry:
                 * here we're doing allocation and writeback of the
                 * compressed pages
                 */
-               btrfs_drop_extent_cache(inode, async_extent->start,
-                                       async_extent->start +
-                                       async_extent->ram_size - 1, 0);
-
-               em = alloc_extent_map();
-               if (!em) {
-                       ret = -ENOMEM;
-                       goto out_free_reserve;
-               }
-               em->start = async_extent->start;
-               em->len = async_extent->ram_size;
-               em->orig_start = em->start;
-               em->mod_start = em->start;
-               em->mod_len = em->len;
-
-               em->block_start = ins.objectid;
-               em->block_len = ins.offset;
-               em->orig_block_len = ins.offset;
-               em->ram_bytes = async_extent->ram_size;
-               em->bdev = fs_info->fs_devices->latest_bdev;
-               em->compress_type = async_extent->compress_type;
-               set_bit(EXTENT_FLAG_PINNED, &em->flags);
-               set_bit(EXTENT_FLAG_COMPRESSED, &em->flags);
-               em->generation = -1;
-
-               while (1) {
-                       write_lock(&em_tree->lock);
-                       ret = add_extent_mapping(em_tree, em, 1);
-                       write_unlock(&em_tree->lock);
-                       if (ret != -EEXIST) {
-                               free_extent_map(em);
-                               break;
-                       }
-                       btrfs_drop_extent_cache(inode, async_extent->start,
-                                               async_extent->start +
-                                               async_extent->ram_size - 1, 0);
-               }
-
-               if (ret)
+               em = create_io_em(inode, async_extent->start,
+                                 async_extent->ram_size, /* len */
+                                 async_extent->start, /* orig_start */
+                                 ins.objectid, /* block_start */
+                                 ins.offset, /* block_len */
+                                 ins.offset, /* orig_block_len */
+                                 async_extent->ram_size, /* ram_bytes */
+                                 async_extent->compress_type,
+                                 BTRFS_ORDERED_COMPRESSED);
+               if (IS_ERR(em))
+                       /* ret value is not necessary due to void function */
                        goto out_free_reserve;
+               free_extent_map(em);
 
                ret = btrfs_add_ordered_extent_compress(inode,
                                                async_extent->start,
@@ -827,7 +796,8 @@ retry:
                                                BTRFS_ORDERED_COMPRESSED,
                                                async_extent->compress_type);
                if (ret) {
-                       btrfs_drop_extent_cache(inode, async_extent->start,
+                       btrfs_drop_extent_cache(BTRFS_I(inode),
+                                               async_extent->start,
                                                async_extent->start +
                                                async_extent->ram_size - 1, 0);
                        goto out_free_reserve;
@@ -952,10 +922,9 @@ static noinline int cow_file_range(struct inode *inode,
        u64 blocksize = fs_info->sectorsize;
        struct btrfs_key ins;
        struct extent_map *em;
-       struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree;
        int ret = 0;
 
-       if (btrfs_is_free_space_inode(inode)) {
+       if (btrfs_is_free_space_inode(BTRFS_I(inode))) {
                WARN_ON_ONCE(1);
                ret = -EINVAL;
                goto out_unlock;
@@ -965,15 +934,12 @@ static noinline int cow_file_range(struct inode *inode,
        num_bytes = max(blocksize,  num_bytes);
        disk_num_bytes = num_bytes;
 
-       /* if this is a small write inside eof, kick off defrag */
-       if (num_bytes < SZ_64K &&
-           (start > 0 || end + 1 < BTRFS_I(inode)->disk_i_size))
-               btrfs_add_inode_defrag(NULL, inode);
+       inode_should_defrag(BTRFS_I(inode), start, end, num_bytes, SZ_64K);
 
        if (start == 0) {
                /* lets try to make an inline extent */
-               ret = cow_file_range_inline(root, inode, start, end, 0, 0,
-                                           NULL);
+               ret = cow_file_range_inline(root, inode, start, end, 0,
+                                       BTRFS_COMPRESS_NONE, NULL);
                if (ret == 0) {
                        extent_clear_unlock_delalloc(inode, start, end,
                                     delalloc_end, NULL,
@@ -996,7 +962,8 @@ static noinline int cow_file_range(struct inode *inode,
               btrfs_super_total_bytes(fs_info->super_copy));
 
        alloc_hint = get_extent_allocation_hint(inode, start, num_bytes);
-       btrfs_drop_extent_cache(inode, start, start + num_bytes - 1, 0);
+       btrfs_drop_extent_cache(BTRFS_I(inode), start,
+                       start + num_bytes - 1, 0);
 
        while (disk_num_bytes > 0) {
                unsigned long op;
@@ -1008,39 +975,18 @@ static noinline int cow_file_range(struct inode *inode,
                if (ret < 0)
                        goto out_unlock;
 
-               em = alloc_extent_map();
-               if (!em) {
-                       ret = -ENOMEM;
-                       goto out_reserve;
-               }
-               em->start = start;
-               em->orig_start = em->start;
                ram_size = ins.offset;
-               em->len = ins.offset;
-               em->mod_start = em->start;
-               em->mod_len = em->len;
-
-               em->block_start = ins.objectid;
-               em->block_len = ins.offset;
-               em->orig_block_len = ins.offset;
-               em->ram_bytes = ram_size;
-               em->bdev = fs_info->fs_devices->latest_bdev;
-               set_bit(EXTENT_FLAG_PINNED, &em->flags);
-               em->generation = -1;
-
-               while (1) {
-                       write_lock(&em_tree->lock);
-                       ret = add_extent_mapping(em_tree, em, 1);
-                       write_unlock(&em_tree->lock);
-                       if (ret != -EEXIST) {
-                               free_extent_map(em);
-                               break;
-                       }
-                       btrfs_drop_extent_cache(inode, start,
-                                               start + ram_size - 1, 0);
-               }
-               if (ret)
+               em = create_io_em(inode, start, ins.offset, /* len */
+                                 start, /* orig_start */
+                                 ins.objectid, /* block_start */
+                                 ins.offset, /* block_len */
+                                 ins.offset, /* orig_block_len */
+                                 ram_size, /* ram_bytes */
+                                 BTRFS_COMPRESS_NONE, /* compress_type */
+                                 BTRFS_ORDERED_REGULAR /* type */);
+               if (IS_ERR(em))
                        goto out_reserve;
+               free_extent_map(em);
 
                cur_alloc_size = ins.offset;
                ret = btrfs_add_ordered_extent(inode, start, ins.objectid,
@@ -1085,7 +1031,7 @@ out:
        return ret;
 
 out_drop_extent_cache:
-       btrfs_drop_extent_cache(inode, start, start + ram_size - 1, 0);
+       btrfs_drop_extent_cache(BTRFS_I(inode), start, start + ram_size - 1, 0);
 out_reserve:
        btrfs_dec_block_group_reservations(fs_info, ins.objectid);
        btrfs_free_reserved_extent(fs_info, ins.objectid, ins.offset, 1);
@@ -1164,7 +1110,6 @@ static int cow_file_range_async(struct inode *inode, struct page *locked_page,
        struct btrfs_root *root = BTRFS_I(inode)->root;
        unsigned long nr_pages;
        u64 cur_end;
-       int limit = 10 * SZ_1M;
 
        clear_extent_bit(&BTRFS_I(inode)->io_tree, start, end, EXTENT_LOCKED,
                         1, 0, NULL, GFP_NOFS);
@@ -1196,12 +1141,6 @@ static int cow_file_range_async(struct inode *inode, struct page *locked_page,
 
                btrfs_queue_work(fs_info->delalloc_workers, &async_cow->work);
 
-               if (atomic_read(&fs_info->async_delalloc_pages) > limit) {
-                       wait_event(fs_info->async_submit_wait,
-                                  (atomic_read(&fs_info->async_delalloc_pages) <
-                                   limit));
-               }
-
                while (atomic_read(&fs_info->async_submit_draining) &&
                       atomic_read(&fs_info->async_delalloc_pages)) {
                        wait_event(fs_info->async_submit_wait,
@@ -1250,11 +1189,11 @@ static noinline int run_delalloc_nocow(struct inode *inode,
 {
        struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
        struct btrfs_root *root = BTRFS_I(inode)->root;
-       struct btrfs_trans_handle *trans;
        struct extent_buffer *leaf;
        struct btrfs_path *path;
        struct btrfs_file_extent_item *fi;
        struct btrfs_key found_key;
+       struct extent_map *em;
        u64 cow_start;
        u64 cur_offset;
        u64 extent_end;
@@ -1269,7 +1208,7 @@ static noinline int run_delalloc_nocow(struct inode *inode,
        int nocow;
        int check_prev = 1;
        bool nolock;
-       u64 ino = btrfs_ino(inode);
+       u64 ino = btrfs_ino(BTRFS_I(inode));
 
        path = btrfs_alloc_path();
        if (!path) {
@@ -1284,32 +1223,12 @@ static noinline int run_delalloc_nocow(struct inode *inode,
                return -ENOMEM;
        }
 
-       nolock = btrfs_is_free_space_inode(inode);
-
-       if (nolock)
-               trans = btrfs_join_transaction_nolock(root);
-       else
-               trans = btrfs_join_transaction(root);
-
-       if (IS_ERR(trans)) {
-               extent_clear_unlock_delalloc(inode, start, end, end,
-                                            locked_page,
-                                            EXTENT_LOCKED | EXTENT_DELALLOC |
-                                            EXTENT_DO_ACCOUNTING |
-                                            EXTENT_DEFRAG, PAGE_UNLOCK |
-                                            PAGE_CLEAR_DIRTY |
-                                            PAGE_SET_WRITEBACK |
-                                            PAGE_END_WRITEBACK);
-               btrfs_free_path(path);
-               return PTR_ERR(trans);
-       }
-
-       trans->block_rsv = &fs_info->delalloc_block_rsv;
+       nolock = btrfs_is_free_space_inode(BTRFS_I(inode));
 
        cow_start = (u64)-1;
        cur_offset = start;
        while (1) {
-               ret = btrfs_lookup_file_extent(trans, root, path, ino,
+               ret = btrfs_lookup_file_extent(NULL, root, path, ino,
                                               cur_offset, 0);
                if (ret < 0)
                        goto error;
@@ -1382,7 +1301,7 @@ next_slot:
                                goto out_check;
                        if (btrfs_extent_readonly(fs_info, disk_bytenr))
                                goto out_check;
-                       if (btrfs_cross_ref_exist(trans, root, ino,
+                       if (btrfs_cross_ref_exist(root, ino,
                                                  found_key.offset -
                                                  extent_offset, disk_bytenr))
                                goto out_check;
@@ -1404,10 +1323,16 @@ next_slot:
                         * either valid or do not exist.
                         */
                        if (csum_exist_in_range(fs_info, disk_bytenr,
-                                               num_bytes))
+                                               num_bytes)) {
+                               if (!nolock)
+                                       btrfs_end_write_no_snapshoting(root);
                                goto out_check;
-                       if (!btrfs_inc_nocow_writers(fs_info, disk_bytenr))
+                       }
+                       if (!btrfs_inc_nocow_writers(fs_info, disk_bytenr)) {
+                               if (!nolock)
+                                       btrfs_end_write_no_snapshoting(root);
                                goto out_check;
+                       }
                        nocow = 1;
                } else if (extent_type == BTRFS_FILE_EXTENT_INLINE) {
                        extent_end = found_key.offset +
@@ -1455,35 +1380,28 @@ out_check:
                }
 
                if (extent_type == BTRFS_FILE_EXTENT_PREALLOC) {
-                       struct extent_map *em;
-                       struct extent_map_tree *em_tree;
-                       em_tree = &BTRFS_I(inode)->extent_tree;
-                       em = alloc_extent_map();
-                       BUG_ON(!em); /* -ENOMEM */
-                       em->start = cur_offset;
-                       em->orig_start = found_key.offset - extent_offset;
-                       em->len = num_bytes;
-                       em->block_len = num_bytes;
-                       em->block_start = disk_bytenr;
-                       em->orig_block_len = disk_num_bytes;
-                       em->ram_bytes = ram_bytes;
-                       em->bdev = fs_info->fs_devices->latest_bdev;
-                       em->mod_start = em->start;
-                       em->mod_len = em->len;
-                       set_bit(EXTENT_FLAG_PINNED, &em->flags);
-                       set_bit(EXTENT_FLAG_FILLING, &em->flags);
-                       em->generation = -1;
-                       while (1) {
-                               write_lock(&em_tree->lock);
-                               ret = add_extent_mapping(em_tree, em, 1);
-                               write_unlock(&em_tree->lock);
-                               if (ret != -EEXIST) {
-                                       free_extent_map(em);
-                                       break;
-                               }
-                               btrfs_drop_extent_cache(inode, em->start,
-                                               em->start + em->len - 1, 0);
+                       u64 orig_start = found_key.offset - extent_offset;
+
+                       em = create_io_em(inode, cur_offset, num_bytes,
+                                         orig_start,
+                                         disk_bytenr, /* block_start */
+                                         num_bytes, /* block_len */
+                                         disk_num_bytes, /* orig_block_len */
+                                         ram_bytes, BTRFS_COMPRESS_NONE,
+                                         BTRFS_ORDERED_PREALLOC);
+                       if (IS_ERR(em)) {
+                               if (!nolock && nocow)
+                                       btrfs_end_write_no_snapshoting(root);
+                               if (nocow)
+                                       btrfs_dec_nocow_writers(fs_info,
+                                                               disk_bytenr);
+                               ret = PTR_ERR(em);
+                               goto error;
                        }
+                       free_extent_map(em);
+               }
+
+               if (extent_type == BTRFS_FILE_EXTENT_PREALLOC) {
                        type = BTRFS_ORDERED_PREALLOC;
                } else {
                        type = BTRFS_ORDERED_NOCOW;
@@ -1534,10 +1452,6 @@ out_check:
        }
 
 error:
-       err = btrfs_end_transaction(trans);
-       if (!ret)
-               ret = err;
-
        if (ret && cur_offset < end)
                extent_clear_unlock_delalloc(inode, cur_offset, end, end,
                                             locked_page, EXTENT_LOCKED |
@@ -1609,7 +1523,7 @@ static void btrfs_split_extent_hook(struct inode *inode,
 
        size = orig->end - orig->start + 1;
        if (size > BTRFS_MAX_EXTENT_SIZE) {
-               u64 num_extents;
+               u32 num_extents;
                u64 new_size;
 
                /*
@@ -1617,13 +1531,10 @@ static void btrfs_split_extent_hook(struct inode *inode,
                 * applies here, just in reverse.
                 */
                new_size = orig->end - split + 1;
-               num_extents = div64_u64(new_size + BTRFS_MAX_EXTENT_SIZE - 1,
-                                       BTRFS_MAX_EXTENT_SIZE);
+               num_extents = count_max_extents(new_size);
                new_size = split - orig->start;
-               num_extents += div64_u64(new_size + BTRFS_MAX_EXTENT_SIZE - 1,
-                                       BTRFS_MAX_EXTENT_SIZE);
-               if (div64_u64(size + BTRFS_MAX_EXTENT_SIZE - 1,
-                             BTRFS_MAX_EXTENT_SIZE) >= num_extents)
+               num_extents += count_max_extents(new_size);
+               if (count_max_extents(size) >= num_extents)
                        return;
        }
 
@@ -1643,7 +1554,7 @@ static void btrfs_merge_extent_hook(struct inode *inode,
                                    struct extent_state *other)
 {
        u64 new_size, old_size;
-       u64 num_extents;
+       u32 num_extents;
 
        /* not delalloc, ignore it */
        if (!(other->state & EXTENT_DELALLOC))
@@ -1681,14 +1592,10 @@ static void btrfs_merge_extent_hook(struct inode *inode,
         * this case.
         */
        old_size = other->end - other->start + 1;
-       num_extents = div64_u64(old_size + BTRFS_MAX_EXTENT_SIZE - 1,
-                               BTRFS_MAX_EXTENT_SIZE);
+       num_extents = count_max_extents(old_size);
        old_size = new->end - new->start + 1;
-       num_extents += div64_u64(old_size + BTRFS_MAX_EXTENT_SIZE - 1,
-                                BTRFS_MAX_EXTENT_SIZE);
-
-       if (div64_u64(new_size + BTRFS_MAX_EXTENT_SIZE - 1,
-                     BTRFS_MAX_EXTENT_SIZE) >= num_extents)
+       num_extents += count_max_extents(old_size);
+       if (count_max_extents(new_size) >= num_extents)
                return;
 
        spin_lock(&BTRFS_I(inode)->lock);
@@ -1720,15 +1627,15 @@ static void btrfs_add_delalloc_inodes(struct btrfs_root *root,
 }
 
 static void btrfs_del_delalloc_inode(struct btrfs_root *root,
-                                    struct inode *inode)
+                                    struct btrfs_inode *inode)
 {
-       struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
+       struct btrfs_fs_info *fs_info = btrfs_sb(inode->vfs_inode.i_sb);
 
        spin_lock(&root->delalloc_lock);
-       if (!list_empty(&BTRFS_I(inode)->delalloc_inodes)) {
-               list_del_init(&BTRFS_I(inode)->delalloc_inodes);
+       if (!list_empty(&inode->delalloc_inodes)) {
+               list_del_init(&inode->delalloc_inodes);
                clear_bit(BTRFS_INODE_IN_DELALLOC_LIST,
-                         &BTRFS_I(inode)->runtime_flags);
+                         &inode->runtime_flags);
                root->nr_delalloc_inodes--;
                if (!root->nr_delalloc_inodes) {
                        spin_lock(&fs_info->delalloc_root_lock);
@@ -1761,7 +1668,7 @@ static void btrfs_set_bit_hook(struct inode *inode,
        if (!(state->state & EXTENT_DELALLOC) && (*bits & EXTENT_DELALLOC)) {
                struct btrfs_root *root = BTRFS_I(inode)->root;
                u64 len = state->end + 1 - state->start;
-               bool do_list = !btrfs_is_free_space_inode(inode);
+               bool do_list = !btrfs_is_free_space_inode(BTRFS_I(inode));
 
                if (*bits & EXTENT_FIRST_DELALLOC) {
                        *bits &= ~EXTENT_FIRST_DELALLOC;
@@ -1791,19 +1698,18 @@ static void btrfs_set_bit_hook(struct inode *inode,
 /*
  * extent_io.c clear_bit_hook, see set_bit_hook for why
  */
-static void btrfs_clear_bit_hook(struct inode *inode,
+static void btrfs_clear_bit_hook(struct btrfs_inode *inode,
                                 struct extent_state *state,
                                 unsigned *bits)
 {
-       struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
+       struct btrfs_fs_info *fs_info = btrfs_sb(inode->vfs_inode.i_sb);
        u64 len = state->end + 1 - state->start;
-       u64 num_extents = div64_u64(len + BTRFS_MAX_EXTENT_SIZE -1,
-                                   BTRFS_MAX_EXTENT_SIZE);
+       u32 num_extents = count_max_extents(len);
 
-       spin_lock(&BTRFS_I(inode)->lock);
+       spin_lock(&inode->lock);
        if ((state->state & EXTENT_DEFRAG) && (*bits & EXTENT_DEFRAG))
-               BTRFS_I(inode)->defrag_bytes -= len;
-       spin_unlock(&BTRFS_I(inode)->lock);
+               inode->defrag_bytes -= len;
+       spin_unlock(&inode->lock);
 
        /*
         * set_bit and clear bit hooks normally require _irqsave/restore
@@ -1811,15 +1717,15 @@ static void btrfs_clear_bit_hook(struct inode *inode,
         * bit, which is only set or cleared with irqs on
         */
        if ((state->state & EXTENT_DELALLOC) && (*bits & EXTENT_DELALLOC)) {
-               struct btrfs_root *root = BTRFS_I(inode)->root;
+               struct btrfs_root *root = inode->root;
                bool do_list = !btrfs_is_free_space_inode(inode);
 
                if (*bits & EXTENT_FIRST_DELALLOC) {
                        *bits &= ~EXTENT_FIRST_DELALLOC;
                } else if (!(*bits & EXTENT_DO_ACCOUNTING)) {
-                       spin_lock(&BTRFS_I(inode)->lock);
-                       BTRFS_I(inode)->outstanding_extents -= num_extents;
-                       spin_unlock(&BTRFS_I(inode)->lock);
+                       spin_lock(&inode->lock);
+                       inode->outstanding_extents -= num_extents;
+                       spin_unlock(&inode->lock);
                }
 
                /*
@@ -1839,18 +1745,19 @@ static void btrfs_clear_bit_hook(struct inode *inode,
                    && do_list && !(state->state & EXTENT_NORESERVE)
                    && (*bits & (EXTENT_DO_ACCOUNTING |
                    EXTENT_CLEAR_DATA_RESV)))
-                       btrfs_free_reserved_data_space_noquota(inode,
+                       btrfs_free_reserved_data_space_noquota(
+                                       &inode->vfs_inode,
                                        state->start, len);
 
                __percpu_counter_add(&fs_info->delalloc_bytes, -len,
                                     fs_info->delalloc_batch);
-               spin_lock(&BTRFS_I(inode)->lock);
-               BTRFS_I(inode)->delalloc_bytes -= len;
-               if (do_list && BTRFS_I(inode)->delalloc_bytes == 0 &&
+               spin_lock(&inode->lock);
+               inode->delalloc_bytes -= len;
+               if (do_list && inode->delalloc_bytes == 0 &&
                    test_bit(BTRFS_INODE_IN_DELALLOC_LIST,
-                            &BTRFS_I(inode)->runtime_flags))
+                                       &inode->runtime_flags))
                        btrfs_del_delalloc_inode(root, inode);
-               spin_unlock(&BTRFS_I(inode)->lock);
+               spin_unlock(&inode->lock);
        }
 }
 
@@ -1946,7 +1853,7 @@ static int btrfs_submit_bio_hook(struct inode *inode, struct bio *bio,
 
        skip_sum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM;
 
-       if (btrfs_is_free_space_inode(inode))
+       if (btrfs_is_free_space_inode(BTRFS_I(inode)))
                metadata = BTRFS_WQ_ENDIO_FREE_SPACE;
 
        if (bio_op(bio) != REQ_OP_WRITE) {
@@ -1997,8 +1904,7 @@ out:
  * at IO completion time based on sums calculated at bio submission time.
  */
 static noinline int add_pending_csums(struct btrfs_trans_handle *trans,
-                            struct inode *inode, u64 file_offset,
-                            struct list_head *list)
+                            struct inode *inode, struct list_head *list)
 {
        struct btrfs_ordered_sum *sum;
 
@@ -2056,7 +1962,7 @@ again:
        if (PagePrivate2(page))
                goto out;
 
-       ordered = btrfs_lookup_ordered_range(inode, page_start,
+       ordered = btrfs_lookup_ordered_range(BTRFS_I(inode), page_start,
                                        PAGE_SIZE);
        if (ordered) {
                unlock_extent_cached(&BTRFS_I(inode)->io_tree, page_start,
@@ -2161,7 +2067,7 @@ static int insert_reserved_file_extent(struct btrfs_trans_handle *trans,
                goto out;
 
        if (!extent_inserted) {
-               ins.objectid = btrfs_ino(inode);
+               ins.objectid = btrfs_ino(BTRFS_I(inode));
                ins.offset = file_pos;
                ins.type = BTRFS_EXTENT_DATA_KEY;
 
@@ -2194,8 +2100,7 @@ static int insert_reserved_file_extent(struct btrfs_trans_handle *trans,
        ins.offset = disk_num_bytes;
        ins.type = BTRFS_EXTENT_ITEM_KEY;
        ret = btrfs_alloc_reserved_file_extent(trans, root->root_key.objectid,
-                                              btrfs_ino(inode), file_pos,
-                                              ram_bytes, &ins);
+                       btrfs_ino(BTRFS_I(inode)), file_pos, ram_bytes, &ins);
        /*
         * Release the reserved range from inode dirty range map, as it is
         * already moved into delayed_ref_head
@@ -2320,7 +2225,7 @@ static noinline int record_one_backref(u64 inum, u64 offset, u64 root_id,
        u64 num_bytes;
 
        if (BTRFS_I(inode)->root->root_key.objectid == root_id &&
-           inum == btrfs_ino(inode))
+           inum == btrfs_ino(BTRFS_I(inode)))
                return 0;
 
        key.objectid = root_id;
@@ -2589,7 +2494,7 @@ static noinline int relink_extent_backref(struct btrfs_path *path,
        if (ret)
                goto out_free_path;
 again:
-       key.objectid = btrfs_ino(inode);
+       key.objectid = btrfs_ino(BTRFS_I(inode));
        key.type = BTRFS_EXTENT_DATA_KEY;
        key.offset = start;
 
@@ -2768,7 +2673,7 @@ record_old_file_extents(struct inode *inode,
        if (!path)
                goto out_kfree;
 
-       key.objectid = btrfs_ino(inode);
+       key.objectid = btrfs_ino(BTRFS_I(inode));
        key.type = BTRFS_EXTENT_DATA_KEY;
        key.offset = new->file_pos;
 
@@ -2803,7 +2708,7 @@ record_old_file_extents(struct inode *inode,
 
                btrfs_item_key_to_cpu(l, &key, slot);
 
-               if (key.objectid != btrfs_ino(inode))
+               if (key.objectid != btrfs_ino(BTRFS_I(inode)))
                        break;
                if (key.type != BTRFS_EXTENT_DATA_KEY)
                        break;
@@ -2887,16 +2792,17 @@ static int btrfs_finish_ordered_io(struct btrfs_ordered_extent *ordered_extent)
        bool nolock;
        bool truncated = false;
 
-       nolock = btrfs_is_free_space_inode(inode);
+       nolock = btrfs_is_free_space_inode(BTRFS_I(inode));
 
        if (test_bit(BTRFS_ORDERED_IOERR, &ordered_extent->flags)) {
                ret = -EIO;
                goto out;
        }
 
-       btrfs_free_io_failure_record(inode, ordered_extent->file_offset,
-                                    ordered_extent->file_offset +
-                                    ordered_extent->len - 1);
+       btrfs_free_io_failure_record(BTRFS_I(inode),
+                       ordered_extent->file_offset,
+                       ordered_extent->file_offset +
+                       ordered_extent->len - 1);
 
        if (test_bit(BTRFS_ORDERED_TRUNCATED, &ordered_extent->flags)) {
                truncated = true;
@@ -2967,7 +2873,7 @@ static int btrfs_finish_ordered_io(struct btrfs_ordered_extent *ordered_extent)
                compress_type = ordered_extent->compress_type;
        if (test_bit(BTRFS_ORDERED_PREALLOC, &ordered_extent->flags)) {
                BUG_ON(compress_type);
-               ret = btrfs_mark_extent_written(trans, inode,
+               ret = btrfs_mark_extent_written(trans, BTRFS_I(inode),
                                                ordered_extent->file_offset,
                                                ordered_extent->file_offset +
                                                logical_len);
@@ -2993,8 +2899,7 @@ static int btrfs_finish_ordered_io(struct btrfs_ordered_extent *ordered_extent)
                goto out_unlock;
        }
 
-       add_pending_csums(trans, inode, ordered_extent->file_offset,
-                         &ordered_extent->list);
+       add_pending_csums(trans, inode, &ordered_extent->list);
 
        btrfs_ordered_update_i_size(inode, 0, ordered_extent);
        ret = btrfs_update_inode_fallback(trans, root, inode);
@@ -3009,7 +2914,8 @@ out_unlock:
                             ordered_extent->len - 1, &cached_state, GFP_NOFS);
 out:
        if (root != fs_info->tree_root)
-               btrfs_delalloc_release_metadata(inode, ordered_extent->len);
+               btrfs_delalloc_release_metadata(BTRFS_I(inode),
+                               ordered_extent->len);
        if (trans)
                btrfs_end_transaction(trans);
 
@@ -3024,7 +2930,7 @@ out:
                clear_extent_uptodate(io_tree, start, end, NULL, GFP_NOFS);
 
                /* Drop the cache for the part of the extent we didn't write. */
-               btrfs_drop_extent_cache(inode, start, end, 0);
+               btrfs_drop_extent_cache(BTRFS_I(inode), start, end, 0);
 
                /*
                 * If the ordered extent had an IOERR or something else went
@@ -3072,7 +2978,7 @@ static void finish_ordered_fn(struct btrfs_work *work)
        btrfs_finish_ordered_io(ordered_extent);
 }
 
-static int btrfs_writepage_end_io_hook(struct page *page, u64 start, u64 end,
+static void btrfs_writepage_end_io_hook(struct page *page, u64 start, u64 end,
                                struct extent_state *state, int uptodate)
 {
        struct inode *inode = page->mapping->host;
@@ -3086,9 +2992,9 @@ static int btrfs_writepage_end_io_hook(struct page *page, u64 start, u64 end,
        ClearPagePrivate2(page);
        if (!btrfs_dec_test_ordered_pending(inode, &ordered_extent, start,
                                            end - start + 1, uptodate))
-               return 0;
+               return;
 
-       if (btrfs_is_free_space_inode(inode)) {
+       if (btrfs_is_free_space_inode(BTRFS_I(inode))) {
                wq = fs_info->endio_freespace_worker;
                func = btrfs_freespace_write_helper;
        } else {
@@ -3099,8 +3005,6 @@ static int btrfs_writepage_end_io_hook(struct page *page, u64 start, u64 end,
        btrfs_init_work(&ordered_extent->work, func, finish_ordered_fn, NULL,
                        NULL);
        btrfs_queue_work(wq, &ordered_extent->work);
-
-       return 0;
 }
 
 static int __readpage_endio_check(struct inode *inode,
@@ -3123,9 +3027,8 @@ static int __readpage_endio_check(struct inode *inode,
        kunmap_atomic(kaddr);
        return 0;
 zeroit:
-       btrfs_warn_rl(BTRFS_I(inode)->root->fs_info,
-               "csum failed ino %llu off %llu csum %u expected csum %u",
-                          btrfs_ino(inode), start, csum, csum_expected);
+       btrfs_print_data_csum_error(BTRFS_I(inode), start, csum, csum_expected,
+                                   io_bio->mirror_num);
        memset(kaddr + pgoff, 1, len);
        flush_dcache_page(page);
        kunmap_atomic(kaddr);
@@ -3263,10 +3166,11 @@ void btrfs_orphan_commit_root(struct btrfs_trans_handle *trans,
  * NOTE: caller of this function should reserve 5 units of metadata for
  *      this function.
  */
-int btrfs_orphan_add(struct btrfs_trans_handle *trans, struct inode *inode)
+int btrfs_orphan_add(struct btrfs_trans_handle *trans,
+               struct btrfs_inode *inode)
 {
-       struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
-       struct btrfs_root *root = BTRFS_I(inode)->root;
+       struct btrfs_fs_info *fs_info = btrfs_sb(inode->vfs_inode.i_sb);
+       struct btrfs_root *root = inode->root;
        struct btrfs_block_rsv *block_rsv = NULL;
        int reserve = 0;
        int insert = 0;
@@ -3288,7 +3192,7 @@ int btrfs_orphan_add(struct btrfs_trans_handle *trans, struct inode *inode)
        }
 
        if (!test_and_set_bit(BTRFS_INODE_HAS_ORPHAN_ITEM,
-                             &BTRFS_I(inode)->runtime_flags)) {
+                             &inode->runtime_flags)) {
 #if 0
                /*
                 * For proper ENOSPC handling, we should do orphan
@@ -3305,7 +3209,7 @@ int btrfs_orphan_add(struct btrfs_trans_handle *trans, struct inode *inode)
        }
 
        if (!test_and_set_bit(BTRFS_INODE_ORPHAN_META_RESERVED,
-                             &BTRFS_I(inode)->runtime_flags))
+                             &inode->runtime_flags))
                reserve = 1;
        spin_unlock(&root->orphan_lock);
 
@@ -3316,10 +3220,10 @@ int btrfs_orphan_add(struct btrfs_trans_handle *trans, struct inode *inode)
                if (ret) {
                        atomic_dec(&root->orphan_inodes);
                        clear_bit(BTRFS_INODE_ORPHAN_META_RESERVED,
-                                 &BTRFS_I(inode)->runtime_flags);
+                                 &inode->runtime_flags);
                        if (insert)
                                clear_bit(BTRFS_INODE_HAS_ORPHAN_ITEM,
-                                         &BTRFS_I(inode)->runtime_flags);
+                                         &inode->runtime_flags);
                        return ret;
                }
        }
@@ -3331,12 +3235,12 @@ int btrfs_orphan_add(struct btrfs_trans_handle *trans, struct inode *inode)
                        atomic_dec(&root->orphan_inodes);
                        if (reserve) {
                                clear_bit(BTRFS_INODE_ORPHAN_META_RESERVED,
-                                         &BTRFS_I(inode)->runtime_flags);
+                                         &inode->runtime_flags);
                                btrfs_orphan_release_metadata(inode);
                        }
                        if (ret != -EEXIST) {
                                clear_bit(BTRFS_INODE_HAS_ORPHAN_ITEM,
-                                         &BTRFS_I(inode)->runtime_flags);
+                                         &inode->runtime_flags);
                                btrfs_abort_transaction(trans, ret);
                                return ret;
                        }
@@ -3361,20 +3265,20 @@ int btrfs_orphan_add(struct btrfs_trans_handle *trans, struct inode *inode)
  * item for this particular inode.
  */
 static int btrfs_orphan_del(struct btrfs_trans_handle *trans,
-                           struct inode *inode)
+                           struct btrfs_inode *inode)
 {
-       struct btrfs_root *root = BTRFS_I(inode)->root;
+       struct btrfs_root *root = inode->root;
        int delete_item = 0;
        int release_rsv = 0;
        int ret = 0;
 
        spin_lock(&root->orphan_lock);
        if (test_and_clear_bit(BTRFS_INODE_HAS_ORPHAN_ITEM,
-                              &BTRFS_I(inode)->runtime_flags))
+                              &inode->runtime_flags))
                delete_item = 1;
 
        if (test_and_clear_bit(BTRFS_INODE_ORPHAN_META_RESERVED,
-                              &BTRFS_I(inode)->runtime_flags))
+                              &inode->runtime_flags))
                release_rsv = 1;
        spin_unlock(&root->orphan_lock);
 
@@ -3548,7 +3452,7 @@ int btrfs_orphan_cleanup(struct btrfs_root *root)
                                ret = PTR_ERR(trans);
                                goto out;
                        }
-                       ret = btrfs_orphan_add(trans, inode);
+                       ret = btrfs_orphan_add(trans, BTRFS_I(inode));
                        btrfs_end_transaction(trans);
                        if (ret) {
                                iput(inode);
@@ -3557,7 +3461,7 @@ int btrfs_orphan_cleanup(struct btrfs_root *root)
 
                        ret = btrfs_truncate(inode);
                        if (ret)
-                               btrfs_orphan_del(NULL, inode);
+                               btrfs_orphan_del(NULL, BTRFS_I(inode));
                } else {
                        nr_unlink++;
                }
@@ -3712,7 +3616,7 @@ static int btrfs_read_locked_inode(struct inode *inode)
        set_nlink(inode, btrfs_inode_nlink(leaf, inode_item));
        i_uid_write(inode, btrfs_inode_uid(leaf, inode_item));
        i_gid_write(inode, btrfs_inode_gid(leaf, inode_item));
-       btrfs_i_size_write(inode, btrfs_inode_size(leaf, inode_item));
+       btrfs_i_size_write(BTRFS_I(inode), btrfs_inode_size(leaf, inode_item));
 
        inode->i_atime.tv_sec = btrfs_timespec_sec(leaf, &inode_item->atime);
        inode->i_atime.tv_nsec = btrfs_timespec_nsec(leaf, &inode_item->atime);
@@ -3789,7 +3693,7 @@ cache_index:
                goto cache_acl;
 
        btrfs_item_key_to_cpu(leaf, &location, path->slots[0]);
-       if (location.objectid != btrfs_ino(inode))
+       if (location.objectid != btrfs_ino(BTRFS_I(inode)))
                goto cache_acl;
 
        ptr = btrfs_item_ptr_offset(leaf, path->slots[0]);
@@ -3811,14 +3715,14 @@ cache_acl:
         * any xattrs or acls
         */
        maybe_acls = acls_after_inode_item(leaf, path->slots[0],
-                                          btrfs_ino(inode), &first_xattr_slot);
+                       btrfs_ino(BTRFS_I(inode)), &first_xattr_slot);
        if (first_xattr_slot != -1) {
                path->slots[0] = first_xattr_slot;
                ret = btrfs_load_inode_props(inode, path);
                if (ret)
                        btrfs_err(fs_info,
                                  "error loading props for ino %llu (root %llu): %d",
-                                 btrfs_ino(inode),
+                                 btrfs_ino(BTRFS_I(inode)),
                                  root->root_key.objectid, ret);
        }
        btrfs_free_path(path);
@@ -3960,7 +3864,7 @@ noinline int btrfs_update_inode(struct btrfs_trans_handle *trans,
         * The data relocation inode should also be directly updated
         * without delay
         */
-       if (!btrfs_is_free_space_inode(inode)
+       if (!btrfs_is_free_space_inode(BTRFS_I(inode))
            && root->root_key.objectid != BTRFS_DATA_RELOC_TREE_OBJECTID
            && !test_bit(BTRFS_FS_LOG_RECOVERING, &fs_info->flags)) {
                btrfs_update_root_times(trans, root);
@@ -3993,7 +3897,8 @@ noinline int btrfs_update_inode_fallback(struct btrfs_trans_handle *trans,
  */
 static int __btrfs_unlink_inode(struct btrfs_trans_handle *trans,
                                struct btrfs_root *root,
-                               struct inode *dir, struct inode *inode,
+                               struct btrfs_inode *dir,
+                               struct btrfs_inode *inode,
                                const char *name, int name_len)
 {
        struct btrfs_fs_info *fs_info = root->fs_info;
@@ -4040,10 +3945,10 @@ static int __btrfs_unlink_inode(struct btrfs_trans_handle *trans,
         * that we delay to delete it, and just do this deletion when
         * we update the inode item.
         */
-       if (BTRFS_I(inode)->dir_index) {
+       if (inode->dir_index) {
                ret = btrfs_delayed_delete_inode_ref(inode);
                if (!ret) {
-                       index = BTRFS_I(inode)->dir_index;
+                       index = inode->dir_index;
                        goto skip_backref;
                }
        }
@@ -4064,15 +3969,15 @@ skip_backref:
                goto err;
        }
 
-       ret = btrfs_del_inode_ref_in_log(trans, root, name, name_len,
-                                        inode, dir_ino);
+       ret = btrfs_del_inode_ref_in_log(trans, root, name, name_len, inode,
+                       dir_ino);
        if (ret != 0 && ret != -ENOENT) {
                btrfs_abort_transaction(trans, ret);
                goto err;
        }
 
-       ret = btrfs_del_dir_entries_in_log(trans, root, name, name_len,
-                                          dir, index);
+       ret = btrfs_del_dir_entries_in_log(trans, root, name, name_len, dir,
+                       index);
        if (ret == -ENOENT)
                ret = 0;
        else if (ret)
@@ -4082,26 +3987,26 @@ err:
        if (ret)
                goto out;
 
-       btrfs_i_size_write(dir, dir->i_size - name_len * 2);
-       inode_inc_iversion(inode);
-       inode_inc_iversion(dir);
-       inode->i_ctime = dir->i_mtime =
-               dir->i_ctime = current_time(inode);
-       ret = btrfs_update_inode(trans, root, dir);
+       btrfs_i_size_write(dir, dir->vfs_inode.i_size - name_len * 2);
+       inode_inc_iversion(&inode->vfs_inode);
+       inode_inc_iversion(&dir->vfs_inode);
+       inode->vfs_inode.i_ctime = dir->vfs_inode.i_mtime =
+               dir->vfs_inode.i_ctime = current_time(&inode->vfs_inode);
+       ret = btrfs_update_inode(trans, root, &dir->vfs_inode);
 out:
        return ret;
 }
 
 int btrfs_unlink_inode(struct btrfs_trans_handle *trans,
                       struct btrfs_root *root,
-                      struct inode *dir, struct inode *inode,
+                      struct btrfs_inode *dir, struct btrfs_inode *inode,
                       const char *name, int name_len)
 {
        int ret;
        ret = __btrfs_unlink_inode(trans, root, dir, inode, name, name_len);
        if (!ret) {
-               drop_nlink(inode);
-               ret = btrfs_update_inode(trans, root, inode);
+               drop_nlink(&inode->vfs_inode);
+               ret = btrfs_update_inode(trans, root, &inode->vfs_inode);
        }
        return ret;
 }
@@ -4139,15 +4044,17 @@ static int btrfs_unlink(struct inode *dir, struct dentry *dentry)
        if (IS_ERR(trans))
                return PTR_ERR(trans);
 
-       btrfs_record_unlink_dir(trans, dir, d_inode(dentry), 0);
+       btrfs_record_unlink_dir(trans, BTRFS_I(dir), BTRFS_I(d_inode(dentry)),
+                       0);
 
-       ret = btrfs_unlink_inode(trans, root, dir, d_inode(dentry),
-                                dentry->d_name.name, dentry->d_name.len);
+       ret = btrfs_unlink_inode(trans, root, BTRFS_I(dir),
+                       BTRFS_I(d_inode(dentry)), dentry->d_name.name,
+                       dentry->d_name.len);
        if (ret)
                goto out;
 
        if (inode->i_nlink == 0) {
-               ret = btrfs_orphan_add(trans, inode);
+               ret = btrfs_orphan_add(trans, BTRFS_I(inode));
                if (ret)
                        goto out;
        }
@@ -4170,7 +4077,7 @@ int btrfs_unlink_subvol(struct btrfs_trans_handle *trans,
        struct btrfs_key key;
        u64 index;
        int ret;
-       u64 dir_ino = btrfs_ino(dir);
+       u64 dir_ino = btrfs_ino(BTRFS_I(dir));
 
        path = btrfs_alloc_path();
        if (!path)
@@ -4222,13 +4129,13 @@ int btrfs_unlink_subvol(struct btrfs_trans_handle *trans,
        }
        btrfs_release_path(path);
 
-       ret = btrfs_delete_delayed_dir_index(trans, fs_info, dir, index);
+       ret = btrfs_delete_delayed_dir_index(trans, fs_info, BTRFS_I(dir), index);
        if (ret) {
                btrfs_abort_transaction(trans, ret);
                goto out;
        }
 
-       btrfs_i_size_write(dir, dir->i_size - name_len * 2);
+       btrfs_i_size_write(BTRFS_I(dir), dir->i_size - name_len * 2);
        inode_inc_iversion(dir);
        dir->i_mtime = dir->i_ctime = current_time(dir);
        ret = btrfs_update_inode_fallback(trans, root, dir);
@@ -4249,14 +4156,14 @@ static int btrfs_rmdir(struct inode *dir, struct dentry *dentry)
 
        if (inode->i_size > BTRFS_EMPTY_DIR_SIZE)
                return -ENOTEMPTY;
-       if (btrfs_ino(inode) == BTRFS_FIRST_FREE_OBJECTID)
+       if (btrfs_ino(BTRFS_I(inode)) == BTRFS_FIRST_FREE_OBJECTID)
                return -EPERM;
 
        trans = __unlink_start_trans(dir);
        if (IS_ERR(trans))
                return PTR_ERR(trans);
 
-       if (unlikely(btrfs_ino(inode) == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID)) {
+       if (unlikely(btrfs_ino(BTRFS_I(inode)) == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID)) {
                err = btrfs_unlink_subvol(trans, root, dir,
                                          BTRFS_I(inode)->location.objectid,
                                          dentry->d_name.name,
@@ -4264,17 +4171,18 @@ static int btrfs_rmdir(struct inode *dir, struct dentry *dentry)
                goto out;
        }
 
-       err = btrfs_orphan_add(trans, inode);
+       err = btrfs_orphan_add(trans, BTRFS_I(inode));
        if (err)
                goto out;
 
        last_unlink_trans = BTRFS_I(inode)->last_unlink_trans;
 
        /* now the directory is empty */
-       err = btrfs_unlink_inode(trans, root, dir, d_inode(dentry),
-                                dentry->d_name.name, dentry->d_name.len);
+       err = btrfs_unlink_inode(trans, root, BTRFS_I(dir),
+                       BTRFS_I(d_inode(dentry)), dentry->d_name.name,
+                       dentry->d_name.len);
        if (!err) {
-               btrfs_i_size_write(inode, 0);
+               btrfs_i_size_write(BTRFS_I(inode), 0);
                /*
                 * Propagate the last_unlink_trans value of the deleted dir to
                 * its parent directory. This is to prevent an unrecoverable
@@ -4398,7 +4306,7 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans,
        int extent_type = -1;
        int ret;
        int err = 0;
-       u64 ino = btrfs_ino(inode);
+       u64 ino = btrfs_ino(BTRFS_I(inode));
        u64 bytes_deleted = 0;
        bool be_nice = 0;
        bool should_throttle = 0;
@@ -4410,7 +4318,7 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans,
         * for non-free space inodes and ref cows, we want to back off from
         * time to time
         */
-       if (!btrfs_is_free_space_inode(inode) &&
+       if (!btrfs_is_free_space_inode(BTRFS_I(inode)) &&
            test_bit(BTRFS_ROOT_REF_COWS, &root->state))
                be_nice = 1;
 
@@ -4426,7 +4334,7 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans,
         */
        if (test_bit(BTRFS_ROOT_REF_COWS, &root->state) ||
            root == fs_info->tree_root)
-               btrfs_drop_extent_cache(inode, ALIGN(new_size,
+               btrfs_drop_extent_cache(BTRFS_I(inode), ALIGN(new_size,
                                        fs_info->sectorsize),
                                        (u64)-1, 0);
 
@@ -4437,7 +4345,7 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans,
         * items.
         */
        if (min_type == 0 && root == BTRFS_I(inode)->root)
-               btrfs_kill_delayed_inode_items(inode);
+               btrfs_kill_delayed_inode_items(BTRFS_I(inode));
 
        key.objectid = ino;
        key.offset = (u64)-1;
@@ -4502,19 +4410,8 @@ search_again:
                if (found_type > min_type) {
                        del_item = 1;
                } else {
-                       if (item_end < new_size) {
-                               /*
-                                * With NO_HOLES mode, for the following mapping
-                                *
-                                * [0-4k][hole][8k-12k]
-                                *
-                                * if truncating isize down to 6k, it ends up
-                                * isize being 8k.
-                                */
-                               if (btrfs_fs_incompat(root->fs_info, NO_HOLES))
-                                       last_size = new_size;
+                       if (item_end < new_size)
                                break;
-                       }
                        if (found_key.offset >= new_size)
                                del_item = 1;
                        else
@@ -4697,11 +4594,22 @@ out:
                        btrfs_abort_transaction(trans, ret);
        }
 error:
-       if (root->root_key.objectid != BTRFS_TREE_LOG_OBJECTID)
+       if (root->root_key.objectid != BTRFS_TREE_LOG_OBJECTID) {
+               ASSERT(last_size >= new_size);
+               if (!err && last_size > new_size)
+                       last_size = new_size;
                btrfs_ordered_update_i_size(inode, last_size, NULL);
+       }
 
        btrfs_free_path(path);
 
+       if (err == 0) {
+               /* only inline file may have last_size != new_size */
+               if (new_size >= fs_info->sectorsize ||
+                   new_size > fs_info->max_inline)
+                       ASSERT(last_size == new_size);
+       }
+
        if (be_nice && bytes_deleted > SZ_32M) {
                unsigned long updates = trans->delayed_ref_updates;
                if (updates) {
@@ -4870,8 +4778,8 @@ static int maybe_insert_hole(struct btrfs_root *root, struct inode *inode,
                return ret;
        }
 
-       ret = btrfs_insert_file_extent(trans, root, btrfs_ino(inode), offset,
-                                      0, 0, len, 0, len, 0, 0, 0);
+       ret = btrfs_insert_file_extent(trans, root, btrfs_ino(BTRFS_I(inode)),
+                       offset, 0, 0, len, 0, len, 0, 0, 0);
        if (ret)
                btrfs_abort_transaction(trans, ret);
        else
@@ -4918,7 +4826,7 @@ int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size)
 
                lock_extent_bits(io_tree, hole_start, block_end - 1,
                                 &cached_state);
-               ordered = btrfs_lookup_ordered_range(inode, hole_start,
+               ordered = btrfs_lookup_ordered_range(BTRFS_I(inode), hole_start,
                                                     block_end - hole_start);
                if (!ordered)
                        break;
@@ -4930,7 +4838,7 @@ int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size)
 
        cur_offset = hole_start;
        while (1) {
-               em = btrfs_get_extent(inode, NULL, 0, cur_offset,
+               em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, cur_offset,
                                block_end - cur_offset, 0);
                if (IS_ERR(em)) {
                        err = PTR_ERR(em);
@@ -4947,7 +4855,7 @@ int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size)
                                                hole_size);
                        if (err)
                                break;
-                       btrfs_drop_extent_cache(inode, cur_offset,
+                       btrfs_drop_extent_cache(BTRFS_I(inode), cur_offset,
                                                cur_offset + hole_size - 1, 0);
                        hole_em = alloc_extent_map();
                        if (!hole_em) {
@@ -4973,7 +4881,8 @@ int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size)
                                write_unlock(&em_tree->lock);
                                if (err != -EEXIST)
                                        break;
-                               btrfs_drop_extent_cache(inode, cur_offset,
+                               btrfs_drop_extent_cache(BTRFS_I(inode),
+                                                       cur_offset,
                                                        cur_offset +
                                                        hole_size - 1, 0);
                        }
@@ -5070,7 +4979,7 @@ static int btrfs_setsize(struct inode *inode, struct iattr *attr)
                 * so we need to guarantee from this point on that everything
                 * will be consistent.
                 */
-               ret = btrfs_orphan_add(trans, inode);
+               ret = btrfs_orphan_add(trans, BTRFS_I(inode));
                btrfs_end_transaction(trans);
                if (ret)
                        return ret;
@@ -5079,14 +4988,21 @@ static int btrfs_setsize(struct inode *inode, struct iattr *attr)
                truncate_setsize(inode, newsize);
 
                /* Disable nonlocked read DIO to avoid the end less truncate */
-               btrfs_inode_block_unlocked_dio(inode);
+               btrfs_inode_block_unlocked_dio(BTRFS_I(inode));
                inode_dio_wait(inode);
-               btrfs_inode_resume_unlocked_dio(inode);
+               btrfs_inode_resume_unlocked_dio(BTRFS_I(inode));
 
                ret = btrfs_truncate(inode);
                if (ret && inode->i_nlink) {
                        int err;
 
+                       /* To get a stable disk_i_size */
+                       err = btrfs_wait_ordered_range(inode, 0, (u64)-1);
+                       if (err) {
+                               btrfs_orphan_del(NULL, BTRFS_I(inode));
+                               return err;
+                       }
+
                        /*
                         * failed to truncate, disk_i_size is only adjusted down
                         * as we remove extents, so it should represent the true
@@ -5095,11 +5011,11 @@ static int btrfs_setsize(struct inode *inode, struct iattr *attr)
                         */
                        trans = btrfs_join_transaction(root);
                        if (IS_ERR(trans)) {
-                               btrfs_orphan_del(NULL, inode);
+                               btrfs_orphan_del(NULL, BTRFS_I(inode));
                                return ret;
                        }
                        i_size_write(inode, BTRFS_I(inode)->disk_i_size);
-                       err = btrfs_orphan_del(trans, inode);
+                       err = btrfs_orphan_del(trans, BTRFS_I(inode));
                        if (err)
                                btrfs_abort_transaction(trans, err);
                        btrfs_end_transaction(trans);
@@ -5257,18 +5173,18 @@ void btrfs_evict_inode(struct inode *inode)
        if (inode->i_nlink &&
            ((btrfs_root_refs(&root->root_item) != 0 &&
              root->root_key.objectid != BTRFS_ROOT_TREE_OBJECTID) ||
-            btrfs_is_free_space_inode(inode)))
+            btrfs_is_free_space_inode(BTRFS_I(inode))))
                goto no_delete;
 
        if (is_bad_inode(inode)) {
-               btrfs_orphan_del(NULL, inode);
+               btrfs_orphan_del(NULL, BTRFS_I(inode));
                goto no_delete;
        }
        /* do we really want it for ->i_nlink > 0 and zero btrfs_root_refs? */
        if (!special_file(inode->i_mode))
                btrfs_wait_ordered_range(inode, 0, (u64)-1);
 
-       btrfs_free_io_failure_record(inode, 0, (u64)-1);
+       btrfs_free_io_failure_record(BTRFS_I(inode), 0, (u64)-1);
 
        if (test_bit(BTRFS_FS_LOG_RECOVERING, &fs_info->flags)) {
                BUG_ON(test_bit(BTRFS_INODE_HAS_ORPHAN_ITEM,
@@ -5282,22 +5198,22 @@ void btrfs_evict_inode(struct inode *inode)
                goto no_delete;
        }
 
-       ret = btrfs_commit_inode_delayed_inode(inode);
+       ret = btrfs_commit_inode_delayed_inode(BTRFS_I(inode));
        if (ret) {
-               btrfs_orphan_del(NULL, inode);
+               btrfs_orphan_del(NULL, BTRFS_I(inode));
                goto no_delete;
        }
 
        rsv = btrfs_alloc_block_rsv(fs_info, BTRFS_BLOCK_RSV_TEMP);
        if (!rsv) {
-               btrfs_orphan_del(NULL, inode);
+               btrfs_orphan_del(NULL, BTRFS_I(inode));
                goto no_delete;
        }
        rsv->size = min_size;
        rsv->failfast = 1;
        global_rsv = &fs_info->global_block_rsv;
 
-       btrfs_i_size_write(inode, 0);
+       btrfs_i_size_write(BTRFS_I(inode), 0);
 
        /*
         * This is a bit simpler than btrfs_truncate since we've already
@@ -5332,14 +5248,14 @@ void btrfs_evict_inode(struct inode *inode)
                        btrfs_warn(fs_info,
                                   "Could not get space for a delete, will truncate on mount %d",
                                   ret);
-                       btrfs_orphan_del(NULL, inode);
+                       btrfs_orphan_del(NULL, BTRFS_I(inode));
                        btrfs_free_block_rsv(fs_info, rsv);
                        goto no_delete;
                }
 
                trans = btrfs_join_transaction(root);
                if (IS_ERR(trans)) {
-                       btrfs_orphan_del(NULL, inode);
+                       btrfs_orphan_del(NULL, BTRFS_I(inode));
                        btrfs_free_block_rsv(fs_info, rsv);
                        goto no_delete;
                }
@@ -5365,7 +5281,7 @@ void btrfs_evict_inode(struct inode *inode)
                if (ret) {
                        ret = btrfs_commit_transaction(trans);
                        if (ret) {
-                               btrfs_orphan_del(NULL, inode);
+                               btrfs_orphan_del(NULL, BTRFS_I(inode));
                                btrfs_free_block_rsv(fs_info, rsv);
                                goto no_delete;
                        }
@@ -5394,20 +5310,20 @@ void btrfs_evict_inode(struct inode *inode)
         */
        if (ret == 0) {
                trans->block_rsv = root->orphan_block_rsv;
-               btrfs_orphan_del(trans, inode);
+               btrfs_orphan_del(trans, BTRFS_I(inode));
        } else {
-               btrfs_orphan_del(NULL, inode);
+               btrfs_orphan_del(NULL, BTRFS_I(inode));
        }
 
        trans->block_rsv = &fs_info->trans_block_rsv;
        if (!(root == fs_info->tree_root ||
              root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID))
-               btrfs_return_ino(root, btrfs_ino(inode));
+               btrfs_return_ino(root, btrfs_ino(BTRFS_I(inode)));
 
        btrfs_end_transaction(trans);
        btrfs_btree_balance_dirty(fs_info);
 no_delete:
-       btrfs_remove_delayed_node(inode);
+       btrfs_remove_delayed_node(BTRFS_I(inode));
        clear_inode(inode);
 }
 
@@ -5429,8 +5345,8 @@ static int btrfs_inode_by_name(struct inode *dir, struct dentry *dentry,
        if (!path)
                return -ENOMEM;
 
-       di = btrfs_lookup_dir_item(NULL, root, path, btrfs_ino(dir), name,
-                                   namelen, 0);
+       di = btrfs_lookup_dir_item(NULL, root, path, btrfs_ino(BTRFS_I(dir)),
+                       name, namelen, 0);
        if (IS_ERR(di))
                ret = PTR_ERR(di);
 
@@ -5485,7 +5401,7 @@ static int fixup_tree_root_location(struct btrfs_fs_info *fs_info,
 
        leaf = path->nodes[0];
        ref = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_root_ref);
-       if (btrfs_root_ref_dirid(leaf, ref) != btrfs_ino(dir) ||
+       if (btrfs_root_ref_dirid(leaf, ref) != btrfs_ino(BTRFS_I(dir)) ||
            btrfs_root_ref_name_len(leaf, ref) != dentry->d_name.len)
                goto out;
 
@@ -5520,7 +5436,7 @@ static void inode_tree_add(struct inode *inode)
        struct rb_node **p;
        struct rb_node *parent;
        struct rb_node *new = &BTRFS_I(inode)->rb_node;
-       u64 ino = btrfs_ino(inode);
+       u64 ino = btrfs_ino(BTRFS_I(inode));
 
        if (inode_unhashed(inode))
                return;
@@ -5531,9 +5447,9 @@ static void inode_tree_add(struct inode *inode)
                parent = *p;
                entry = rb_entry(parent, struct btrfs_inode, rb_node);
 
-               if (ino < btrfs_ino(&entry->vfs_inode))
+               if (ino < btrfs_ino(BTRFS_I(&entry->vfs_inode)))
                        p = &parent->rb_left;
-               else if (ino > btrfs_ino(&entry->vfs_inode))
+               else if (ino > btrfs_ino(BTRFS_I(&entry->vfs_inode)))
                        p = &parent->rb_right;
                else {
                        WARN_ON(!(entry->vfs_inode.i_state &
@@ -5593,9 +5509,9 @@ again:
                prev = node;
                entry = rb_entry(node, struct btrfs_inode, rb_node);
 
-               if (objectid < btrfs_ino(&entry->vfs_inode))
+               if (objectid < btrfs_ino(BTRFS_I(&entry->vfs_inode)))
                        node = node->rb_left;
-               else if (objectid > btrfs_ino(&entry->vfs_inode))
+               else if (objectid > btrfs_ino(BTRFS_I(&entry->vfs_inode)))
                        node = node->rb_right;
                else
                        break;
@@ -5603,7 +5519,7 @@ again:
        if (!node) {
                while (prev) {
                        entry = rb_entry(prev, struct btrfs_inode, rb_node);
-                       if (objectid <= btrfs_ino(&entry->vfs_inode)) {
+                       if (objectid <= btrfs_ino(BTRFS_I(&entry->vfs_inode))) {
                                node = prev;
                                break;
                        }
@@ -5612,7 +5528,7 @@ again:
        }
        while (node) {
                entry = rb_entry(node, struct btrfs_inode, rb_node);
-               objectid = btrfs_ino(&entry->vfs_inode) + 1;
+               objectid = btrfs_ino(BTRFS_I(&entry->vfs_inode)) + 1;
                inode = igrab(&entry->vfs_inode);
                if (inode) {
                        spin_unlock(&root->inode_lock);
@@ -5796,7 +5712,7 @@ static int btrfs_dentry_delete(const struct dentry *dentry)
                if (btrfs_root_refs(&root->root_item) == 0)
                        return 1;
 
-               if (btrfs_ino(inode) == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID)
+               if (btrfs_ino(BTRFS_I(inode)) == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID)
                        return 1;
        }
        return 0;
@@ -5865,7 +5781,7 @@ static int btrfs_real_readdir(struct file *file, struct dir_context *ctx)
 
        key.type = BTRFS_DIR_INDEX_KEY;
        key.offset = ctx->pos;
-       key.objectid = btrfs_ino(inode);
+       key.objectid = btrfs_ino(BTRFS_I(inode));
 
        ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
        if (ret < 0)
@@ -5974,7 +5890,8 @@ int btrfs_write_inode(struct inode *inode, struct writeback_control *wbc)
        if (test_bit(BTRFS_INODE_DUMMY, &BTRFS_I(inode)->runtime_flags))
                return 0;
 
-       if (btrfs_fs_closing(root->fs_info) && btrfs_is_free_space_inode(inode))
+       if (btrfs_fs_closing(root->fs_info) &&
+                       btrfs_is_free_space_inode(BTRFS_I(inode)))
                nolock = true;
 
        if (wbc->sync_mode == WB_SYNC_ALL) {
@@ -6054,9 +5971,9 @@ static int btrfs_update_time(struct inode *inode, struct timespec *now,
  * and then set the in-memory index_cnt variable to reflect
  * free sequence numbers
  */
-static int btrfs_set_inode_index_count(struct inode *inode)
+static int btrfs_set_inode_index_count(struct btrfs_inode *inode)
 {
-       struct btrfs_root *root = BTRFS_I(inode)->root;
+       struct btrfs_root *root = inode->root;
        struct btrfs_key key, found_key;
        struct btrfs_path *path;
        struct extent_buffer *leaf;
@@ -6085,7 +6002,7 @@ static int btrfs_set_inode_index_count(struct inode *inode)
         * else has to start at 2
         */
        if (path->slots[0] == 0) {
-               BTRFS_I(inode)->index_cnt = 2;
+               inode->index_cnt = 2;
                goto out;
        }
 
@@ -6096,11 +6013,11 @@ static int btrfs_set_inode_index_count(struct inode *inode)
 
        if (found_key.objectid != btrfs_ino(inode) ||
            found_key.type != BTRFS_DIR_INDEX_KEY) {
-               BTRFS_I(inode)->index_cnt = 2;
+               inode->index_cnt = 2;
                goto out;
        }
 
-       BTRFS_I(inode)->index_cnt = found_key.offset + 1;
+       inode->index_cnt = found_key.offset + 1;
 out:
        btrfs_free_path(path);
        return ret;
@@ -6110,11 +6027,11 @@ out:
  * helper to find a free sequence number in a given directory.  This current
  * code is very simple, later versions will do smarter things in the btree
  */
-int btrfs_set_inode_index(struct inode *dir, u64 *index)
+int btrfs_set_inode_index(struct btrfs_inode *dir, u64 *index)
 {
        int ret = 0;
 
-       if (BTRFS_I(dir)->index_cnt == (u64)-1) {
+       if (dir->index_cnt == (u64)-1) {
                ret = btrfs_inode_delayed_dir_index_count(dir);
                if (ret) {
                        ret = btrfs_set_inode_index_count(dir);
@@ -6123,8 +6040,8 @@ int btrfs_set_inode_index(struct inode *dir, u64 *index)
                }
        }
 
-       *index = BTRFS_I(dir)->index_cnt;
-       BTRFS_I(dir)->index_cnt++;
+       *index = dir->index_cnt;
+       dir->index_cnt++;
 
        return ret;
 }
@@ -6185,7 +6102,7 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans,
        if (dir && name) {
                trace_btrfs_inode_request(dir);
 
-               ret = btrfs_set_inode_index(dir, index);
+               ret = btrfs_set_inode_index(BTRFS_I(dir), index);
                if (ret) {
                        btrfs_free_path(path);
                        iput(inode);
@@ -6294,7 +6211,7 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans,
        if (ret)
                btrfs_err(fs_info,
                          "error inheriting props for ino %llu (root %llu): %d",
-                         btrfs_ino(inode), root->root_key.objectid, ret);
+                       btrfs_ino(BTRFS_I(inode)), root->root_key.objectid, ret);
 
        return inode;
 
@@ -6320,18 +6237,18 @@ static inline u8 btrfs_inode_type(struct inode *inode)
  * inode to the parent directory.
  */
 int btrfs_add_link(struct btrfs_trans_handle *trans,
-                  struct inode *parent_inode, struct inode *inode,
+                  struct btrfs_inode *parent_inode, struct btrfs_inode *inode,
                   const char *name, int name_len, int add_backref, u64 index)
 {
-       struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
+       struct btrfs_fs_info *fs_info = btrfs_sb(inode->vfs_inode.i_sb);
        int ret = 0;
        struct btrfs_key key;
-       struct btrfs_root *root = BTRFS_I(parent_inode)->root;
+       struct btrfs_root *root = parent_inode->root;
        u64 ino = btrfs_ino(inode);
        u64 parent_ino = btrfs_ino(parent_inode);
 
        if (unlikely(ino == BTRFS_FIRST_FREE_OBJECTID)) {
-               memcpy(&key, &BTRFS_I(inode)->root->root_key, sizeof(key));
+               memcpy(&key, &inode->root->root_key, sizeof(key));
        } else {
                key.objectid = ino;
                key.type = BTRFS_INODE_ITEM_KEY;
@@ -6353,7 +6270,7 @@ int btrfs_add_link(struct btrfs_trans_handle *trans,
 
        ret = btrfs_insert_dir_item(trans, root, name, name_len,
                                    parent_inode, &key,
-                                   btrfs_inode_type(inode), index);
+                                   btrfs_inode_type(&inode->vfs_inode), index);
        if (ret == -EEXIST || ret == -EOVERFLOW)
                goto fail_dir_item;
        else if (ret) {
@@ -6361,12 +6278,12 @@ int btrfs_add_link(struct btrfs_trans_handle *trans,
                return ret;
        }
 
-       btrfs_i_size_write(parent_inode, parent_inode->i_size +
+       btrfs_i_size_write(parent_inode, parent_inode->vfs_inode.i_size +
                           name_len * 2);
-       inode_inc_iversion(parent_inode);
-       parent_inode->i_mtime = parent_inode->i_ctime =
-               current_time(parent_inode);
-       ret = btrfs_update_inode(trans, root, parent_inode);
+       inode_inc_iversion(&parent_inode->vfs_inode);
+       parent_inode->vfs_inode.i_mtime = parent_inode->vfs_inode.i_ctime =
+               current_time(&parent_inode->vfs_inode);
+       ret = btrfs_update_inode(trans, root, &parent_inode->vfs_inode);
        if (ret)
                btrfs_abort_transaction(trans, ret);
        return ret;
@@ -6390,8 +6307,8 @@ fail_dir_item:
 }
 
 static int btrfs_add_nondir(struct btrfs_trans_handle *trans,
-                           struct inode *dir, struct dentry *dentry,
-                           struct inode *inode, int backref, u64 index)
+                           struct btrfs_inode *dir, struct dentry *dentry,
+                           struct btrfs_inode *inode, int backref, u64 index)
 {
        int err = btrfs_add_link(trans, dir, inode,
                                 dentry->d_name.name, dentry->d_name.len,
@@ -6427,8 +6344,8 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry,
                goto out_unlock;
 
        inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name,
-                               dentry->d_name.len, btrfs_ino(dir), objectid,
-                               mode, &index);
+                       dentry->d_name.len, btrfs_ino(BTRFS_I(dir)), objectid,
+                       mode, &index);
        if (IS_ERR(inode)) {
                err = PTR_ERR(inode);
                goto out_unlock;
@@ -6447,7 +6364,8 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry,
        if (err)
                goto out_unlock_inode;
 
-       err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index);
+       err = btrfs_add_nondir(trans, BTRFS_I(dir), dentry, BTRFS_I(inode),
+                       0, index);
        if (err) {
                goto out_unlock_inode;
        } else {
@@ -6499,8 +6417,8 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry,
                goto out_unlock;
 
        inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name,
-                               dentry->d_name.len, btrfs_ino(dir), objectid,
-                               mode, &index);
+                       dentry->d_name.len, btrfs_ino(BTRFS_I(dir)), objectid,
+                       mode, &index);
        if (IS_ERR(inode)) {
                err = PTR_ERR(inode);
                goto out_unlock;
@@ -6524,7 +6442,8 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry,
        if (err)
                goto out_unlock_inode;
 
-       err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index);
+       err = btrfs_add_nondir(trans, BTRFS_I(dir), dentry, BTRFS_I(inode),
+                       0, index);
        if (err)
                goto out_unlock_inode;
 
@@ -6566,7 +6485,7 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir,
        if (inode->i_nlink >= BTRFS_LINK_MAX)
                return -EMLINK;
 
-       err = btrfs_set_inode_index(dir, &index);
+       err = btrfs_set_inode_index(BTRFS_I(dir), &index);
        if (err)
                goto fail;
 
@@ -6590,7 +6509,8 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir,
        ihold(inode);
        set_bit(BTRFS_INODE_COPY_EVERYTHING, &BTRFS_I(inode)->runtime_flags);
 
-       err = btrfs_add_nondir(trans, dir, dentry, inode, 1, index);
+       err = btrfs_add_nondir(trans, BTRFS_I(dir), dentry, BTRFS_I(inode),
+                       1, index);
 
        if (err) {
                drop_inode = 1;
@@ -6604,12 +6524,12 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir,
                         * If new hard link count is 1, it's a file created
                         * with open(2) O_TMPFILE flag.
                         */
-                       err = btrfs_orphan_del(trans, inode);
+                       err = btrfs_orphan_del(trans, BTRFS_I(inode));
                        if (err)
                                goto fail;
                }
                d_instantiate(dentry, inode);
-               btrfs_log_new_name(trans, inode, NULL, parent);
+               btrfs_log_new_name(trans, BTRFS_I(inode), NULL, parent);
        }
 
        btrfs_balance_delayed_items(fs_info);
@@ -6649,8 +6569,8 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
                goto out_fail;
 
        inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name,
-                               dentry->d_name.len, btrfs_ino(dir), objectid,
-                               S_IFDIR | mode, &index);
+                       dentry->d_name.len, btrfs_ino(BTRFS_I(dir)), objectid,
+                       S_IFDIR | mode, &index);
        if (IS_ERR(inode)) {
                err = PTR_ERR(inode);
                goto out_fail;
@@ -6665,13 +6585,14 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
        if (err)
                goto out_fail_inode;
 
-       btrfs_i_size_write(inode, 0);
+       btrfs_i_size_write(BTRFS_I(inode), 0);
        err = btrfs_update_inode(trans, root, inode);
        if (err)
                goto out_fail_inode;
 
-       err = btrfs_add_link(trans, dir, inode, dentry->d_name.name,
-                            dentry->d_name.len, 0, index);
+       err = btrfs_add_link(trans, BTRFS_I(dir), BTRFS_I(inode),
+                       dentry->d_name.name,
+                       dentry->d_name.len, 0, index);
        if (err)
                goto out_fail_inode;
 
@@ -6788,6 +6709,20 @@ static noinline int uncompress_inline(struct btrfs_path *path,
        max_size = min_t(unsigned long, PAGE_SIZE, max_size);
        ret = btrfs_decompress(compress_type, tmp, page,
                               extent_offset, inline_size, max_size);
+
+       /*
+        * decompression code contains a memset to fill in any space between the end
+        * of the uncompressed data and the end of max_size in case the decompressed
+        * data ends up shorter than ram_bytes.  That doesn't cover the hole between
+        * the end of an inline extent and the beginning of the next block, so we
+        * cover that region here.
+        */
+
+       if (max_size + pg_offset < PAGE_SIZE) {
+               char *map = kmap(page);
+               memset(map + pg_offset + max_size, 0, PAGE_SIZE - max_size - pg_offset);
+               kunmap(page);
+       }
        kfree(tmp);
        return ret;
 }
@@ -6801,11 +6736,12 @@ static noinline int uncompress_inline(struct btrfs_path *path,
  * This also copies inline extents directly into the page.
  */
 
-struct extent_map *btrfs_get_extent(struct inode *inode, struct page *page,
-                                   size_t pg_offset, u64 start, u64 len,
-                                   int create)
+struct extent_map *btrfs_get_extent(struct btrfs_inode *inode,
+               struct page *page,
+           size_t pg_offset, u64 start, u64 len,
+               int create)
 {
-       struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
+       struct btrfs_fs_info *fs_info = btrfs_sb(inode->vfs_inode.i_sb);
        int ret;
        int err = 0;
        u64 extent_start = 0;
@@ -6813,13 +6749,13 @@ struct extent_map *btrfs_get_extent(struct inode *inode, struct page *page,
        u64 objectid = btrfs_ino(inode);
        u32 found_type;
        struct btrfs_path *path = NULL;
-       struct btrfs_root *root = BTRFS_I(inode)->root;
+       struct btrfs_root *root = inode->root;
        struct btrfs_file_extent_item *item;
        struct extent_buffer *leaf;
        struct btrfs_key found_key;
        struct extent_map *em = NULL;
-       struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree;
-       struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree;
+       struct extent_map_tree *em_tree = &inode->extent_tree;
+       struct extent_io_tree *io_tree = &inode->io_tree;
        struct btrfs_trans_handle *trans = NULL;
        const bool new_inline = !page || create;
 
@@ -6932,7 +6868,8 @@ next:
                goto not_found_em;
        }
 
-       btrfs_extent_item_to_extent_map(inode, path, item, new_inline, em);
+       btrfs_extent_item_to_extent_map(inode, path, item,
+                       new_inline, em);
 
        if (found_type == BTRFS_FILE_EXTENT_REG ||
            found_type == BTRFS_FILE_EXTENT_PREALLOC) {
@@ -7084,9 +7021,10 @@ out:
        return em;
 }
 
-struct extent_map *btrfs_get_extent_fiemap(struct inode *inode, struct page *page,
-                                          size_t pg_offset, u64 start, u64 len,
-                                          int create)
+struct extent_map *btrfs_get_extent_fiemap(struct btrfs_inode *inode,
+               struct page *page,
+               size_t pg_offset, u64 start, u64 len,
+               int create)
 {
        struct extent_map *em;
        struct extent_map *hole_em = NULL;
@@ -7123,7 +7061,7 @@ struct extent_map *btrfs_get_extent_fiemap(struct inode *inode, struct page *pag
        em = NULL;
 
        /* ok, we didn't find anything, lets look for delalloc */
-       found = count_range_bits(&BTRFS_I(inode)->io_tree, &range_start,
+       found = count_range_bits(&inode->io_tree, &range_start,
                                 end, len, EXTENT_DELALLOC, 1);
        found_end = range_start + found;
        if (found_end < range_start)
@@ -7225,9 +7163,11 @@ static struct extent_map *btrfs_create_dio_extent(struct inode *inode,
        int ret;
 
        if (type != BTRFS_ORDERED_NOCOW) {
-               em = create_pinned_em(inode, start, len, orig_start,
-                                     block_start, block_len, orig_block_len,
-                                     ram_bytes, type);
+               em = create_io_em(inode, start, len, orig_start,
+                                 block_start, block_len, orig_block_len,
+                                 ram_bytes,
+                                 BTRFS_COMPRESS_NONE, /* compress_type */
+                                 type);
                if (IS_ERR(em))
                        goto out;
        }
@@ -7236,7 +7176,7 @@ static struct extent_map *btrfs_create_dio_extent(struct inode *inode,
        if (ret) {
                if (em) {
                        free_extent_map(em);
-                       btrfs_drop_extent_cache(inode, start,
+                       btrfs_drop_extent_cache(BTRFS_I(inode), start,
                                                start + len - 1, 0);
                }
                em = ERR_PTR(ret);
@@ -7264,7 +7204,7 @@ static struct extent_map *btrfs_new_extent_direct(struct inode *inode,
 
        em = btrfs_create_dio_extent(inode, start, ins.offset, start,
                                     ins.objectid, ins.offset, ins.offset,
-                                    ins.offset, 0);
+                                    ins.offset, BTRFS_ORDERED_REGULAR);
        btrfs_dec_block_group_reservations(fs_info, ins.objectid);
        if (IS_ERR(em))
                btrfs_free_reserved_extent(fs_info, ins.objectid,
@@ -7282,7 +7222,6 @@ noinline int can_nocow_extent(struct inode *inode, u64 offset, u64 *len,
                              u64 *ram_bytes)
 {
        struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
-       struct btrfs_trans_handle *trans;
        struct btrfs_path *path;
        int ret;
        struct extent_buffer *leaf;
@@ -7302,8 +7241,8 @@ noinline int can_nocow_extent(struct inode *inode, u64 offset, u64 *len,
        if (!path)
                return -ENOMEM;
 
-       ret = btrfs_lookup_file_extent(NULL, root, path, btrfs_ino(inode),
-                                      offset, 0);
+       ret = btrfs_lookup_file_extent(NULL, root, path,
+                       btrfs_ino(BTRFS_I(inode)), offset, 0);
        if (ret < 0)
                goto out;
 
@@ -7319,7 +7258,7 @@ noinline int can_nocow_extent(struct inode *inode, u64 offset, u64 *len,
        ret = 0;
        leaf = path->nodes[0];
        btrfs_item_key_to_cpu(leaf, &key, slot);
-       if (key.objectid != btrfs_ino(inode) ||
+       if (key.objectid != btrfs_ino(BTRFS_I(inode)) ||
            key.type != BTRFS_EXTENT_DATA_KEY) {
                /* not our file or wrong item type, must cow */
                goto out;
@@ -7385,15 +7324,9 @@ noinline int can_nocow_extent(struct inode *inode, u64 offset, u64 *len,
         * look for other files referencing this extent, if we
         * find any we must cow
         */
-       trans = btrfs_join_transaction(root);
-       if (IS_ERR(trans)) {
-               ret = 0;
-               goto out;
-       }
 
-       ret = btrfs_cross_ref_exist(trans, root, btrfs_ino(inode),
+       ret = btrfs_cross_ref_exist(root, btrfs_ino(BTRFS_I(inode)),
                                    key.offset - backref_offset, disk_bytenr);
-       btrfs_end_transaction(trans);
        if (ret) {
                ret = 0;
                goto out;
@@ -7504,7 +7437,7 @@ static int lock_extent_direct(struct inode *inode, u64 lockstart, u64 lockend,
                 * doing DIO to, so we need to make sure there's no ordered
                 * extents in this range.
                 */
-               ordered = btrfs_lookup_ordered_range(inode, lockstart,
+               ordered = btrfs_lookup_ordered_range(BTRFS_I(inode), lockstart,
                                                     lockend - lockstart + 1);
 
                /*
@@ -7570,17 +7503,23 @@ static int lock_extent_direct(struct inode *inode, u64 lockstart, u64 lockend,
        return ret;
 }
 
-static struct extent_map *create_pinned_em(struct inode *inode, u64 start,
-                                          u64 len, u64 orig_start,
-                                          u64 block_start, u64 block_len,
-                                          u64 orig_block_len, u64 ram_bytes,
-                                          int type)
+/* The callers of this must take lock_extent() */
+static struct extent_map *create_io_em(struct inode *inode, u64 start, u64 len,
+                                      u64 orig_start, u64 block_start,
+                                      u64 block_len, u64 orig_block_len,
+                                      u64 ram_bytes, int compress_type,
+                                      int type)
 {
        struct extent_map_tree *em_tree;
        struct extent_map *em;
        struct btrfs_root *root = BTRFS_I(inode)->root;
        int ret;
 
+       ASSERT(type == BTRFS_ORDERED_PREALLOC ||
+              type == BTRFS_ORDERED_COMPRESSED ||
+              type == BTRFS_ORDERED_NOCOW ||
+              type == BTRFS_ORDERED_REGULAR);
+
        em_tree = &BTRFS_I(inode)->extent_tree;
        em = alloc_extent_map();
        if (!em)
@@ -7588,8 +7527,6 @@ static struct extent_map *create_pinned_em(struct inode *inode, u64 start,
 
        em->start = start;
        em->orig_start = orig_start;
-       em->mod_start = start;
-       em->mod_len = len;
        em->len = len;
        em->block_len = block_len;
        em->block_start = block_start;
@@ -7598,15 +7535,23 @@ static struct extent_map *create_pinned_em(struct inode *inode, u64 start,
        em->ram_bytes = ram_bytes;
        em->generation = -1;
        set_bit(EXTENT_FLAG_PINNED, &em->flags);
-       if (type == BTRFS_ORDERED_PREALLOC)
+       if (type == BTRFS_ORDERED_PREALLOC) {
                set_bit(EXTENT_FLAG_FILLING, &em->flags);
+       } else if (type == BTRFS_ORDERED_COMPRESSED) {
+               set_bit(EXTENT_FLAG_COMPRESSED, &em->flags);
+               em->compress_type = compress_type;
+       }
 
        do {
-               btrfs_drop_extent_cache(inode, em->start,
+               btrfs_drop_extent_cache(BTRFS_I(inode), em->start,
                                em->start + em->len - 1, 0);
                write_lock(&em_tree->lock);
                ret = add_extent_mapping(em_tree, em, 1);
                write_unlock(&em_tree->lock);
+               /*
+                * The caller has taken lock_extent(), who could race with us
+                * to add em?
+                */
        } while (ret == -EEXIST);
 
        if (ret) {
@@ -7614,6 +7559,7 @@ static struct extent_map *create_pinned_em(struct inode *inode, u64 start,
                return ERR_PTR(ret);
        }
 
+       /* em got 2 refs now, callers needs to do free_extent_map once. */
        return em;
 }
 
@@ -7621,10 +7567,8 @@ static void adjust_dio_outstanding_extents(struct inode *inode,
                                           struct btrfs_dio_data *dio_data,
                                           const u64 len)
 {
-       unsigned num_extents;
+       unsigned num_extents = count_max_extents(len);
 
-       num_extents = (unsigned) div64_u64(len + BTRFS_MAX_EXTENT_SIZE - 1,
-                                          BTRFS_MAX_EXTENT_SIZE);
        /*
         * If we have an outstanding_extents count still set then we're
         * within our reservation, otherwise we need to adjust our inode
@@ -7687,7 +7631,7 @@ static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock,
                goto err;
        }
 
-       em = btrfs_get_extent(inode, NULL, 0, start, len, 0);
+       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, start, len, 0);
        if (IS_ERR(em)) {
                ret = PTR_ERR(em);
                goto unlock_err;
@@ -7804,7 +7748,7 @@ unlock:
                 * Need to update the i_size under the extent lock so buffered
                 * readers will get the updated i_size when we unlock.
                 */
-               if (start + len > i_size_read(inode))
+               if (!dio_data->overwrite && start + len > i_size_read(inode))
                        i_size_write(inode, start + len);
 
                adjust_dio_outstanding_extents(inode, dio_data, len);
@@ -7924,7 +7868,7 @@ static int dio_read_error(struct inode *inode, struct bio *failed_bio,
        ret = btrfs_check_dio_repairable(inode, failed_bio, failrec,
                                         failed_mirror);
        if (!ret) {
-               free_io_failure(inode, failrec);
+               free_io_failure(BTRFS_I(inode), failrec);
                return -EIO;
        }
 
@@ -7938,7 +7882,7 @@ static int dio_read_error(struct inode *inode, struct bio *failed_bio,
        bio = btrfs_create_repair_bio(inode, failed_bio, failrec, page,
                                pgoff, isector, repair_endio, repair_arg);
        if (!bio) {
-               free_io_failure(inode, failrec);
+               free_io_failure(BTRFS_I(inode), failrec);
                return -EIO;
        }
        bio_set_op_attrs(bio, REQ_OP_READ, read_mode);
@@ -7949,7 +7893,7 @@ static int dio_read_error(struct inode *inode, struct bio *failed_bio,
 
        ret = submit_dio_repair_bio(inode, bio, failrec->this_mirror);
        if (ret) {
-               free_io_failure(inode, failrec);
+               free_io_failure(BTRFS_I(inode), failrec);
                bio_put(bio);
        }
 
@@ -7979,7 +7923,7 @@ static void btrfs_retry_endio_nocsum(struct bio *bio)
 
        done->uptodate = 1;
        bio_for_each_segment_all(bvec, bio, i)
-               clean_io_failure(done->inode, done->start, bvec->bv_page, 0);
+       clean_io_failure(BTRFS_I(done->inode), done->start, bvec->bv_page, 0);
 end:
        complete(&done->done);
        bio_put(bio);
@@ -8065,7 +8009,7 @@ static void btrfs_retry_endio(struct bio *bio)
                                        bvec->bv_page, bvec->bv_offset,
                                        done->start, bvec->bv_len);
                if (!ret)
-                       clean_io_failure(done->inode, done->start,
+                       clean_io_failure(BTRFS_I(done->inode), done->start,
                                        bvec->bv_page, bvec->bv_offset);
                else
                        uptodate = 0;
@@ -8254,7 +8198,8 @@ static void btrfs_end_dio_bio(struct bio *bio)
        if (err)
                btrfs_warn(BTRFS_I(dip->inode)->root->fs_info,
                           "direct IO failed ino %llu rw %d,%u sector %#Lx len %u err no %d",
-                          btrfs_ino(dip->inode), bio_op(bio), bio->bi_opf,
+                          btrfs_ino(BTRFS_I(dip->inode)), bio_op(bio),
+                          bio->bi_opf,
                           (unsigned long long)bio->bi_iter.bi_sector,
                           bio->bi_iter.bi_size, err);
 
@@ -8679,15 +8624,14 @@ static ssize_t btrfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
                 * not unlock the i_mutex at this case.
                 */
                if (offset + count <= inode->i_size) {
+                       dio_data.overwrite = 1;
                        inode_unlock(inode);
                        relock = true;
                }
                ret = btrfs_delalloc_reserve_space(inode, offset, count);
                if (ret)
                        goto out;
-               dio_data.outstanding_extents = div64_u64(count +
-                                               BTRFS_MAX_EXTENT_SIZE - 1,
-                                               BTRFS_MAX_EXTENT_SIZE);
+               dio_data.outstanding_extents = count_max_extents(count);
 
                /*
                 * We need to know how many extents we reserved so that we can
@@ -8831,7 +8775,7 @@ static int btrfs_releasepage(struct page *page, gfp_t gfp_flags)
 {
        if (PageWriteback(page) || PageDirty(page))
                return 0;
-       return __btrfs_releasepage(page, gfp_flags & GFP_NOFS);
+       return __btrfs_releasepage(page, gfp_flags);
 }
 
 static void btrfs_invalidatepage(struct page *page, unsigned int offset,
@@ -8866,7 +8810,7 @@ static void btrfs_invalidatepage(struct page *page, unsigned int offset,
                lock_extent_bits(tree, page_start, page_end, &cached_state);
 again:
        start = page_start;
-       ordered = btrfs_lookup_ordered_range(inode, start,
+       ordered = btrfs_lookup_ordered_range(BTRFS_I(inode), start,
                                        page_end - start + 1);
        if (ordered) {
                end = min(page_end, ordered->file_offset + ordered->len - 1);
@@ -8964,10 +8908,10 @@ again:
  * beyond EOF, then the page is guaranteed safe against truncation until we
  * unlock the page.
  */
-int btrfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
+int btrfs_page_mkwrite(struct vm_fault *vmf)
 {
        struct page *page = vmf->page;
-       struct inode *inode = file_inode(vma->vm_file);
+       struct inode *inode = file_inode(vmf->vma->vm_file);
        struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
        struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree;
        struct btrfs_ordered_extent *ordered;
@@ -9000,7 +8944,7 @@ int btrfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
        ret = btrfs_delalloc_reserve_space(inode, page_start,
                                           reserved_space);
        if (!ret) {
-               ret = file_update_time(vma->vm_file);
+               ret = file_update_time(vmf->vma->vm_file);
                reserved = 1;
        }
        if (ret) {
@@ -9032,7 +8976,8 @@ again:
         * we can't set the delalloc bits if there are pending ordered
         * extents.  Drop our locks and wait for them to finish
         */
-       ordered = btrfs_lookup_ordered_range(inode, page_start, page_end);
+       ordered = btrfs_lookup_ordered_range(BTRFS_I(inode), page_start,
+                       PAGE_SIZE);
        if (ordered) {
                unlock_extent_cached(io_tree, page_start, page_end,
                                     &cached_state, GFP_NOFS);
@@ -9056,11 +9001,11 @@ again:
        }
 
        /*
-        * XXX - page_mkwrite gets called every time the page is dirtied, even
-        * if it was already dirty, so for space accounting reasons we need to
-        * clear any delalloc bits for the range we are fixing to save.  There
-        * is probably a better way to do this, but for now keep consistent with
-        * prepare_pages in the normal write path.
+        * page_mkwrite gets called when the page is firstly dirtied after it's
+        * faulted in, but write(2) could also dirty a page and set delalloc
+        * bits, thus in this case for space account reason, we still need to
+        * clear any delalloc bits within this page range since we have to
+        * reserve data&meta space before lock_page() (see above comments).
         */
        clear_extent_bit(&BTRFS_I(inode)->io_tree, page_start, end,
                          EXTENT_DIRTY | EXTENT_DELALLOC |
@@ -9230,7 +9175,7 @@ static int btrfs_truncate(struct inode *inode)
 
        if (ret == 0 && inode->i_nlink > 0) {
                trans->block_rsv = root->orphan_block_rsv;
-               ret = btrfs_orphan_del(trans, inode);
+               ret = btrfs_orphan_del(trans, BTRFS_I(inode));
                if (ret)
                        err = ret;
        }
@@ -9275,7 +9220,7 @@ int btrfs_create_subvol_root(struct btrfs_trans_handle *trans,
        inode->i_fop = &btrfs_dir_file_operations;
 
        set_nlink(inode, 1);
-       btrfs_i_size_write(inode, 0);
+       btrfs_i_size_write(BTRFS_I(inode), 0);
        unlock_new_inode(inode);
 
        err = btrfs_subvol_inherit_props(trans, new_root, parent_root);
@@ -9348,7 +9293,7 @@ struct inode *btrfs_alloc_inode(struct super_block *sb)
 #ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS
 void btrfs_test_destroy_inode(struct inode *inode)
 {
-       btrfs_drop_extent_cache(inode, 0, (u64)-1, 0);
+       btrfs_drop_extent_cache(BTRFS_I(inode), 0, (u64)-1, 0);
        kmem_cache_free(btrfs_inode_cachep, BTRFS_I(inode));
 }
 #endif
@@ -9384,7 +9329,7 @@ void btrfs_destroy_inode(struct inode *inode)
        if (test_bit(BTRFS_INODE_HAS_ORPHAN_ITEM,
                     &BTRFS_I(inode)->runtime_flags)) {
                btrfs_info(fs_info, "inode %llu still on the orphan list",
-                          btrfs_ino(inode));
+                          btrfs_ino(BTRFS_I(inode)));
                atomic_dec(&root->orphan_inodes);
        }
 
@@ -9403,7 +9348,7 @@ void btrfs_destroy_inode(struct inode *inode)
        }
        btrfs_qgroup_check_reserved_leak(inode);
        inode_tree_del(inode);
-       btrfs_drop_extent_cache(inode, 0, (u64)-1, 0);
+       btrfs_drop_extent_cache(BTRFS_I(inode), 0, (u64)-1, 0);
 free:
        call_rcu(&inode->i_rcu, btrfs_i_callback);
 }
@@ -9482,11 +9427,11 @@ fail:
        return -ENOMEM;
 }
 
-static int btrfs_getattr(struct vfsmount *mnt,
-                        struct dentry *dentry, struct kstat *stat)
+static int btrfs_getattr(const struct path *path, struct kstat *stat,
+                        u32 request_mask, unsigned int flags)
 {
        u64 delalloc_bytes;
-       struct inode *inode = d_inode(dentry);
+       struct inode *inode = d_inode(path->dentry);
        u32 blocksize = inode->i_sb->s_blocksize;
 
        generic_fillattr(inode, stat);
@@ -9513,8 +9458,8 @@ static int btrfs_rename_exchange(struct inode *old_dir,
        struct inode *old_inode = old_dentry->d_inode;
        struct timespec ctime = current_time(old_inode);
        struct dentry *parent;
-       u64 old_ino = btrfs_ino(old_inode);
-       u64 new_ino = btrfs_ino(new_inode);
+       u64 old_ino = btrfs_ino(BTRFS_I(old_inode));
+       u64 new_ino = btrfs_ino(BTRFS_I(new_inode));
        u64 old_idx = 0;
        u64 new_idx = 0;
        u64 root_objectid;
@@ -9550,10 +9495,10 @@ static int btrfs_rename_exchange(struct inode *old_dir,
         * We need to find a free sequence number both in the source and
         * in the destination directory for the exchange.
         */
-       ret = btrfs_set_inode_index(new_dir, &old_idx);
+       ret = btrfs_set_inode_index(BTRFS_I(new_dir), &old_idx);
        if (ret)
                goto out_fail;
-       ret = btrfs_set_inode_index(old_dir, &new_idx);
+       ret = btrfs_set_inode_index(BTRFS_I(old_dir), &new_idx);
        if (ret)
                goto out_fail;
 
@@ -9571,7 +9516,8 @@ static int btrfs_rename_exchange(struct inode *old_dir,
                                             new_dentry->d_name.name,
                                             new_dentry->d_name.len,
                                             old_ino,
-                                            btrfs_ino(new_dir), old_idx);
+                                            btrfs_ino(BTRFS_I(new_dir)),
+                                            old_idx);
                if (ret)
                        goto out_fail;
        }
@@ -9587,7 +9533,8 @@ static int btrfs_rename_exchange(struct inode *old_dir,
                                             old_dentry->d_name.name,
                                             old_dentry->d_name.len,
                                             new_ino,
-                                            btrfs_ino(old_dir), new_idx);
+                                            btrfs_ino(BTRFS_I(old_dir)),
+                                            new_idx);
                if (ret)
                        goto out_fail;
        }
@@ -9603,8 +9550,10 @@ static int btrfs_rename_exchange(struct inode *old_dir,
        new_inode->i_ctime = ctime;
 
        if (old_dentry->d_parent != new_dentry->d_parent) {
-               btrfs_record_unlink_dir(trans, old_dir, old_inode, 1);
-               btrfs_record_unlink_dir(trans, new_dir, new_inode, 1);
+               btrfs_record_unlink_dir(trans, BTRFS_I(old_dir),
+                               BTRFS_I(old_inode), 1);
+               btrfs_record_unlink_dir(trans, BTRFS_I(new_dir),
+                               BTRFS_I(new_inode), 1);
        }
 
        /* src is a subvolume */
@@ -9615,8 +9564,8 @@ static int btrfs_rename_exchange(struct inode *old_dir,
                                          old_dentry->d_name.name,
                                          old_dentry->d_name.len);
        } else { /* src is an inode */
-               ret = __btrfs_unlink_inode(trans, root, old_dir,
-                                          old_dentry->d_inode,
+               ret = __btrfs_unlink_inode(trans, root, BTRFS_I(old_dir),
+                                          BTRFS_I(old_dentry->d_inode),
                                           old_dentry->d_name.name,
                                           old_dentry->d_name.len);
                if (!ret)
@@ -9635,8 +9584,8 @@ static int btrfs_rename_exchange(struct inode *old_dir,
                                          new_dentry->d_name.name,
                                          new_dentry->d_name.len);
        } else { /* dest is an inode */
-               ret = __btrfs_unlink_inode(trans, dest, new_dir,
-                                          new_dentry->d_inode,
+               ret = __btrfs_unlink_inode(trans, dest, BTRFS_I(new_dir),
+                                          BTRFS_I(new_dentry->d_inode),
                                           new_dentry->d_name.name,
                                           new_dentry->d_name.len);
                if (!ret)
@@ -9647,7 +9596,7 @@ static int btrfs_rename_exchange(struct inode *old_dir,
                goto out_fail;
        }
 
-       ret = btrfs_add_link(trans, new_dir, old_inode,
+       ret = btrfs_add_link(trans, BTRFS_I(new_dir), BTRFS_I(old_inode),
                             new_dentry->d_name.name,
                             new_dentry->d_name.len, 0, old_idx);
        if (ret) {
@@ -9655,7 +9604,7 @@ static int btrfs_rename_exchange(struct inode *old_dir,
                goto out_fail;
        }
 
-       ret = btrfs_add_link(trans, old_dir, new_inode,
+       ret = btrfs_add_link(trans, BTRFS_I(old_dir), BTRFS_I(new_inode),
                             old_dentry->d_name.name,
                             old_dentry->d_name.len, 0, new_idx);
        if (ret) {
@@ -9670,13 +9619,15 @@ static int btrfs_rename_exchange(struct inode *old_dir,
 
        if (root_log_pinned) {
                parent = new_dentry->d_parent;
-               btrfs_log_new_name(trans, old_inode, old_dir, parent);
+               btrfs_log_new_name(trans, BTRFS_I(old_inode), BTRFS_I(old_dir),
+                               parent);
                btrfs_end_log_trans(root);
                root_log_pinned = false;
        }
        if (dest_log_pinned) {
                parent = old_dentry->d_parent;
-               btrfs_log_new_name(trans, new_inode, new_dir, parent);
+               btrfs_log_new_name(trans, BTRFS_I(new_inode), BTRFS_I(new_dir),
+                               parent);
                btrfs_end_log_trans(dest);
                dest_log_pinned = false;
        }
@@ -9693,11 +9644,11 @@ out_fail:
         * allow the tasks to sync it.
         */
        if (ret && (root_log_pinned || dest_log_pinned)) {
-               if (btrfs_inode_in_log(old_dir, fs_info->generation) ||
-                   btrfs_inode_in_log(new_dir, fs_info->generation) ||
-                   btrfs_inode_in_log(old_inode, fs_info->generation) ||
+               if (btrfs_inode_in_log(BTRFS_I(old_dir), fs_info->generation) ||
+                   btrfs_inode_in_log(BTRFS_I(new_dir), fs_info->generation) ||
+                   btrfs_inode_in_log(BTRFS_I(old_inode), fs_info->generation) ||
                    (new_inode &&
-                    btrfs_inode_in_log(new_inode, fs_info->generation)))
+                    btrfs_inode_in_log(BTRFS_I(new_inode), fs_info->generation)))
                        btrfs_set_log_full_commit(fs_info, trans);
 
                if (root_log_pinned) {
@@ -9736,7 +9687,7 @@ static int btrfs_whiteout_for_rename(struct btrfs_trans_handle *trans,
        inode = btrfs_new_inode(trans, root, dir,
                                dentry->d_name.name,
                                dentry->d_name.len,
-                               btrfs_ino(dir),
+                               btrfs_ino(BTRFS_I(dir)),
                                objectid,
                                S_IFCHR | WHITEOUT_MODE,
                                &index);
@@ -9755,8 +9706,8 @@ static int btrfs_whiteout_for_rename(struct btrfs_trans_handle *trans,
        if (ret)
                goto out;
 
-       ret = btrfs_add_nondir(trans, dir, dentry,
-                               inode, 0, index);
+       ret = btrfs_add_nondir(trans, BTRFS_I(dir), dentry,
+                               BTRFS_I(inode), 0, index);
        if (ret)
                goto out;
 
@@ -9784,10 +9735,10 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry,
        u64 index = 0;
        u64 root_objectid;
        int ret;
-       u64 old_ino = btrfs_ino(old_inode);
+       u64 old_ino = btrfs_ino(BTRFS_I(old_inode));
        bool log_pinned = false;
 
-       if (btrfs_ino(new_dir) == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID)
+       if (btrfs_ino(BTRFS_I(new_dir)) == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID)
                return -EPERM;
 
        /* we only allow rename subvolume link between subvolumes */
@@ -9795,7 +9746,7 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry,
                return -EXDEV;
 
        if (old_ino == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID ||
-           (new_inode && btrfs_ino(new_inode) == BTRFS_FIRST_FREE_OBJECTID))
+           (new_inode && btrfs_ino(BTRFS_I(new_inode)) == BTRFS_FIRST_FREE_OBJECTID))
                return -ENOTEMPTY;
 
        if (S_ISDIR(old_inode->i_mode) && new_inode &&
@@ -9855,7 +9806,7 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry,
        if (dest != root)
                btrfs_record_root_in_trans(trans, dest);
 
-       ret = btrfs_set_inode_index(new_dir, &index);
+       ret = btrfs_set_inode_index(BTRFS_I(new_dir), &index);
        if (ret)
                goto out_fail;
 
@@ -9870,7 +9821,7 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry,
                                             new_dentry->d_name.name,
                                             new_dentry->d_name.len,
                                             old_ino,
-                                            btrfs_ino(new_dir), index);
+                                            btrfs_ino(BTRFS_I(new_dir)), index);
                if (ret)
                        goto out_fail;
        }
@@ -9883,7 +9834,8 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry,
        old_inode->i_ctime = current_time(old_dir);
 
        if (old_dentry->d_parent != new_dentry->d_parent)
-               btrfs_record_unlink_dir(trans, old_dir, old_inode, 1);
+               btrfs_record_unlink_dir(trans, BTRFS_I(old_dir),
+                               BTRFS_I(old_inode), 1);
 
        if (unlikely(old_ino == BTRFS_FIRST_FREE_OBJECTID)) {
                root_objectid = BTRFS_I(old_inode)->root->root_key.objectid;
@@ -9891,8 +9843,8 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry,
                                        old_dentry->d_name.name,
                                        old_dentry->d_name.len);
        } else {
-               ret = __btrfs_unlink_inode(trans, root, old_dir,
-                                       d_inode(old_dentry),
+               ret = __btrfs_unlink_inode(trans, root, BTRFS_I(old_dir),
+                                       BTRFS_I(d_inode(old_dentry)),
                                        old_dentry->d_name.name,
                                        old_dentry->d_name.len);
                if (!ret)
@@ -9906,7 +9858,7 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry,
        if (new_inode) {
                inode_inc_iversion(new_inode);
                new_inode->i_ctime = current_time(new_inode);
-               if (unlikely(btrfs_ino(new_inode) ==
+               if (unlikely(btrfs_ino(BTRFS_I(new_inode)) ==
                             BTRFS_EMPTY_SUBVOL_DIR_OBJECTID)) {
                        root_objectid = BTRFS_I(new_inode)->location.objectid;
                        ret = btrfs_unlink_subvol(trans, dest, new_dir,
@@ -9915,20 +9867,21 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry,
                                                new_dentry->d_name.len);
                        BUG_ON(new_inode->i_nlink == 0);
                } else {
-                       ret = btrfs_unlink_inode(trans, dest, new_dir,
-                                                d_inode(new_dentry),
+                       ret = btrfs_unlink_inode(trans, dest, BTRFS_I(new_dir),
+                                                BTRFS_I(d_inode(new_dentry)),
                                                 new_dentry->d_name.name,
                                                 new_dentry->d_name.len);
                }
                if (!ret && new_inode->i_nlink == 0)
-                       ret = btrfs_orphan_add(trans, d_inode(new_dentry));
+                       ret = btrfs_orphan_add(trans,
+                                       BTRFS_I(d_inode(new_dentry)));
                if (ret) {
                        btrfs_abort_transaction(trans, ret);
                        goto out_fail;
                }
        }
 
-       ret = btrfs_add_link(trans, new_dir, old_inode,
+       ret = btrfs_add_link(trans, BTRFS_I(new_dir), BTRFS_I(old_inode),
                             new_dentry->d_name.name,
                             new_dentry->d_name.len, 0, index);
        if (ret) {
@@ -9942,7 +9895,8 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry,
        if (log_pinned) {
                struct dentry *parent = new_dentry->d_parent;
 
-               btrfs_log_new_name(trans, old_inode, old_dir, parent);
+               btrfs_log_new_name(trans, BTRFS_I(old_inode), BTRFS_I(old_dir),
+                               parent);
                btrfs_end_log_trans(root);
                log_pinned = false;
        }
@@ -9969,11 +9923,11 @@ out_fail:
         * allow the tasks to sync it.
         */
        if (ret && log_pinned) {
-               if (btrfs_inode_in_log(old_dir, fs_info->generation) ||
-                   btrfs_inode_in_log(new_dir, fs_info->generation) ||
-                   btrfs_inode_in_log(old_inode, fs_info->generation) ||
+               if (btrfs_inode_in_log(BTRFS_I(old_dir), fs_info->generation) ||
+                   btrfs_inode_in_log(BTRFS_I(new_dir), fs_info->generation) ||
+                   btrfs_inode_in_log(BTRFS_I(old_inode), fs_info->generation) ||
                    (new_inode &&
-                    btrfs_inode_in_log(new_inode, fs_info->generation)))
+                    btrfs_inode_in_log(BTRFS_I(new_inode), fs_info->generation)))
                        btrfs_set_log_full_commit(fs_info, trans);
 
                btrfs_end_log_trans(root);
@@ -10237,8 +10191,8 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry,
                goto out_unlock;
 
        inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name,
-                               dentry->d_name.len, btrfs_ino(dir), objectid,
-                               S_IFLNK|S_IRWXUGO, &index);
+                               dentry->d_name.len, btrfs_ino(BTRFS_I(dir)),
+                               objectid, S_IFLNK|S_IRWXUGO, &index);
        if (IS_ERR(inode)) {
                err = PTR_ERR(inode);
                goto out_unlock;
@@ -10264,7 +10218,7 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry,
                err = -ENOMEM;
                goto out_unlock_inode;
        }
-       key.objectid = btrfs_ino(inode);
+       key.objectid = btrfs_ino(BTRFS_I(inode));
        key.offset = 0;
        key.type = BTRFS_EXTENT_DATA_KEY;
        datasize = btrfs_file_extent_calc_inline_size(name_len);
@@ -10294,7 +10248,7 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry,
        inode_nohighmem(inode);
        inode->i_mapping->a_ops = &btrfs_symlink_aops;
        inode_set_bytes(inode, name_len);
-       btrfs_i_size_write(inode, name_len);
+       btrfs_i_size_write(BTRFS_I(inode), name_len);
        err = btrfs_update_inode(trans, root, inode);
        /*
         * Last step, add directory indexes for our symlink inode. This is the
@@ -10302,7 +10256,8 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry,
         * elsewhere above.
         */
        if (!err)
-               err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index);
+               err = btrfs_add_nondir(trans, BTRFS_I(dir), dentry,
+                               BTRFS_I(inode), 0, index);
        if (err) {
                drop_inode = 1;
                goto out_unlock_inode;
@@ -10388,7 +10343,7 @@ static int __btrfs_prealloc_file_range(struct inode *inode, int mode,
                        break;
                }
 
-               btrfs_drop_extent_cache(inode, cur_offset,
+               btrfs_drop_extent_cache(BTRFS_I(inode), cur_offset,
                                        cur_offset + ins.offset -1, 0);
 
                em = alloc_extent_map();
@@ -10415,7 +10370,7 @@ static int __btrfs_prealloc_file_range(struct inode *inode, int mode,
                        write_unlock(&em_tree->lock);
                        if (ret != -EEXIST)
                                break;
-                       btrfs_drop_extent_cache(inode, cur_offset,
+                       btrfs_drop_extent_cache(BTRFS_I(inode), cur_offset,
                                                cur_offset + ins.offset - 1,
                                                0);
                }
@@ -10517,7 +10472,7 @@ static int btrfs_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode)
                goto out;
 
        inode = btrfs_new_inode(trans, root, dir, NULL, 0,
-                               btrfs_ino(dir), objectid, mode, &index);
+                       btrfs_ino(BTRFS_I(dir)), objectid, mode, &index);
        if (IS_ERR(inode)) {
                ret = PTR_ERR(inode);
                inode = NULL;
@@ -10537,7 +10492,7 @@ static int btrfs_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode)
        ret = btrfs_update_inode(trans, root, inode);
        if (ret)
                goto out_inode;
-       ret = btrfs_orphan_add(trans, inode);
+       ret = btrfs_orphan_add(trans, BTRFS_I(inode));
        if (ret)
                goto out_inode;
 
@@ -10567,6 +10522,12 @@ out_inode:
 
 }
 
+__attribute__((const))
+static int dummy_readpage_io_failed_hook(struct page *page, int failed_mirror)
+{
+       return 0;
+}
+
 static const struct inode_operations btrfs_dir_inode_operations = {
        .getattr        = btrfs_getattr,
        .lookup         = btrfs_lookup,
@@ -10605,10 +10566,14 @@ static const struct file_operations btrfs_dir_file_operations = {
 };
 
 static const struct extent_io_ops btrfs_extent_io_ops = {
-       .fill_delalloc = run_delalloc_range,
+       /* mandatory callbacks */
        .submit_bio_hook = btrfs_submit_bio_hook,
-       .merge_bio_hook = btrfs_merge_bio_hook,
        .readpage_end_io_hook = btrfs_readpage_end_io_hook,
+       .merge_bio_hook = btrfs_merge_bio_hook,
+       .readpage_io_failed_hook = dummy_readpage_io_failed_hook,
+
+       /* optional callbacks */
+       .fill_delalloc = run_delalloc_range,
        .writepage_end_io_hook = btrfs_writepage_end_io_hook,
        .writepage_start_hook = btrfs_writepage_start_hook,
        .set_bit_hook = btrfs_set_bit_hook,