Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 02fe062b authored by Jaegeuk Kim's avatar Jaegeuk Kim
Browse files

f2fs: stop all the operations by cp_error flag



This patch replaces to use cp_error flag instead of RDONLY for quota off.

Reviewed-by: default avatarChao Yu <yuchao0@huawei.com>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent d2d06691
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -250,6 +250,9 @@ static int __f2fs_set_acl(struct inode *inode, int type,

int f2fs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
{
	if (unlikely(f2fs_cp_error(F2FS_I_SB(inode))))
		return -EIO;

	return __f2fs_set_acl(inode, type, acl, NULL);
}

+0 −1
Original line number Diff line number Diff line
@@ -29,7 +29,6 @@ struct kmem_cache *inode_entry_slab;
void f2fs_stop_checkpoint(struct f2fs_sb_info *sbi, bool end_io)
{
	set_ckpt_flags(sbi, CP_ERROR_FLAG);
	sbi->sb->s_flags |= MS_RDONLY;
	if (!end_io)
		f2fs_flush_merged_writes(sbi);
}
+26 −0
Original line number Diff line number Diff line
@@ -56,6 +56,11 @@ static int f2fs_vm_page_mkwrite(struct vm_area_struct *vma,
	struct dnode_of_data dn;
	int err;

	if (unlikely(f2fs_cp_error(sbi))) {
		err = -EIO;
		goto err;
	}

	sb_start_pagefault(inode->i_sb);

	f2fs_bug_on(sbi, f2fs_has_inline_data(inode));
@@ -117,6 +122,7 @@ out_sem:
out:
	sb_end_pagefault(inode->i_sb);
	f2fs_update_time(sbi, REQ_TIME);
err:
	return block_page_mkwrite_return(err);
}

@@ -313,6 +319,8 @@ out:

int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
{
	if (unlikely(f2fs_cp_error(F2FS_I_SB(file_inode(file)))))
		return -EIO;
	return f2fs_do_sync_file(file, start, end, datasync, false);
}

@@ -449,6 +457,9 @@ static int f2fs_file_mmap(struct file *file, struct vm_area_struct *vma)
	struct inode *inode = file_inode(file);
	int err;

	if (unlikely(f2fs_cp_error(F2FS_I_SB(inode))))
		return -EIO;

	/* we don't need to use inline_data strictly */
	err = f2fs_convert_inline_inode(inode);
	if (err)
@@ -635,6 +646,9 @@ int f2fs_truncate(struct inode *inode)
{
	int err;

	if (unlikely(f2fs_cp_error(F2FS_I_SB(inode))))
		return -EIO;

	if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
				S_ISLNK(inode->i_mode)))
		return 0;
@@ -713,6 +727,9 @@ int f2fs_setattr(struct dentry *dentry, struct iattr *attr)
	int err;
	bool size_changed = false;

	if (unlikely(f2fs_cp_error(F2FS_I_SB(inode))))
		return -EIO;

	err = inode_change_ok(inode, attr);
	if (err)
		return err;
@@ -1451,6 +1468,9 @@ static long f2fs_fallocate(struct file *file, int mode,
	struct inode *inode = file_inode(file);
	long ret = 0;

	if (unlikely(f2fs_cp_error(F2FS_I_SB(inode))))
		return -EIO;

	/* f2fs only support ->fallocate for regular file */
	if (!S_ISREG(inode->i_mode))
		return -EINVAL;
@@ -2427,6 +2447,9 @@ static int f2fs_ioc_get_features(struct file *filp, unsigned long arg)

long f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
	if (unlikely(f2fs_cp_error(F2FS_I_SB(file_inode(filp)))))
		return -EIO;

	switch (cmd) {
	case F2FS_IOC_GETFLAGS:
		return f2fs_ioc_getflags(filp, arg);
@@ -2482,6 +2505,9 @@ static ssize_t f2fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
	struct blk_plug plug;
	ssize_t ret;

	if (unlikely(f2fs_cp_error(F2FS_I_SB(inode))))
		return -EIO;

	inode_lock(inode);
	ret = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode));
	if (!ret) {
+29 −0
Original line number Diff line number Diff line
@@ -175,6 +175,9 @@ static int f2fs_create(struct inode *dir, struct dentry *dentry, umode_t mode,
	nid_t ino = 0;
	int err;

	if (unlikely(f2fs_cp_error(sbi)))
		return -EIO;

	dquot_initialize(dir);

	inode = f2fs_new_inode(dir, mode);
@@ -217,6 +220,9 @@ static int f2fs_link(struct dentry *old_dentry, struct inode *dir,
	struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
	int err;

	if (unlikely(f2fs_cp_error(sbi)))
		return -EIO;

	if (f2fs_encrypted_inode(dir) &&
			!fscrypt_has_permitted_context(dir, inode))
		return -EPERM;
@@ -412,6 +418,9 @@ static int f2fs_unlink(struct inode *dir, struct dentry *dentry)

	trace_f2fs_unlink_enter(dir, dentry);

	if (unlikely(f2fs_cp_error(sbi)))
		return -EIO;

	dquot_initialize(dir);

	de = f2fs_find_entry(dir, &dentry->d_name, &page);
@@ -473,6 +482,9 @@ static int f2fs_symlink(struct inode *dir, struct dentry *dentry,
	struct fscrypt_symlink_data *sd = NULL;
	int err;

	if (unlikely(f2fs_cp_error(sbi)))
		return -EIO;

	if (f2fs_encrypted_inode(dir)) {
		err = fscrypt_get_encryption_info(dir);
		if (err)
@@ -577,6 +589,9 @@ static int f2fs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
	struct inode *inode;
	int err;

	if (unlikely(f2fs_cp_error(sbi)))
		return -EIO;

	dquot_initialize(dir);

	inode = f2fs_new_inode(dir, S_IFDIR | mode);
@@ -627,6 +642,8 @@ static int f2fs_mknod(struct inode *dir, struct dentry *dentry,
	struct inode *inode;
	int err = 0;

	if (unlikely(f2fs_cp_error(sbi)))
		return -EIO;
	if (!new_valid_dev(rdev))
		return -EINVAL;

@@ -720,6 +737,9 @@ out:

static int f2fs_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode)
{
	if (unlikely(f2fs_cp_error(F2FS_I_SB(dir))))
		return -EIO;

	if (f2fs_encrypted_inode(dir)) {
		int err = fscrypt_get_encryption_info(dir);
		if (err)
@@ -731,6 +751,9 @@ static int f2fs_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode)

static int f2fs_create_whiteout(struct inode *dir, struct inode **whiteout)
{
	if (unlikely(f2fs_cp_error(F2FS_I_SB(dir))))
		return -EIO;

	return __f2fs_tmpfile(dir, NULL, S_IFCHR | WHITEOUT_MODE, whiteout);
}

@@ -750,6 +773,9 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,
	bool is_old_inline = f2fs_has_inline_dentry(old_dir);
	int err = -ENOENT;

	if (unlikely(f2fs_cp_error(sbi)))
		return -EIO;

	if ((f2fs_encrypted_inode(old_dir) &&
			!fscrypt_has_encryption_key(old_dir)) ||
			(f2fs_encrypted_inode(new_dir) &&
@@ -939,6 +965,9 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry,
	int old_nlink = 0, new_nlink = 0;
	int err = -ENOENT;

	if (unlikely(f2fs_cp_error(sbi)))
		return -EIO;

	if ((f2fs_encrypted_inode(old_dir) &&
			!fscrypt_has_encryption_key(old_dir)) ||
			(f2fs_encrypted_inode(new_dir) &&
+3 −0
Original line number Diff line number Diff line
@@ -875,6 +875,9 @@ int f2fs_sync_fs(struct super_block *sb, int sync)
	struct f2fs_sb_info *sbi = F2FS_SB(sb);
	int err = 0;

	if (unlikely(f2fs_cp_error(sbi)))
		return 0;

	trace_f2fs_sync_fs(sb, sync);

	if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING)))