Unverified Commit 17c17591 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!2499 f2fs: fix to avoid NULL pointer dereference f2fs_write_end_io()

parents 366d48f9 28cabaf0
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -3483,7 +3483,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,
int f2fs_gc(struct f2fs_sb_info *sbi, bool sync, bool background, bool force,
			unsigned int segno);
			unsigned int segno);
void f2fs_build_gc_manager(struct f2fs_sb_info *sbi);
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);
int __init f2fs_create_garbage_collection_cache(void);
void f2fs_destroy_garbage_collection_cache(void);
void f2fs_destroy_garbage_collection_cache(void);


+1 −1
Original line number Original line Diff line number Diff line
@@ -3355,7 +3355,7 @@ static int f2fs_ioc_resize_fs(struct file *filp, unsigned long arg)
			   sizeof(block_count)))
			   sizeof(block_count)))
		return -EFAULT;
		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)
static int f2fs_ioc_enable_verity(struct file *filp, unsigned long arg)
+19 −3
Original line number Original line Diff line number Diff line
@@ -7,6 +7,7 @@
 */
 */
#include <linux/fs.h>
#include <linux/fs.h>
#include <linux/module.h>
#include <linux/module.h>
#include <linux/mount.h>
#include <linux/backing-dev.h>
#include <linux/backing-dev.h>
#include <linux/init.h>
#include <linux/init.h>
#include <linux/f2fs_fs.h>
#include <linux/f2fs_fs.h>
@@ -1977,8 +1978,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;
	__u64 old_block_count, shrunk_blocks;
	struct cp_control cpc = { CP_RESIZE, 0, 0, 0 };
	struct cp_control cpc = { CP_RESIZE, 0, 0, 0 };
	unsigned int secs;
	unsigned int secs;
@@ -2016,12 +2018,18 @@ int f2fs_resize_fs(struct f2fs_sb_info *sbi, __u64 block_count)
		return -EINVAL;
		return -EINVAL;
	}
	}


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

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


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


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


	freeze_super(sbi->sb);
	freeze_super(sbi->sb);

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

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