Unverified Commit 4c19dc29 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!2514 [sync] PR-2499: f2fs: fix to avoid NULL pointer dereference f2fs_write_end_io()

parents 70b1b6a3 faef790a
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -3470,7 +3470,7 @@ block_t f2fs_start_bidx_of_node(unsigned int node_ofs, struct inode *inode);
int f2fs_gc(struct f2fs_sb_info *sbi, bool sync, bool background, bool force,
			unsigned int segno);
void f2fs_build_gc_manager(struct f2fs_sb_info *sbi);
int f2fs_resize_fs(struct f2fs_sb_info *sbi, __u64 block_count);
int f2fs_resize_fs(struct file *filp, __u64 block_count);
int __init f2fs_create_garbage_collection_cache(void);
void f2fs_destroy_garbage_collection_cache(void);

+1 −1
Original line number Diff line number Diff line
@@ -3355,7 +3355,7 @@ static int f2fs_ioc_resize_fs(struct file *filp, unsigned long arg)
			   sizeof(block_count)))
		return -EFAULT;

	return f2fs_resize_fs(sbi, block_count);
	return f2fs_resize_fs(filp, block_count);
}

static int f2fs_ioc_enable_verity(struct file *filp, unsigned long arg)
+19 −3
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@
 */
#include <linux/fs.h>
#include <linux/module.h>
#include <linux/mount.h>
#include <linux/backing-dev.h>
#include <linux/init.h>
#include <linux/f2fs_fs.h>
@@ -1961,8 +1962,9 @@ static void update_fs_metadata(struct f2fs_sb_info *sbi, int secs)
	}
}

int f2fs_resize_fs(struct f2fs_sb_info *sbi, __u64 block_count)
int f2fs_resize_fs(struct file *filp, __u64 block_count)
{
	struct f2fs_sb_info *sbi = F2FS_I_SB(file_inode(filp));
	__u64 old_block_count, shrunk_blocks;
	struct cp_control cpc = { CP_RESIZE, 0, 0, 0 };
	unsigned int secs;
@@ -2000,12 +2002,18 @@ int f2fs_resize_fs(struct f2fs_sb_info *sbi, __u64 block_count)
		return -EINVAL;
	}

	err = mnt_want_write_file(filp);
	if (err)
		return err;

	shrunk_blocks = old_block_count - block_count;
	secs = div_u64(shrunk_blocks, BLKS_PER_SEC(sbi));

	/* stop other GC */
	if (!down_write_trylock(&sbi->gc_lock))
		return -EAGAIN;
	if (!down_write_trylock(&sbi->gc_lock)) {
		err = -EAGAIN;
		goto out_drop_write;
	}

	/* stop CP to protect MAIN_SEC in free_segment_range */
	f2fs_lock_op(sbi);
@@ -2025,12 +2033,20 @@ int f2fs_resize_fs(struct f2fs_sb_info *sbi, __u64 block_count)
out_unlock:
	f2fs_unlock_op(sbi);
	up_write(&sbi->gc_lock);
out_drop_write:
	mnt_drop_write_file(filp);
	if (err)
		return err;

	set_sbi_flag(sbi, SBI_IS_RESIZEFS);

	freeze_super(sbi->sb);

	if (f2fs_readonly(sbi->sb)) {
		thaw_super(sbi->sb);
		return -EROFS;
	}

	down_write(&sbi->gc_lock);
	mutex_lock(&sbi->cp_mutex);