f2fs: should use a temp extent_info for lookup
authorJaegeuk Kim <jaegeuk@kernel.org>
Sat, 17 Dec 2022 00:36:36 +0000 (16:36 -0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Tue, 3 Jan 2023 16:59:06 +0000 (08:59 -0800)
Otherwise, __lookup_extent_tree() will override the given extent_info which will
be used by caller.

Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/extent_cache.c

index cc3fed04dd6f7acae4b03316520221d092bacc86..7b191ff656319d4562a30e030fb130fedfe0dc1f 100644 (file)
@@ -888,6 +888,7 @@ static int __get_new_block_age(struct inode *inode, struct extent_info *ei,
        loff_t f_size = i_size_read(inode);
        unsigned long long cur_blocks =
                                atomic64_read(&sbi->allocated_data_blocks);
+       struct extent_info tei = *ei;   /* only fofs and len are valid */
 
        /*
         * When I/O is not aligned to a PAGE_SIZE, update will happen to the last
@@ -898,17 +899,17 @@ static int __get_new_block_age(struct inode *inode, struct extent_info *ei,
                        blkaddr == NEW_ADDR)
                return -EINVAL;
 
-       if (__lookup_extent_tree(inode, ei->fofs, ei, EX_BLOCK_AGE)) {
+       if (__lookup_extent_tree(inode, ei->fofs, &tei, EX_BLOCK_AGE)) {
                unsigned long long cur_age;
 
-               if (cur_blocks >= ei->last_blocks)
-                       cur_age = cur_blocks - ei->last_blocks;
+               if (cur_blocks >= tei.last_blocks)
+                       cur_age = cur_blocks - tei.last_blocks;
                else
                        /* allocated_data_blocks overflow */
-                       cur_age = ULLONG_MAX - ei->last_blocks + cur_blocks;
+                       cur_age = ULLONG_MAX - tei.last_blocks + cur_blocks;
 
-               if (ei->age)
-                       ei->age = __calculate_block_age(cur_age, ei->age);
+               if (tei.age)
+                       ei->age = __calculate_block_age(cur_age, tei.age);
                else
                        ei->age = cur_age;
                ei->last_blocks = cur_blocks;