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: Chao Yu <yuchao0@huawei.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
parent
dca6951f5a
commit
1f227a3e21
5 changed files with 62 additions and 1 deletions
|
@ -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)
|
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);
|
return __f2fs_set_acl(inode, type, acl, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,6 @@ struct kmem_cache *inode_entry_slab;
|
||||||
void f2fs_stop_checkpoint(struct f2fs_sb_info *sbi, bool end_io)
|
void f2fs_stop_checkpoint(struct f2fs_sb_info *sbi, bool end_io)
|
||||||
{
|
{
|
||||||
set_ckpt_flags(sbi, CP_ERROR_FLAG);
|
set_ckpt_flags(sbi, CP_ERROR_FLAG);
|
||||||
sbi->sb->s_flags |= MS_RDONLY;
|
|
||||||
if (!end_io)
|
if (!end_io)
|
||||||
f2fs_flush_merged_writes(sbi);
|
f2fs_flush_merged_writes(sbi);
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,6 +53,11 @@ static int f2fs_vm_page_mkwrite(struct vm_fault *vmf)
|
||||||
struct dnode_of_data dn;
|
struct dnode_of_data dn;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
if (unlikely(f2fs_cp_error(sbi))) {
|
||||||
|
err = -EIO;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
sb_start_pagefault(inode->i_sb);
|
sb_start_pagefault(inode->i_sb);
|
||||||
|
|
||||||
f2fs_bug_on(sbi, f2fs_has_inline_data(inode));
|
f2fs_bug_on(sbi, f2fs_has_inline_data(inode));
|
||||||
|
@ -114,6 +119,7 @@ static int f2fs_vm_page_mkwrite(struct vm_fault *vmf)
|
||||||
out:
|
out:
|
||||||
sb_end_pagefault(inode->i_sb);
|
sb_end_pagefault(inode->i_sb);
|
||||||
f2fs_update_time(sbi, REQ_TIME);
|
f2fs_update_time(sbi, REQ_TIME);
|
||||||
|
err:
|
||||||
return block_page_mkwrite_return(err);
|
return block_page_mkwrite_return(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -310,6 +316,8 @@ static int f2fs_do_sync_file(struct file *file, loff_t start, loff_t end,
|
||||||
|
|
||||||
int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
|
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);
|
return f2fs_do_sync_file(file, start, end, datasync, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -446,6 +454,9 @@ static int f2fs_file_mmap(struct file *file, struct vm_area_struct *vma)
|
||||||
struct inode *inode = file_inode(file);
|
struct inode *inode = file_inode(file);
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
if (unlikely(f2fs_cp_error(F2FS_I_SB(inode))))
|
||||||
|
return -EIO;
|
||||||
|
|
||||||
/* we don't need to use inline_data strictly */
|
/* we don't need to use inline_data strictly */
|
||||||
err = f2fs_convert_inline_inode(inode);
|
err = f2fs_convert_inline_inode(inode);
|
||||||
if (err)
|
if (err)
|
||||||
|
@ -632,6 +643,9 @@ int f2fs_truncate(struct inode *inode)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
if (unlikely(f2fs_cp_error(F2FS_I_SB(inode))))
|
||||||
|
return -EIO;
|
||||||
|
|
||||||
if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
|
if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
|
||||||
S_ISLNK(inode->i_mode)))
|
S_ISLNK(inode->i_mode)))
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -731,6 +745,9 @@ int f2fs_setattr(struct dentry *dentry, struct iattr *attr)
|
||||||
int err;
|
int err;
|
||||||
bool size_changed = false;
|
bool size_changed = false;
|
||||||
|
|
||||||
|
if (unlikely(f2fs_cp_error(F2FS_I_SB(inode))))
|
||||||
|
return -EIO;
|
||||||
|
|
||||||
err = setattr_prepare(dentry, attr);
|
err = setattr_prepare(dentry, attr);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
@ -1459,6 +1476,9 @@ static long f2fs_fallocate(struct file *file, int mode,
|
||||||
struct inode *inode = file_inode(file);
|
struct inode *inode = file_inode(file);
|
||||||
long ret = 0;
|
long ret = 0;
|
||||||
|
|
||||||
|
if (unlikely(f2fs_cp_error(F2FS_I_SB(inode))))
|
||||||
|
return -EIO;
|
||||||
|
|
||||||
/* f2fs only support ->fallocate for regular file */
|
/* f2fs only support ->fallocate for regular file */
|
||||||
if (!S_ISREG(inode->i_mode))
|
if (!S_ISREG(inode->i_mode))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -2637,6 +2657,9 @@ static int f2fs_ioc_fssetxattr(struct file *filp, unsigned long arg)
|
||||||
|
|
||||||
long f2fs_ioctl(struct file *filp, unsigned int cmd, 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) {
|
switch (cmd) {
|
||||||
case F2FS_IOC_GETFLAGS:
|
case F2FS_IOC_GETFLAGS:
|
||||||
return f2fs_ioc_getflags(filp, arg);
|
return f2fs_ioc_getflags(filp, arg);
|
||||||
|
@ -2694,6 +2717,9 @@ static ssize_t f2fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
|
||||||
struct blk_plug plug;
|
struct blk_plug plug;
|
||||||
ssize_t ret;
|
ssize_t ret;
|
||||||
|
|
||||||
|
if (unlikely(f2fs_cp_error(F2FS_I_SB(inode))))
|
||||||
|
return -EIO;
|
||||||
|
|
||||||
inode_lock(inode);
|
inode_lock(inode);
|
||||||
ret = generic_write_checks(iocb, from);
|
ret = generic_write_checks(iocb, from);
|
||||||
if (ret > 0) {
|
if (ret > 0) {
|
||||||
|
|
|
@ -177,6 +177,9 @@ static int f2fs_create(struct inode *dir, struct dentry *dentry, umode_t mode,
|
||||||
nid_t ino = 0;
|
nid_t ino = 0;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
if (unlikely(f2fs_cp_error(sbi)))
|
||||||
|
return -EIO;
|
||||||
|
|
||||||
err = dquot_initialize(dir);
|
err = dquot_initialize(dir);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
@ -221,6 +224,9 @@ static int f2fs_link(struct dentry *old_dentry, struct inode *dir,
|
||||||
struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
|
struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
if (unlikely(f2fs_cp_error(sbi)))
|
||||||
|
return -EIO;
|
||||||
|
|
||||||
if (f2fs_encrypted_inode(dir) &&
|
if (f2fs_encrypted_inode(dir) &&
|
||||||
!fscrypt_has_permitted_context(dir, inode))
|
!fscrypt_has_permitted_context(dir, inode))
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
|
@ -420,6 +426,9 @@ static int f2fs_unlink(struct inode *dir, struct dentry *dentry)
|
||||||
|
|
||||||
trace_f2fs_unlink_enter(dir, dentry);
|
trace_f2fs_unlink_enter(dir, dentry);
|
||||||
|
|
||||||
|
if (unlikely(f2fs_cp_error(sbi)))
|
||||||
|
return -EIO;
|
||||||
|
|
||||||
err = dquot_initialize(dir);
|
err = dquot_initialize(dir);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
@ -475,6 +484,9 @@ static int f2fs_symlink(struct inode *dir, struct dentry *dentry,
|
||||||
struct fscrypt_symlink_data *sd = NULL;
|
struct fscrypt_symlink_data *sd = NULL;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
if (unlikely(f2fs_cp_error(sbi)))
|
||||||
|
return -EIO;
|
||||||
|
|
||||||
if (f2fs_encrypted_inode(dir)) {
|
if (f2fs_encrypted_inode(dir)) {
|
||||||
err = fscrypt_get_encryption_info(dir);
|
err = fscrypt_get_encryption_info(dir);
|
||||||
if (err)
|
if (err)
|
||||||
|
@ -581,6 +593,9 @@ static int f2fs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
|
||||||
struct inode *inode;
|
struct inode *inode;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
if (unlikely(f2fs_cp_error(sbi)))
|
||||||
|
return -EIO;
|
||||||
|
|
||||||
err = dquot_initialize(dir);
|
err = dquot_initialize(dir);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
@ -633,6 +648,9 @@ static int f2fs_mknod(struct inode *dir, struct dentry *dentry,
|
||||||
struct inode *inode;
|
struct inode *inode;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
|
if (unlikely(f2fs_cp_error(sbi)))
|
||||||
|
return -EIO;
|
||||||
|
|
||||||
err = dquot_initialize(dir);
|
err = dquot_initialize(dir);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
@ -727,6 +745,9 @@ static int __f2fs_tmpfile(struct inode *dir, struct dentry *dentry,
|
||||||
|
|
||||||
static int f2fs_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode)
|
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)) {
|
if (f2fs_encrypted_inode(dir)) {
|
||||||
int err = fscrypt_get_encryption_info(dir);
|
int err = fscrypt_get_encryption_info(dir);
|
||||||
if (err)
|
if (err)
|
||||||
|
@ -738,6 +759,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)
|
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);
|
return __f2fs_tmpfile(dir, NULL, S_IFCHR | WHITEOUT_MODE, whiteout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -757,6 +781,9 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,
|
||||||
bool is_old_inline = f2fs_has_inline_dentry(old_dir);
|
bool is_old_inline = f2fs_has_inline_dentry(old_dir);
|
||||||
int err = -ENOENT;
|
int err = -ENOENT;
|
||||||
|
|
||||||
|
if (unlikely(f2fs_cp_error(sbi)))
|
||||||
|
return -EIO;
|
||||||
|
|
||||||
if ((f2fs_encrypted_inode(old_dir) &&
|
if ((f2fs_encrypted_inode(old_dir) &&
|
||||||
!fscrypt_has_encryption_key(old_dir)) ||
|
!fscrypt_has_encryption_key(old_dir)) ||
|
||||||
(f2fs_encrypted_inode(new_dir) &&
|
(f2fs_encrypted_inode(new_dir) &&
|
||||||
|
@ -950,6 +977,9 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry,
|
||||||
int old_nlink = 0, new_nlink = 0;
|
int old_nlink = 0, new_nlink = 0;
|
||||||
int err = -ENOENT;
|
int err = -ENOENT;
|
||||||
|
|
||||||
|
if (unlikely(f2fs_cp_error(sbi)))
|
||||||
|
return -EIO;
|
||||||
|
|
||||||
if ((f2fs_encrypted_inode(old_dir) &&
|
if ((f2fs_encrypted_inode(old_dir) &&
|
||||||
!fscrypt_has_encryption_key(old_dir)) ||
|
!fscrypt_has_encryption_key(old_dir)) ||
|
||||||
(f2fs_encrypted_inode(new_dir) &&
|
(f2fs_encrypted_inode(new_dir) &&
|
||||||
|
|
|
@ -859,6 +859,9 @@ int f2fs_sync_fs(struct super_block *sb, int sync)
|
||||||
struct f2fs_sb_info *sbi = F2FS_SB(sb);
|
struct f2fs_sb_info *sbi = F2FS_SB(sb);
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
|
if (unlikely(f2fs_cp_error(sbi)))
|
||||||
|
return 0;
|
||||||
|
|
||||||
trace_f2fs_sync_fs(sb, sync);
|
trace_f2fs_sync_fs(sb, sync);
|
||||||
|
|
||||||
if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING)))
|
if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING)))
|
||||||
|
|
Loading…
Reference in a new issue