Merge tag 'f2fs-for-6.8-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk...
[sfrench/cifs-2.6.git] / fs / f2fs / data.c
index 9b62549a29ced0f2b390ecd5c23798a9c142ef68..26e317696b3389d9291f84756b82a126137ce215 100644 (file)
@@ -1179,18 +1179,12 @@ static int f2fs_submit_page_read(struct inode *inode, struct page *page,
        return 0;
 }
 
-static void __set_data_blkaddr(struct dnode_of_data *dn)
+static void __set_data_blkaddr(struct dnode_of_data *dn, block_t blkaddr)
 {
-       struct f2fs_node *rn = F2FS_NODE(dn->node_page);
-       __le32 *addr_array;
-       int base = 0;
+       __le32 *addr = get_dnode_addr(dn->inode, dn->node_page);
 
-       if (IS_INODE(dn->node_page) && f2fs_has_extra_attr(dn->inode))
-               base = get_extra_isize(dn->inode);
-
-       /* Get physical address of data block */
-       addr_array = blkaddr_in_node(rn);
-       addr_array[base + dn->ofs_in_node] = cpu_to_le32(dn->data_blkaddr);
+       dn->data_blkaddr = blkaddr;
+       addr[dn->ofs_in_node] = cpu_to_le32(dn->data_blkaddr);
 }
 
 /*
@@ -1199,18 +1193,17 @@ static void __set_data_blkaddr(struct dnode_of_data *dn)
  *  ->node_page
  *    update block addresses in the node page
  */
-void f2fs_set_data_blkaddr(struct dnode_of_data *dn)
+void f2fs_set_data_blkaddr(struct dnode_of_data *dn, block_t blkaddr)
 {
        f2fs_wait_on_page_writeback(dn->node_page, NODE, true, true);
-       __set_data_blkaddr(dn);
+       __set_data_blkaddr(dn, blkaddr);
        if (set_page_dirty(dn->node_page))
                dn->node_changed = true;
 }
 
 void f2fs_update_data_blkaddr(struct dnode_of_data *dn, block_t blkaddr)
 {
-       dn->data_blkaddr = blkaddr;
-       f2fs_set_data_blkaddr(dn);
+       f2fs_set_data_blkaddr(dn, blkaddr);
        f2fs_update_read_extent_cache(dn);
 }
 
@@ -1237,8 +1230,7 @@ int f2fs_reserve_new_blocks(struct dnode_of_data *dn, blkcnt_t count)
                block_t blkaddr = f2fs_data_blkaddr(dn);
 
                if (blkaddr == NULL_ADDR) {
-                       dn->data_blkaddr = NEW_ADDR;
-                       __set_data_blkaddr(dn);
+                       __set_data_blkaddr(dn, NEW_ADDR);
                        count--;
                }
        }
@@ -1492,11 +1484,9 @@ static int __allocate_data_block(struct dnode_of_data *dn, int seg_type)
        old_blkaddr = dn->data_blkaddr;
        f2fs_allocate_data_block(sbi, NULL, old_blkaddr, &dn->data_blkaddr,
                                &sum, seg_type, NULL);
-       if (GET_SEGNO(sbi, old_blkaddr) != NULL_SEGNO) {
-               invalidate_mapping_pages(META_MAPPING(sbi),
-                                       old_blkaddr, old_blkaddr);
-               f2fs_invalidate_compress_page(sbi, old_blkaddr);
-       }
+       if (GET_SEGNO(sbi, old_blkaddr) != NULL_SEGNO)
+               f2fs_invalidate_internal_cache(sbi, old_blkaddr);
+
        f2fs_update_data_blkaddr(dn, dn->data_blkaddr);
        return 0;
 }
@@ -1992,7 +1982,7 @@ int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
        if (ret)
                return ret;
 
-       inode_lock(inode);
+       inode_lock_shared(inode);
 
        maxbytes = max_file_blocks(inode) << F2FS_BLKSIZE_BITS;
        if (start > maxbytes) {
@@ -2112,7 +2102,7 @@ out:
        if (ret == 1)
                ret = 0;
 
-       inode_unlock(inode);
+       inode_unlock_shared(inode);
        return ret;
 }
 
@@ -2566,9 +2556,6 @@ int f2fs_encrypt_one_page(struct f2fs_io_info *fio)
 
        page = fio->compressed_page ? fio->compressed_page : fio->page;
 
-       /* wait for GCed page writeback via META_MAPPING */
-       f2fs_wait_on_block_writeback(inode, fio->old_blkaddr);
-
        if (fscrypt_inode_uses_inline_crypto(inode))
                return 0;
 
@@ -2755,6 +2742,10 @@ got_it:
                goto out_writepage;
        }
 
+       /* wait for GCed page writeback via META_MAPPING */
+       if (fio->post_read)
+               f2fs_wait_on_block_writeback(inode, fio->old_blkaddr);
+
        /*
         * If current allocation needs SSR,
         * it had better in-place writes for updated data.
@@ -2810,8 +2801,6 @@ got_it:
        f2fs_outplace_write_data(&dn, fio);
        trace_f2fs_do_write_data_page(page, OPU);
        set_inode_flag(inode, FI_APPEND_WRITE);
-       if (page->index == 0)
-               set_inode_flag(inode, FI_FIRST_BLOCK_WRITTEN);
 out_writepage:
        f2fs_put_dnode(&dn);
 out:
@@ -2894,9 +2883,6 @@ int f2fs_write_single_data_page(struct page *page, int *submitted,
 
        zero_user_segment(page, offset, PAGE_SIZE);
 write:
-       if (f2fs_is_drop_cache(inode))
-               goto out;
-
        /* Dentry/quota blocks are controlled by checkpoint */
        if (S_ISDIR(inode->i_mode) || quota_inode) {
                /*